From fc554a43712b76d16b41ec77dd311b4a78b1ef6b Mon Sep 17 00:00:00 2001 From: kramm Date: Thu, 18 Oct 2001 10:31:20 +0000 Subject: Initial revision --- AUTHORS | 2 + COPYING | 340 ++++ ChangeLog | 10 + INSTALL | 182 +++ Makefile.am | 1 + Makefile.in | 361 +++++ NEWS | 0 README | 0 TODO | 46 + aclocal.m4 | 127 ++ config.h.in | 116 ++ configure | 3369 +++++++++++++++++++++++++++++++++++++++ configure.in | 62 + install-sh | 251 +++ lib/Makefile.am | 3 + lib/Makefile.in | 181 +++ lib/example/box.c | 305 ++++ lib/example/jpegtest.c | 124 ++ lib/example/shape1.c | 86 + lib/example/texbox.c | 367 +++++ lib/example/texbox_ac.c | 374 +++++ lib/example/transtest.c | 350 ++++ lib/log.c | 252 +++ lib/log.h | 39 + lib/modules/swfbits.c | 152 ++ lib/modules/swfbutton.c | 92 ++ lib/modules/swfcgi.c | 179 +++ lib/modules/swfdump.c | 131 ++ lib/modules/swfobject.c | 59 + lib/modules/swfshape.c | 523 ++++++ lib/modules/swftext.c | 503 ++++++ lib/modules/swftools.c | 260 +++ lib/rfxswf.c | 809 ++++++++++ lib/rfxswf.h | 439 +++++ missing | 190 +++ mkinstalldirs | 40 + pdf2swf/Makefile.am | 10 + pdf2swf/Makefile.in | 467 ++++++ pdf2swf/SWFOutputDev.cc | 1104 +++++++++++++ pdf2swf/SWFOutputDev.h | 17 + pdf2swf/args.h | 63 + pdf2swf/fonts/FontDataBase | 16 + pdf2swf/fonts/Makefile.am | 31 + pdf2swf/fonts/Makefile.in | 202 +++ pdf2swf/fonts/d050000l.afm | 226 +++ pdf2swf/fonts/d050000l.pfb | Bin 0 -> 45955 bytes pdf2swf/fonts/n019003l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n019003l.pfb | Bin 0 -> 36026 bytes pdf2swf/fonts/n019004l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n019004l.pfb | Bin 0 -> 35941 bytes pdf2swf/fonts/n019023l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n019023l.pfb | Bin 0 -> 38314 bytes pdf2swf/fonts/n019024l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n019024l.pfb | Bin 0 -> 39013 bytes pdf2swf/fonts/n021003l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n021003l.pfb | Bin 0 -> 46026 bytes pdf2swf/fonts/n021004l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n021004l.pfb | Bin 0 -> 44729 bytes pdf2swf/fonts/n021023l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n021023l.pfb | Bin 0 -> 45458 bytes pdf2swf/fonts/n021024l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n021024l.pfb | Bin 0 -> 44656 bytes pdf2swf/fonts/n022003l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n022003l.pfb | Bin 0 -> 45758 bytes pdf2swf/fonts/n022004l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n022004l.pfb | Bin 0 -> 50493 bytes pdf2swf/fonts/n022023l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n022023l.pfb | Bin 0 -> 44404 bytes pdf2swf/fonts/n022024l.afm | 1341 ++++++++++++++++ pdf2swf/fonts/n022024l.pfb | Bin 0 -> 51527 bytes pdf2swf/fonts/s050000l.afm | 213 +++ pdf2swf/fonts/s050000l.pfb | Bin 0 -> 33709 bytes pdf2swf/pdf2swf.1 | 37 + pdf2swf/pdf2swf.cc | 249 +++ pdf2swf/spline.cc | 140 ++ pdf2swf/spline.h | 36 + pdf2swf/swfoutput.cc | 594 +++++++ pdf2swf/swfoutput.h | 68 + pdf2swf/swfoutput_x11.cc | 249 +++ pdf2swf/xpdf/Array.cc | 51 + pdf2swf/xpdf/Array.h | 53 + pdf2swf/xpdf/Catalog.cc | 301 ++++ pdf2swf/xpdf/Catalog.h | 73 + pdf2swf/xpdf/CompactFontInfo.h | 464 ++++++ pdf2swf/xpdf/Decrypt.cc | 304 ++++ pdf2swf/xpdf/Decrypt.h | 49 + pdf2swf/xpdf/Dict.cc | 88 + pdf2swf/xpdf/Dict.h | 69 + pdf2swf/xpdf/Error.cc | 50 + pdf2swf/xpdf/Error.h | 26 + pdf2swf/xpdf/FontEncoding.cc | 143 ++ pdf2swf/xpdf/FontEncoding.h | 64 + pdf2swf/xpdf/FontFile.cc | 1633 +++++++++++++++++++ pdf2swf/xpdf/FontFile.h | 117 ++ pdf2swf/xpdf/FontInfo.h | 2068 ++++++++++++++++++++++++ pdf2swf/xpdf/FormWidget.cc | 129 ++ pdf2swf/xpdf/FormWidget.h | 65 + pdf2swf/xpdf/GString.cc | 223 +++ pdf2swf/xpdf/GString.h | 95 ++ pdf2swf/xpdf/Gfx.cc | 2107 ++++++++++++++++++++++++ pdf2swf/xpdf/Gfx.h | 234 +++ pdf2swf/xpdf/GfxFont.cc | 1018 ++++++++++++ pdf2swf/xpdf/GfxFont.h | 240 +++ pdf2swf/xpdf/GfxState.cc | 2271 ++++++++++++++++++++++++++ pdf2swf/xpdf/GfxState.h | 937 +++++++++++ pdf2swf/xpdf/Lexer.cc | 468 ++++++ pdf2swf/xpdf/Lexer.h | 72 + pdf2swf/xpdf/Link.cc | 630 ++++++++ pdf2swf/xpdf/Link.h | 336 ++++ pdf2swf/xpdf/Makefile.am | 11 + pdf2swf/xpdf/Makefile.in | 330 ++++ pdf2swf/xpdf/Object.cc | 220 +++ pdf2swf/xpdf/Object.h | 300 ++++ pdf2swf/xpdf/OutputDev.cc | 93 ++ pdf2swf/xpdf/OutputDev.h | 140 ++ pdf2swf/xpdf/PDFDoc.cc | 251 +++ pdf2swf/xpdf/PDFDoc.h | 125 ++ pdf2swf/xpdf/Page.cc | 245 +++ pdf2swf/xpdf/Page.h | 114 ++ pdf2swf/xpdf/Params.cc | 87 + pdf2swf/xpdf/Params.h | 37 + pdf2swf/xpdf/Parser.cc | 209 +++ pdf2swf/xpdf/Parser.h | 56 + pdf2swf/xpdf/StdFontInfo.h | 546 +++++++ pdf2swf/xpdf/Stream-CCITT.h | 459 ++++++ pdf2swf/xpdf/Stream.cc | 3449 ++++++++++++++++++++++++++++++++++++++++ pdf2swf/xpdf/Stream.h | 723 +++++++++ pdf2swf/xpdf/XRef.cc | 592 +++++++ pdf2swf/xpdf/XRef.h | 112 ++ pdf2swf/xpdf/config.h | 115 ++ pdf2swf/xpdf/gfile.cc | 643 ++++++++ pdf2swf/xpdf/gfile.h | 132 ++ pdf2swf/xpdf/gmem.c | 203 +++ pdf2swf/xpdf/gmem.h | 54 + pdf2swf/xpdf/gtypes.h | 29 + release.in | 167 ++ src/Makefile.am | 13 + src/Makefile.in | 383 +++++ src/args.h | 63 + src/bitio.c | 187 +++ src/bitio.h | 51 + src/combine.c | 398 +++++ src/combine.h | 14 + src/flash.c | 528 ++++++ src/flash.h | 196 +++ src/reloc.c | 285 ++++ src/reloc.h | 14 + src/settings.h | 26 + src/swfcombine.1 | 83 + src/swfcombine.c | 431 +++++ src/swfdump.1 | 23 + src/swfdump.c | 109 ++ src/swfstrings.1 | 24 + src/swfstrings.c | 54 + src/types.h | 33 + stamp-h.in | 1 + 156 files changed, 56875 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100644 aclocal.m4 create mode 100644 config.h.in create mode 100755 configure create mode 100644 configure.in create mode 100755 install-sh create mode 100644 lib/Makefile.am create mode 100644 lib/Makefile.in create mode 100644 lib/example/box.c create mode 100644 lib/example/jpegtest.c create mode 100644 lib/example/shape1.c create mode 100644 lib/example/texbox.c create mode 100644 lib/example/texbox_ac.c create mode 100644 lib/example/transtest.c create mode 100644 lib/log.c create mode 100644 lib/log.h create mode 100644 lib/modules/swfbits.c create mode 100644 lib/modules/swfbutton.c create mode 100644 lib/modules/swfcgi.c create mode 100644 lib/modules/swfdump.c create mode 100644 lib/modules/swfobject.c create mode 100644 lib/modules/swfshape.c create mode 100644 lib/modules/swftext.c create mode 100644 lib/modules/swftools.c create mode 100644 lib/rfxswf.c create mode 100644 lib/rfxswf.h create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 pdf2swf/Makefile.am create mode 100644 pdf2swf/Makefile.in create mode 100644 pdf2swf/SWFOutputDev.cc create mode 100644 pdf2swf/SWFOutputDev.h create mode 100644 pdf2swf/args.h create mode 100644 pdf2swf/fonts/FontDataBase create mode 100644 pdf2swf/fonts/Makefile.am create mode 100644 pdf2swf/fonts/Makefile.in create mode 100644 pdf2swf/fonts/d050000l.afm create mode 100644 pdf2swf/fonts/d050000l.pfb create mode 100644 pdf2swf/fonts/n019003l.afm create mode 100644 pdf2swf/fonts/n019003l.pfb create mode 100644 pdf2swf/fonts/n019004l.afm create mode 100644 pdf2swf/fonts/n019004l.pfb create mode 100644 pdf2swf/fonts/n019023l.afm create mode 100644 pdf2swf/fonts/n019023l.pfb create mode 100644 pdf2swf/fonts/n019024l.afm create mode 100644 pdf2swf/fonts/n019024l.pfb create mode 100644 pdf2swf/fonts/n021003l.afm create mode 100644 pdf2swf/fonts/n021003l.pfb create mode 100644 pdf2swf/fonts/n021004l.afm create mode 100644 pdf2swf/fonts/n021004l.pfb create mode 100644 pdf2swf/fonts/n021023l.afm create mode 100644 pdf2swf/fonts/n021023l.pfb create mode 100644 pdf2swf/fonts/n021024l.afm create mode 100644 pdf2swf/fonts/n021024l.pfb create mode 100644 pdf2swf/fonts/n022003l.afm create mode 100644 pdf2swf/fonts/n022003l.pfb create mode 100644 pdf2swf/fonts/n022004l.afm create mode 100644 pdf2swf/fonts/n022004l.pfb create mode 100644 pdf2swf/fonts/n022023l.afm create mode 100644 pdf2swf/fonts/n022023l.pfb create mode 100644 pdf2swf/fonts/n022024l.afm create mode 100644 pdf2swf/fonts/n022024l.pfb create mode 100644 pdf2swf/fonts/s050000l.afm create mode 100644 pdf2swf/fonts/s050000l.pfb create mode 100644 pdf2swf/pdf2swf.1 create mode 100644 pdf2swf/pdf2swf.cc create mode 100644 pdf2swf/spline.cc create mode 100644 pdf2swf/spline.h create mode 100644 pdf2swf/swfoutput.cc create mode 100644 pdf2swf/swfoutput.h create mode 100644 pdf2swf/swfoutput_x11.cc create mode 100644 pdf2swf/xpdf/Array.cc create mode 100644 pdf2swf/xpdf/Array.h create mode 100644 pdf2swf/xpdf/Catalog.cc create mode 100644 pdf2swf/xpdf/Catalog.h create mode 100644 pdf2swf/xpdf/CompactFontInfo.h create mode 100644 pdf2swf/xpdf/Decrypt.cc create mode 100644 pdf2swf/xpdf/Decrypt.h create mode 100644 pdf2swf/xpdf/Dict.cc create mode 100644 pdf2swf/xpdf/Dict.h create mode 100644 pdf2swf/xpdf/Error.cc create mode 100644 pdf2swf/xpdf/Error.h create mode 100644 pdf2swf/xpdf/FontEncoding.cc create mode 100644 pdf2swf/xpdf/FontEncoding.h create mode 100644 pdf2swf/xpdf/FontFile.cc create mode 100644 pdf2swf/xpdf/FontFile.h create mode 100644 pdf2swf/xpdf/FontInfo.h create mode 100644 pdf2swf/xpdf/FormWidget.cc create mode 100644 pdf2swf/xpdf/FormWidget.h create mode 100644 pdf2swf/xpdf/GString.cc create mode 100644 pdf2swf/xpdf/GString.h create mode 100644 pdf2swf/xpdf/Gfx.cc create mode 100644 pdf2swf/xpdf/Gfx.h create mode 100644 pdf2swf/xpdf/GfxFont.cc create mode 100644 pdf2swf/xpdf/GfxFont.h create mode 100644 pdf2swf/xpdf/GfxState.cc create mode 100644 pdf2swf/xpdf/GfxState.h create mode 100644 pdf2swf/xpdf/Lexer.cc create mode 100644 pdf2swf/xpdf/Lexer.h create mode 100644 pdf2swf/xpdf/Link.cc create mode 100644 pdf2swf/xpdf/Link.h create mode 100644 pdf2swf/xpdf/Makefile.am create mode 100644 pdf2swf/xpdf/Makefile.in create mode 100644 pdf2swf/xpdf/Object.cc create mode 100644 pdf2swf/xpdf/Object.h create mode 100644 pdf2swf/xpdf/OutputDev.cc create mode 100644 pdf2swf/xpdf/OutputDev.h create mode 100644 pdf2swf/xpdf/PDFDoc.cc create mode 100644 pdf2swf/xpdf/PDFDoc.h create mode 100644 pdf2swf/xpdf/Page.cc create mode 100644 pdf2swf/xpdf/Page.h create mode 100644 pdf2swf/xpdf/Params.cc create mode 100644 pdf2swf/xpdf/Params.h create mode 100644 pdf2swf/xpdf/Parser.cc create mode 100644 pdf2swf/xpdf/Parser.h create mode 100644 pdf2swf/xpdf/StdFontInfo.h create mode 100644 pdf2swf/xpdf/Stream-CCITT.h create mode 100644 pdf2swf/xpdf/Stream.cc create mode 100644 pdf2swf/xpdf/Stream.h create mode 100644 pdf2swf/xpdf/XRef.cc create mode 100644 pdf2swf/xpdf/XRef.h create mode 100644 pdf2swf/xpdf/config.h create mode 100644 pdf2swf/xpdf/gfile.cc create mode 100644 pdf2swf/xpdf/gfile.h create mode 100644 pdf2swf/xpdf/gmem.c create mode 100644 pdf2swf/xpdf/gmem.h create mode 100644 pdf2swf/xpdf/gtypes.h create mode 100644 release.in create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/args.h create mode 100644 src/bitio.c create mode 100644 src/bitio.h create mode 100644 src/combine.c create mode 100644 src/combine.h create mode 100644 src/flash.c create mode 100644 src/flash.h create mode 100644 src/reloc.c create mode 100644 src/reloc.h create mode 100644 src/settings.h create mode 100644 src/swfcombine.1 create mode 100644 src/swfcombine.c create mode 100644 src/swfdump.1 create mode 100644 src/swfdump.c create mode 100644 src/swfstrings.1 create mode 100644 src/swfstrings.c create mode 100644 src/types.h create mode 100644 stamp-h.in diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..5e531905 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Matthias Kramm +Rainer Böhme diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..d60c31a9 --- /dev/null +++ b/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. + + + Copyright (C) + + 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) year 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. + + , 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/ChangeLog b/ChangeLog new file mode 100644 index 00000000..6a80a3b5 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,10 @@ +0.0.1: initial release +0.0.2: + * pdf2swf: Added support for pdf bitmaps, clipping, state saving/restoring, colors, + solid fill and line width. + * swfcombine: Added stacking option (-t) + * swfcombine: Small bugfixes with the command line options + * rfxswf-lib: some bugfixes concerning sprites and cgi + * swfstrings: New: Allows extraction of text from swf files + * swfdump: New: Dumps swf file information. (Only the bare essentials, though) + diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..b42a17ac --- /dev/null +++ b/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/Makefile.am b/Makefile.am new file mode 100644 index 00000000..53d88405 --- /dev/null +++ b/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = lib src pdf2swf pdf2swf diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..e0de14be --- /dev/null +++ b/Makefile.in @@ -0,0 +1,361 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 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. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +AWK = @AWK@ +CC = @CC@ +CPP = @CPP@ +CXX = @CXX@ +EXEEXT = @EXEEXT@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +LN_S = @LN_S@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ + +SUBDIRS = lib src pdf2swf pdf2swf +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = release +DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ +Makefile.am Makefile.in NEWS TODO aclocal.m4 config.h.in configure \ +configure.in install-sh missing mkinstalldirs release.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +$(ACLOCAL_M4): configure.in + cd $(srcdir) && $(ACLOCAL) + +config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +config.h: stamp-h + @if test ! -f $@; then \ + rm -f stamp-h; \ + $(MAKE) stamp-h; \ + else :; fi +stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=config.h \ + $(SHELL) ./config.status + @echo timestamp > stamp-h 2> /dev/null +$(srcdir)/config.h.in: $(srcdir)/stamp-h.in + @if test ! -f $@; then \ + rm -f $(srcdir)/stamp-h.in; \ + $(MAKE) $(srcdir)/stamp-h.in; \ + else :; fi +$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f config.h + +maintainer-clean-hdr: +release: $(top_builddir)/config.status release.in + cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +# 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. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + 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) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + 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: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && 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) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(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 + -rm -rf $(distdir) + GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; \ + cd $(distdir)/=build \ + && ../configure --srcdir=.. --prefix=$$dc_install_base \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) dist + -rm -rf $(distdir) + @banner="$(distdir).tar.gz is ready for distribution"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +distdir: $(DISTFILES) + -rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +all-recursive-am: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +install-exec-am: +install-exec: install-exec-recursive + +install-data-am: +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: +uninstall: uninstall-recursive +all-am: Makefile config.h +all-redirect: all-recursive-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-hdr clean-tags clean-generic mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-hdr distclean-tags distclean-generic clean-am + +distclean: distclean-recursive + -rm -f config.status + +maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + -rm -f config.status + +.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ +install-data-recursive uninstall-data-recursive install-exec-recursive \ +uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ +all-recursive check-recursive installcheck-recursive info-recursive \ +dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs-am \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# 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/NEWS b/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/README b/README new file mode 100644 index 00000000..e69de29b diff --git a/TODO b/TODO new file mode 100644 index 00000000..6468d2d9 --- /dev/null +++ b/TODO @@ -0,0 +1,46 @@ +Priorities: +1. Make the swfs that pdf2swf generates smaller +2. Make pdf2swf faster +3. General improvements +4. Make pdf2swf cope with more complex pdfs +5. Do some sample swfs for swfcombine +6. Cleanups in rfxswf-lib. + +Make the swfs pdf2swf generates smaller: + + * At the moment, the output of pdf2swf is a bunch of + polygons. Try using seperate shapes for each character, + and packing all shapes of a page in a font. + +Make pdf2swf cope with more complex pdfs: + + The following pdf properties are not yet dealt with: + * Links + * dashed lines + * (type 3 and truetype fonts) + +Make pdf2swf faster: + + * Embedded fonts which are used more than once are also converted more + than once. Implement a font cache, like the one in xpdf. (font->getID().num + seems to be unique for every font) + +Do some sample swfs for swfcombine: + + * Some swf for displaying other swfs frame by frame (e.g. with next/previous + buttons) would be very handy for swfs generated by pdf2swf + +General Improvements: + + * temporary file name generation is broken: pdf2swf/pdf2swf.cc, pdf2swf/xpdf/gfile.cc + * fix memory leaks + * rfxswf: modules/swfshape doesn't allow changing to fillstyle 0 + * big jpegs sometimes have wrong colors + * write manpages for swfstrings and swfdump + * --version should work in all tools. + +Cleanups in rfxswf-lib: + + * LPTAGs etc. should be TAG*s + * function names should have a prefix (rfxswf_ or swflib_ or sth.) + * GetMatrix should be named GetMATRIX, as it gets a MATRIX datatype. Same for CXFORM etc. diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000..af170a3a --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,127 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4-p4 + +dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +# Do all the work for Automake. 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. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN(AM_INIT_AUTOMAKE, +[AC_REQUIRE([AC_PROG_INSTALL]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +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 +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN(AM_SANITY_CHECK, +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# 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 conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $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" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN(AM_MISSING_PROG, +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +AC_DEFUN(AM_CONFIG_HEADER, +[AC_PREREQ([2.12]) +AC_CONFIG_HEADER([$1]) +dnl When config.status generates a header, we must update the stamp-h file. +dnl This file resides in the same directory as the config header +dnl that is generated. We must strip everything past the first ":", +dnl and everything past the last "/". +AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl +ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, +<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<>; do + case " <<$>>CONFIG_HEADERS " in + *" <<$>>am_file "*<<)>> + echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx + ;; + esac + am_indx=`expr "<<$>>am_indx" + 1` +done<<>>dnl>>) +changequote([,]))]) + diff --git a/config.h.in b/config.h.in new file mode 100644 index 00000000..b7a1e4d2 --- /dev/null +++ b/config.h.in @@ -0,0 +1,116 @@ +/* config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define if you don't have vprintf but do have _doprnt. */ +#undef HAVE_DOPRNT + +/* Define if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define if you have the vprintf function. */ +#undef HAVE_VPRINTF + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define to `long' if doesn't define. */ +#undef off_t + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if your declares struct tm. */ +#undef TM_IN_SYS_TIME + +/* Define if you have the getcwd function. */ +#undef HAVE_GETCWD + +/* Define if you have the getpagesize function. */ +#undef HAVE_GETPAGESIZE + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the socket function. */ +#undef HAVE_SOCKET + +/* Define if you have the strcspn function. */ +#undef HAVE_STRCSPN + +/* Define if you have the strdup function. */ +#undef HAVE_STRDUP + +/* Define if you have the strerror function. */ +#undef HAVE_STRERROR + +/* Define if you have the strstr function. */ +#undef HAVE_STRSTR + +/* Define if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define if you have the header file. */ +#undef HAVE_JPEGLIB_H + +/* Define if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define if you have the header file. */ +#undef HAVE_MATH_H + +/* Define if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define if you have the header file. */ +#undef HAVE_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_DIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_T1LIB_H + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the header file. */ +#undef HAVE_ZLIB_H + +/* Define if you have the X11 library (-lX11). */ +#undef HAVE_LIBX11 + +/* Define if you have the jpeg library (-ljpeg). */ +#undef HAVE_LIBJPEG + +/* Define if you have the m library (-lm). */ +#undef HAVE_LIBM + +/* Define if you have the pthread library (-lpthread). */ +#undef HAVE_LIBPTHREAD + +/* Define if you have the t1 library (-lt1). */ +#undef HAVE_LIBT1 + +/* Define if you have the z library (-lz). */ +#undef HAVE_LIBZ + +/* Name of package */ +#undef PACKAGE + +/* Version number of package */ +#undef VERSION + diff --git a/configure b/configure new file mode 100755 index 00000000..aed6b06d --- /dev/null +++ b/configure @@ -0,0 +1,3369 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --with-x use the X Window System" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +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' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +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 + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # 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 ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$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" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) 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) + # 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 << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --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 +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$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) + 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 ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + 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 "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# 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 + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=pdf2swf/swfoutput.h + +# 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_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + 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 "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# 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 "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + +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 + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$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 +# 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" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:558: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/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 + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +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 "$ac_t""$INSTALL" 1>&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_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +echo "configure:611: checking whether build environment is sane" >&5 +# Just in case +sleep 1 +echo timestamp > conftestfile +# 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 conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $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 "configure: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" 1>&2; exit 1; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { echo "configure: error: newly created file is older than distributed files! +Check your system clock" 1>&2; exit 1; } +fi +rm -f conftest* +echo "$ac_t""yes" 1>&6 +if test "$program_transform_name" = s,x,x,; then + program_transform_name= +else + # Double any \ or $. echo might interpret backslashes. + cat <<\EOF_SED > conftestsed +s,\\,\\\\,g; s,\$,$$,g +EOF_SED + program_transform_name="`echo $program_transform_name|sed -f conftestsed`" + rm -f conftestsed +fi +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" + +# sed with no file args requires a program. +test "$program_transform_name" = "" && program_transform_name="s,x,x," + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:668: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 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 conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +PACKAGE=swftools + +VERSION=pre0.0.2 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } +fi +cat >> confdefs.h <> confdefs.h <&6 +echo "configure:714: checking for working aclocal" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal + echo "$ac_t""found" 1>&6 +else + ACLOCAL="$missing_dir/missing aclocal" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +echo "configure:727: checking for working autoconf" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$ac_t""found" 1>&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working automake""... $ac_c" 1>&6 +echo "configure:740: checking for working automake" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake + echo "$ac_t""found" 1>&6 +else + AUTOMAKE="$missing_dir/missing automake" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +echo "configure:753: checking for working autoheader" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$ac_t""found" 1>&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +echo "configure:766: checking for working makeinfo" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$ac_t""found" 1>&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$ac_t""missing" 1>&6 +fi + + +if test "$program_transform_name" = s,x,x,; then + program_transform_name= +else + # Double any \ or $. echo might interpret backslashes. + cat <<\EOF_SED > conftestsed +s,\\,\\\\,g; s,\$,$$,g +EOF_SED + program_transform_name="`echo $program_transform_name|sed -f conftestsed`" + rm -f conftestsed +fi +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" + +# sed with no file args requires a program. +test "$program_transform_name" = "" && program_transform_name="s,x,x," + + + echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 +echo "configure:800: checking for Cygwin environment" >&5 +if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_cygwin=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_cygwin=no +fi +rm -f conftest* +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_cygwin" 1>&6 +CYGWIN= +test "$ac_cv_cygwin" = yes && CYGWIN=yes + echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 +echo "configure:833: checking for mingw32 environment" >&5 +if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_mingw32=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_mingw32=no +fi +rm -f conftest* +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_mingw32" 1>&6 +MINGW32= +test "$ac_cv_mingw32" = yes && MINGW32=yes + + +echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 +echo "configure:864: checking for executable suffix" >&5 +if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$CYGWIN" = yes || test "$MINGW32" = yes; then + ac_cv_exeext=.exe +else + rm -f conftest* + echo 'int main () { return 0; }' > conftest.$ac_ext + ac_cv_exeext= + if { (eval echo configure:874: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + for file in conftest.*; do + case $file in + *.c | *.o | *.obj) ;; + *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; + esac + done + else + { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; } + fi + rm -f conftest* + test x"${ac_cv_exeext}" = x && ac_cv_exeext=no +fi +fi + +EXEEXT="" +test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext} +echo "$ac_t""${ac_cv_exeext}" 1>&6 +ac_exeext=$EXEEXT + + +export CFLAGS +CFLAGS="-O2 -fomit-frame-pointer" +export CXXFLAGS +CXXFLAGS="-O2 -fomit-frame-pointer" + for ac_prog in mawk gawk 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:904: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_AWK="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +AWK="$ac_cv_prog_AWK" +if test -n "$AWK"; then + echo "$ac_t""$AWK" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$AWK" && break +done + + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:936: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:966: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +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 $# -gt 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 + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1017: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1049: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 1060 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:1065: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:1091: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:1096: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:1124: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&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 $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1156: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1177: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1194: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1211: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + + for ac_prog in $CCC c++ g++ gcc CC cxx cc++ 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1240: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CXX="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CXX="$ac_cv_prog_CXX" +if test -n "$CXX"; then + echo "$ac_t""$CXX" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$CXX" && break +done +test -n "$CXX" || CXX="gcc" + + +echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1272: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 + +ac_ext=C +# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cxx_cross + +cat > conftest.$ac_ext << EOF + +#line 1283 "configure" +#include "confdefs.h" + +int main(){return(0);} +EOF +if { (eval echo configure:1288: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cxx_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cxx_cross=no + else + ac_cv_prog_cxx_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cxx_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6 +if test $ac_cv_prog_cxx_works = no; then + { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:1314: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 +cross_compiling=$ac_cv_prog_cxx_cross + +echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 +echo "configure:1319: checking whether we are using GNU C++" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.C <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gxx=yes +else + ac_cv_prog_gxx=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gxx" 1>&6 + +if test $ac_cv_prog_gxx = yes; then + GXX=yes +else + GXX= +fi + +ac_test_CXXFLAGS="${CXXFLAGS+set}" +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS= +echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 +echo "configure:1347: checking whether ${CXX-g++} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.cc +if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then + ac_cv_prog_cxx_g=yes +else + ac_cv_prog_cxx_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS="$ac_save_CXXFLAGS" +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi + + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1381: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:1409: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 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 conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +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 +# 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" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:1447: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/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 + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +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 "$ac_t""$INSTALL" 1>&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_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 +echo "configure:1500: checking whether ln -s works" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + ac_cv_prog_LN_S=ln +fi +fi +LN_S="$ac_cv_prog_LN_S" +if test "$ac_cv_prog_LN_S" = "ln -s"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6 +echo "configure:1522: checking for sin in -lm" >&5 +ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lm $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +echo "Error: Math library not found.";exit +fi + + echo $ac_n "checking for jpeg_write_raw_data in -ljpeg""... $ac_c" 1>&6 +echo "configure:1570: checking for jpeg_write_raw_data in -ljpeg" >&5 +ac_lib_var=`echo jpeg'_'jpeg_write_raw_data | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ljpeg $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo jpeg | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +echo "Error: The jpeg library jpeglib is required.";exit +fi + + echo $ac_n "checking for crc32 in -lz""... $ac_c" 1>&6 +echo "configure:1618: checking for crc32 in -lz" >&5 +ac_lib_var=`echo z'_'crc32 | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lz $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo z | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +echo "Error: The zlib compressiong handling library is required.";exit +fi + + echo $ac_n "checking for T1_LoadFont in -lt1""... $ac_c" 1>&6 +echo "configure:1666: checking for T1_LoadFont in -lt1" >&5 +ac_lib_var=`echo t1'_'T1_LoadFont | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lt1 $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo t1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +echo "Error: the T1lib truetype handling library is required.";exit +fi + + echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6 +echo "configure:1714: checking for pthread_create in -lpthread" >&5 +ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lpthread $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +fi + + echo $ac_n "checking for XFlush in -lX11""... $ac_c" 1>&6 +echo "configure:1761: checking for XFlush in -lX11" >&5 +ac_lib_var=`echo X11'_'XFlush | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lX11 $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo X11 | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +fi + + + + + + # If we find X, set shell vars x_includes and x_libraries to the +# paths, otherwise set no_x=yes. +# Uses ac_ vars as temps to allow command line to override cache and checks. +# --without-x overrides everything else, but does not touch the cache. +echo $ac_n "checking for X""... $ac_c" 1>&6 +echo "configure:1816: checking for X" >&5 + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + : +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else +if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=NO ac_x_libraries=NO +rm -fr conftestdir +if mkdir conftestdir; then + cd conftestdir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat > Imakefile <<'EOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case "$ac_im_incroot" in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; + esac + case "$ac_im_usrlibdir" in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; + esac + fi + cd .. + rm -fr conftestdir +fi + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1883: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + # Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done +fi +rm -f conftest* +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ + /usr/X11/lib \ + /usr/X11R6/lib \ + /usr/X11R5/lib \ + /usr/X11R4/lib \ + \ + /usr/lib/X11 \ + /usr/lib/X11R6 \ + /usr/lib/X11R5 \ + /usr/lib/X11R4 \ + \ + /usr/local/X11/lib \ + /usr/local/X11R6/lib \ + /usr/local/X11R5/lib \ + /usr/local/X11R4/lib \ + \ + /usr/local/lib/X11 \ + /usr/local/lib/X11R6 \ + /usr/local/lib/X11R5 \ + /usr/local/lib/X11R4 \ + \ + /usr/X386/lib \ + /usr/x386/lib \ + /usr/XFree86/lib/X11 \ + \ + /usr/lib \ + /usr/local/lib \ + /usr/unsupported/lib \ + /usr/athena/lib \ + /usr/local/x11r5/lib \ + /usr/lpp/Xamples/lib \ + /lib/usr/lib/X11 \ + \ + /usr/openwin/lib \ + /usr/openwin/share/lib \ + ; \ +do + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest* +fi # $ac_x_libraries = NO + +if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$ac_t""$have_x" 1>&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 +fi + + ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 +echo "configure:2050: checking for $ac_hdr that defines DIR" >&5 +if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include <$ac_hdr> +int main() { +DIR *dirp = 0; +; return 0; } +EOF +if { (eval echo configure:2063: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then +echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 +echo "configure:2088: checking for opendir in -ldir" >&5 +ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldir $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -ldir" +else + echo "$ac_t""no" 1>&6 +fi + +else +echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 +echo "configure:2129: checking for opendir in -lx" >&5 +ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lx $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lx" +else + echo "$ac_t""no" 1>&6 +fi + +fi + + echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:2171: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2184: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + 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 < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + 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 < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#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); } + +EOF +if { (eval echo configure:2251: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + + for ac_hdr in math.h fcntl.h limits.h malloc.h unistd.h memory.h zlib.h jpeglib.h t1lib.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:2278: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2288: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + + + + + echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:2319: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:2373: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + + echo $ac_n "checking for inline""... $ac_c" 1>&6 +echo "configure:2394: checking for inline" >&5 +if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_inline=$ac_kw; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done + +fi + +echo "$ac_t""$ac_cv_c_inline" 1>&6 +case "$ac_cv_c_inline" in + inline | yes) ;; + no) cat >> confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >> confdefs.h <&6 +echo "configure:2434: checking for off_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_off_t=yes +else + rm -rf conftest* + ac_cv_type_off_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_off_t" 1>&6 +if test $ac_cv_type_off_t = no; then + cat >> confdefs.h <<\EOF +#define off_t long +EOF + +fi + + echo $ac_n "checking for size_t""... $ac_c" 1>&6 +echo "configure:2467: checking for size_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_size_t=yes +else + rm -rf conftest* + ac_cv_type_size_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_size_t" 1>&6 +if test $ac_cv_type_size_t = no; then + cat >> confdefs.h <<\EOF +#define size_t unsigned +EOF + +fi + + echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 +echo "configure:2500: checking whether struct tm is in sys/time.h or time.h" >&5 +if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +int main() { +struct tm *tp; tp->tm_sec; +; return 0; } +EOF +if { (eval echo configure:2513: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_struct_tm=time.h +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_struct_tm=sys/time.h +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_struct_tm" 1>&6 +if test $ac_cv_struct_tm = sys/time.h; then + cat >> confdefs.h <<\EOF +#define TM_IN_SYS_TIME 1 +EOF + +fi + + + echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 +echo "configure:2535: checking for 8-bit clean memcmp" >&5 +if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_memcmp_clean=no +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_memcmp_clean=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_memcmp_clean=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6 +test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}" + + for ac_hdr in unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:2574: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2584: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + +for ac_func in getpagesize +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2613: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* 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(); + +int main() { + +/* 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 +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2641: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking for working mmap""... $ac_c" 1>&6 +echo "configure:2666: checking for working mmap" >&5 +if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat > conftest.$ac_ext < +#include +#include + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef HAVE_UNISTD_H +# include +# endif + +/* Assume that all systems that can run configure have sys/param.h. */ +# ifndef HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +#ifdef __cplusplus +extern "C" { void *malloc(unsigned); } +#else +char *malloc(); +#endif + +int +main() +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize(); + + /* + * First, make a file with some known garbage in it. + */ + data = malloc(pagesize); + if (!data) + exit(1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand(); + umask(0); + fd = creat("conftestmmap", 0600); + if (fd < 0) + exit(1); + if (write(fd, data, pagesize) != pagesize) + exit(1); + close(fd); + + /* + * Next, try to mmap the file at a fixed address which + * already has something else allocated at it. If we can, + * also make sure that we see the same garbage. + */ + fd = open("conftestmmap", O_RDWR); + if (fd < 0) + exit(1); + data2 = malloc(2 * pagesize); + if (!data2) + exit(1); + data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit(1); + + /* + * Finally, make sure that changes to the mapped area + * do not percolate back to the file as seen by read(). + * (This is a bug on some variants of i386 svr4.0.) + */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = malloc(pagesize); + if (!data3) + exit(1); + if (read(fd, data3, pagesize) != pagesize) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit(1); + close(fd); + unlink("conftestmmap"); + exit(0); +} + +EOF +if { (eval echo configure:2814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_mmap_fixed_mapped=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_MMAP 1 +EOF + +fi + + echo $ac_n "checking for vprintf""... $ac_c" 1>&6 +echo "configure:2837: checking for vprintf" >&5 +if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char vprintf(); + +int main() { + +/* 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_vprintf) || defined (__stub___vprintf) +choke me +#else +vprintf(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2865: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_vprintf=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_vprintf=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_VPRINTF 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +if test "$ac_cv_func_vprintf" != yes; then +echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 +echo "configure:2889: checking for _doprnt" >&5 +if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _doprnt(); + +int main() { + +/* 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__doprnt) || defined (__stub____doprnt) +choke me +#else +_doprnt(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func__doprnt=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func__doprnt=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_DOPRNT 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +fi + + for ac_func in getcwd putenv socket strcspn strdup strerror strstr +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2944: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* 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(); + +int main() { + +/* 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 +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2972: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + +trap '' 1 2 15 +cat > confcache <<\EOF +# 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. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# 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 \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "./release Makefile lib/Makefile src/Makefile pdf2swf/Makefile pdf2swf/xpdf/Makefile pdf2swf/fonts/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@PACKAGE@%$PACKAGE%g +s%@VERSION@%$VERSION%g +s%@ACLOCAL@%$ACLOCAL%g +s%@AUTOCONF@%$AUTOCONF%g +s%@AUTOMAKE@%$AUTOMAKE%g +s%@AUTOHEADER@%$AUTOHEADER%g +s%@MAKEINFO@%$MAKEINFO%g +s%@SET_MAKE@%$SET_MAKE%g +s%@EXEEXT@%$EXEEXT%g +s%@AWK@%$AWK%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@CXX@%$CXX%g +s%@RANLIB@%$RANLIB%g +s%@LN_S@%$LN_S%g +s%@HAVE_UNISTD_H@%$HAVE_UNISTD_H%g +s%@LIBOBJS@%$LIBOBJS%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# 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_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # 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" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# 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='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. 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.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# 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.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/configure.in b/configure.in new file mode 100644 index 00000000..04e6f447 --- /dev/null +++ b/configure.in @@ -0,0 +1,62 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(pdf2swf/swfoutput.h) +AM_INIT_AUTOMAKE(swftools, pre0.0.2) +AC_ARG_PROGRAM + +dnl Checks for system services + AC_CYGWIN + AC_EXEEXT + +export CFLAGS +CFLAGS="-O2 -fomit-frame-pointer" +export CXXFLAGS +CXXFLAGS="-O2 -fomit-frame-pointer" +dnl Checks for programs. + AC_PROG_AWK + AC_PROG_CC + AC_PROG_CPP + AC_PROG_CXX + AC_PROG_RANLIB + AC_PROG_MAKE_SET + AC_PROG_INSTALL + AC_PROG_LN_S + +dnl Checks for libraries. + AC_CHECK_LIB(m, sin,, echo "Error: Math library not found.";exit) + AC_CHECK_LIB(jpeg, jpeg_write_raw_data,, echo "Error: The jpeg library jpeglib is required.";exit) + AC_CHECK_LIB(z, crc32,, echo "Error: The zlib compressiong handling library is required.";exit) + AC_CHECK_LIB(t1, T1_LoadFont,,echo "Error: the T1lib truetype handling library is required.";exit) +dnl do we need those? + AC_CHECK_LIB(pthread, pthread_create) + AC_CHECK_LIB(X11, XFlush) + +dnl Checks for header files. +AM_CONFIG_HEADER(config.h) + AC_PATH_X +dnl AC_PATH_XTRA + AC_HEADER_DIRENT + AC_HEADER_STDC + AC_CHECK_HEADERS(math.h fcntl.h limits.h malloc.h unistd.h memory.h zlib.h jpeglib.h t1lib.h) + +AC_SUBST(HAVE_UNISTD_H) +AC_SUBST(EXEEXT) + +dnl Checks for typedefs, structures, and compiler characteristics. + AC_C_CONST + AC_C_INLINE + AC_TYPE_OFF_T + AC_TYPE_SIZE_T + AC_STRUCT_TM +dnl AC_CHECK_TYPE(uchar,unsigned char) +dnl AC_CHECK_TYPE(schar,signed char) +dnl AC_CHECK_TYPE(word,unsigned short int) +dnl AC_CHECK_TYPE(sword,unsigned short int) +dnl AC_CHECK_TYPE(uint,unsigned long int) + +dnl Checks for library functions. + AC_FUNC_MEMCMP + AC_FUNC_MMAP + AC_FUNC_VPRINTF + AC_CHECK_FUNCS(getcwd putenv socket strcspn strdup strerror strstr) + +AC_OUTPUT(./release Makefile lib/Makefile src/Makefile pdf2swf/Makefile pdf2swf/xpdf/Makefile pdf2swf/fonts/Makefile) diff --git a/install-sh b/install-sh new file mode 100755 index 00000000..e9de2384 --- /dev/null +++ b/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/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 00000000..1e2da91b --- /dev/null +++ b/lib/Makefile.am @@ -0,0 +1,3 @@ +all: + gcc -c rfxswf.c + gcc -c log.c diff --git a/lib/Makefile.in b/lib/Makefile.in new file mode 100644 index 00000000..0a7c957f --- /dev/null +++ b/lib/Makefile.in @@ -0,0 +1,181 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 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. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +AWK = @AWK@ +CC = @CC@ +CPP = @CPP@ +CXX = @CXX@ +EXEEXT = @EXEEXT@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +LN_S = @LN_S@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = lib + +distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu lib/Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: tags distdir info-am info dvi-am dvi check check-am \ +installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +all: + gcc -c rfxswf.c + gcc -c log.c + +# 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/lib/example/box.c b/lib/example/box.c new file mode 100644 index 00000000..5b10d4b4 --- /dev/null +++ b/lib/example/box.c @@ -0,0 +1,305 @@ + +// linux/gcc: cc box.c ../rfxswf.c -funsigned-char -o box -lm; cp box /home/www/cgi-bin/box + +#include +#include +#include +#include "../rfxswf.h" + +// Box + +#define BANNER_TEXT "reflex" +#define ID_FONT 2000 +#define ID_BANNER 2001 +#define ID_HIGHLIGHT 2002 +#define ID_BUTTON 2003 + +#define a 200 +int sX[] = { a,-a, a,-a, a,-a, a,-a}; +int sY[] = { a, a,-a,-a, a, a,-a,-a}; +int sZ[] = { a, a, a, a,-a,-a,-a,-a}; +#undef a + +int dX[8]; +int dY[8]; + +int sin_[512],cos_[512]; + +void calcTables() +{ int i; + double d; + for (i=0;i<512;i++) + { d = ((double)i)/128*3.14159; + sin_[i] = (int)(sin(d)*256); + cos_[i] = (int)(cos(d)*256); + } +} + +void ShapeSquare(LPTAG t,LPSHAPE s,int p1,int p2,int p3,int p4,int dx,int dy) +{ + // Hidden-Line-Check + if (((dX[p2]-dX[p1])*(dY[p3]-dY[p1])-(dX[p3]-dX[p1])*(dY[p2]-dY[p1]))<0) return; + + ShapeSetMove(t,s,dX[p1]+dx,dY[p1]+dy); + ShapeSetLine(t,s,dX[p2]-dX[p1],dY[p2]-dY[p1]); + ShapeSetLine(t,s,dX[p3]-dX[p2],dY[p3]-dY[p2]); + ShapeSetLine(t,s,dX[p4]-dX[p3],dY[p4]-dY[p3]); + ShapeSetLine(t,s,dX[p1]-dX[p4],dY[p1]-dY[p4]); +} + + +void mapBox(int xw,int yw,int zw) +{ int i; + int x1,y1,z1,x2,y2,z2,x3,y3,z3; + int y,x,z; + + xw &= 255; + yw &= 255; + zw &= 255; + + for (i=0;i<8;i++) + { x = sX[i]; + y = sY[i]; + z = sZ[i]; + + y1 = ( y*cos_[xw]- z*sin_[xw])>>8; + z1 = ( y*sin_[xw]+ z*cos_[xw])>>8; + x1 = x; + + x2 = (x1*cos_[yw]+z1*sin_[yw])>>8; + y2 = y1; + + x3 = (x2*cos_[zw]-y2*sin_[zw])>>8; + y3 = (x2*sin_[zw]+y2*cos_[zw])>>8; + z3 = (z1*cos_[yw]-x1*sin_[yw])>>8; + + dX[i] = x3*4000/(z3+950); + dY[i] = y3*4000/(z3+950); + + } +} + +int main (int argc,char ** argv) +{ SWF swf; + LPTAG t; + RGBA rgb; + SRECT r; + LPSHAPE s; + S32 width = 800,height = 800; + U8 gbits,abits; + LPSWFFONT font; + FONTUSAGE use; + CXFORM cx1,cx2; + MATRIX m; + + int f,i,j,frame; + +/* f = open("Arial.efont",O_RDONLY); + if (f>=0) + { if (FAILED(FontImport(f,&font))) + { fprintf(stderr,"Font import failed\n"); + close(f); + return -1; + } + } + else + { fprintf(stderr,"Font not found\n"); + return -1; + } + close(f); + + FontSetID(font,ID_FONT); + FontInitUsage(&use); + FontUse(&use,BANNER_TEXT); + FontReduce(font,&use);*/ + + calcTables(); + + memset(&swf,0x00,sizeof(SWF)); + + swf.FileVersion = 4; + swf.FrameRate = 0x4000; + swf.MovieSize.xmax = 4*width; + swf.MovieSize.ymax = 4*height; + + swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + t = swf.FirstTag; + + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + SetRGB(t,&rgb); + + t = InsertTag(t,ST_DEFINEFONT); + + FontSetDefine(t,font); + + t = InsertTag(t,ST_DEFINEFONTINFO); + + FontSetInfo(t,font); + + t = InsertTag(t,ST_DEFINETEXT); + + SetU16(t,ID_BANNER); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 400; + r.ymax = 400; + SetRect(t,&r); + + SetMatrix(t,NULL); + + TextCountBits(font,BANNER_TEXT,80,&gbits,&abits); + + SetU8(t,gbits); + SetU8(t,abits); + + rgb.r = 0xc0; + rgb.g = 0xc0; + rgb.b = 0xc0; + + TextSetInfoRecord(t,font,height/4,&rgb,0,200); + TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits); + + SetU8(t,0); + + t = InsertTag(t,ST_DEFINETEXT); + + SetU16(t,ID_HIGHLIGHT); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 800; + r.ymax = 400; + SetRect(t,&r); + + SetMatrix(t,NULL); + + TextCountBits(font,BANNER_TEXT,80,&gbits,&abits); + + SetU8(t,gbits); + SetU8(t,abits); + + rgb.r = 0x20; + rgb.g = 0x20; + rgb.b = 0x20; + + TextSetInfoRecord(t,font,height/4,&rgb,0,200); + TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits); + + SetU8(t,0); + + t = InsertTag(t,ST_DEFINEBUTTON); + + GetMatrix(NULL,&m); + + m.tx = 3*width; + m.ty = 7*height/2; + + SetU16(t,ID_BUTTON); // ID + ButtonSetRecord(t,BS_UP,ID_BANNER,1,&m,NULL); + ButtonSetRecord(t,BS_DOWN|BS_HIT|BS_OVER,ID_HIGHLIGHT,1,&m,NULL); + SetU8(t,0); // End of Button Records + SetU8(t,0); // End of Action Records + + + t = InsertTag(t,ST_PLACEOBJECT2); + + ObjectPlace(t,ID_BUTTON,1,NULL,NULL,NULL); + + GetCXForm(NULL,&cx1,1); + GetCXForm(NULL,&cx2,1); + +// cx1.a1 = -(0x40*1); +// cx2.a1 = -(0x40*2); + + cx1.r1 = cx1.g1 = 0x80; + cx2.r1 = cx2.g1 = 0xc0; + + + + for (frame=0;frame<256;frame+=2) + { int id = frame +1; + + t = InsertTag(t,ST_DEFINESHAPE); + + NewShape(&s); + rgb.r = rgb.g = 0x00; rgb.b = 0xff; + j = ShapeAddLineStyle(s,40,&rgb); + + SetU16(t,id); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 4*width; + r.ymax = 4*height; + + SetRect(t,&r); + + SetShapeStyles(t,s); + ShapeCountBits(s,NULL,NULL); + SetShapeBits(t,s); + + ShapeSetAll(t,s,0,0,j,0,0); + + mapBox(frame,frame,frame>>1); + + ShapeSquare(t,s,0,2,3,1,2*width,2*height); + ShapeSquare(t,s,4,5,7,6,2*width,2*height); + ShapeSquare(t,s,0,4,6,2,2*width,2*height); + ShapeSquare(t,s,1,3,7,5,2*width,2*height); + ShapeSquare(t,s,0,1,5,4,2*width,2*height); + ShapeSquare(t,s,2,6,7,3,2*width,2*height); + + ShapeSetEnd(t); + } + + for (frame=0;frame<256;frame+=2) + { int id = frame +1; + int id2 = ((frame-2)&255)+1; + int id3 = ((frame-4)&255)+1; + + if (frame) + { t = InsertTag(t,ST_REMOVEOBJECT2); SetU16(t,2); // depth + t = InsertTag(t,ST_REMOVEOBJECT2); SetU16(t,3); // depth + t = InsertTag(t,ST_REMOVEOBJECT2); SetU16(t,4); // depth + } + + t = InsertTag(t,ST_PLACEOBJECT2); + + ObjectPlace(t,id,4,NULL,NULL,NULL); + + t = InsertTag(t,ST_PLACEOBJECT2); + + ObjectPlace(t,id2,3,NULL,&cx1,NULL); + + t = InsertTag(t,ST_PLACEOBJECT2); + + ObjectPlace(t,id3,2,NULL,&cx2,NULL); + + + t = InsertTag(t,ST_SHOWFRAME); + } + + + + t = InsertTag(t,ST_END); + +// WriteCGI(&swf); + + + f = open("shape1.swf",O_RDWR|O_CREAT|O_TRUNC); + if FAILED(WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + + FreeTags(&swf); + +#ifdef __NT__ + system("start ..\\shape1.swf"); +#endif + + return 0; +} + + diff --git a/lib/example/jpegtest.c b/lib/example/jpegtest.c new file mode 100644 index 00000000..76eb1ea6 --- /dev/null +++ b/lib/example/jpegtest.c @@ -0,0 +1,124 @@ +// linux/gcc cc jpegtest.c ../rfxswf.c -funsigned-char -o jpegtest -lm -ljpeg; cp jpegtest /home/www/cgi-bin/jpegtest + +#include +#include +#include "../rfxswf.h" + +#define WIDTH 256 +#define HEIGHT 256 +#define QUALITY 85 + +#define ID_BITS 1 +#define ID_SHAPE 2 + +int main ( int argc, char ** argv) +{ SWF swf; + LPTAG t; + RGBA rgb; + LPSHAPE s; + MATRIX m; + SRECT r; + LPJPEGBITS jpeg; + + int ls; // line style + int fs; // fill style + int frame; + + memset(&swf,0x00,sizeof(SWF)); + + swf.FileVersion = 4; + swf.FrameRate = 0x1800; + swf.MovieSize.xmax = 20*WIDTH; + swf.MovieSize.ymax = 20*HEIGHT; + + swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + t = swf.FirstTag; + + rgb.r = 0xff; + rgb.b = 0xff; + rgb.g = 0xff; + SetRGB(t,&rgb); + + t = InsertTag(t,ST_DEFINEBITSJPEG2); + + SetU16(t,ID_BITS); + SetJPEGBits(t,"eye.jpg",QUALITY); + +/* jpeg = SetJPEGBitsStart(t,WIDTH,HEIGHT,QUALITY); + { int y; + for (y=0;y +#include +#include +#include "../rfxswf.h" + + +int main (int argc,char ** argv) +{ SWF swf; + LPTAG t; + RGBA rgb; + SRECT r; + LPSHAPE s; + S32 width=300,height = 300; + + int f,i,j; + + memset(&swf,0x00,sizeof(SWF)); + + swf.FileVersion = 4; + swf.FrameRate = 0x1900; + swf.MovieSize.xmax = 20*width; + swf.MovieSize.ymax = 20*height; + + swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + t = swf.FirstTag; + + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + SetRGB(t,&rgb); + + t = InsertTag(t,ST_DEFINESHAPE); + + NewShape(&s); + rgb.b = rgb.g = 0x00; + j = ShapeAddLineStyle(s,40,&rgb); + rgb.r = 0; rgb.b = 0xff; + ShapeAddLineStyle(s,40,&rgb); + + SetU16(t,1); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 4*width; + r.ymax = 4*height; + + SetRect(t,&r); + + SetShapeStyles(t,s); + ShapeCountBits(s,NULL,NULL); + SetShapeBits(t,s); + + ShapeSetAll(t,s,0,0,j,0,0); +// ShapeSetCurve(t,s,4*width,0,0,4*height); + ShapeSetLine(t,s,4*width,4*height); + ShapeSetStyle(t,s,2,0,0); + for (i=1;i<10;i++) + ShapeSetCircle(t,s,4*width,4*height,i*width/2,i*height/2); + ShapeSetEnd(t); + + t = InsertTag(t,ST_PLACEOBJECT2); + + ObjectPlace(t,1,1,NULL,NULL,NULL); + + t = InsertTag(t,ST_SHOWFRAME); + + t = InsertTag(t,ST_END); + +// WriteCGI(&swf); + + + f = open("shape1.swf",O_WRONLY|O_CREAT, 0777); +// f = 1; + if FAILED(WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + + FreeTags(&swf); + +#ifdef __NT__ + system("start ..\\shape1.swf"); +#endif + + return 0; +} + + diff --git a/lib/example/texbox.c b/lib/example/texbox.c new file mode 100644 index 00000000..7685e5bb --- /dev/null +++ b/lib/example/texbox.c @@ -0,0 +1,367 @@ + +// linux/gcc: cc texbox.c ../rfxswf.c -funsigned-char -o texbox -lm -ljpeg; cp texbox /home/www/cgi-bin/texbox + +#include +#include +#include +#include "../rfxswf.h" + +// Box + +#define BANNER_TEXT "reflex" +#define QUALITY 80 +#define ID_FONT 2000 +#define ID_BANNER 2001 +#define ID_HIGHLIGHT 2002 +#define ID_BUTTON 2003 +#define ID_BITMAP 2004 +#define ID_SHAPE 2005 +#define ID_SHAPE2 2006 + +#define a 200 +int sX[] = { a,-a, a,-a, a,-a, a,-a}; +int sY[] = { a, a,-a,-a, a, a,-a,-a}; +int sZ[] = { a, a, a, a,-a,-a,-a,-a}; +#undef a + +#define PRECISION 16 + +int SHADE = 1; + +int dX[8]; +int dY[8]; +int square_visible[6] = {0,0,0,0,0,0}; +int square_depth[6][2] = {{2,3},{4,5},{6,7},{8,9},{10,11},{12,13}}; +int square_light[6] = {0,0,64,64,-64,-64}; + +int sin_[512],cos_[512]; + +void calcTables() +{ int i; + double d; + for (i=0;i<512;i++) + { d = ((double)i)/128*3.14159; + sin_[i] = (int)(sin(d)*(1<>PRECISION; + z1 = ( y*sin_[xw]+ z*cos_[xw])>>PRECISION; + x1 = x; + + x2 = (x1*cos_[yw]+z1*sin_[yw])>>PRECISION; + y2 = y1; + + x3 = (x2*cos_[zw]-y2*sin_[zw])>>PRECISION; + y3 = (x2*sin_[zw]+y2*cos_[zw])>>PRECISION; + z3 = (z1*cos_[yw]-x1*sin_[yw])>>PRECISION; + + dX[i] = x3*4000/(z3+950); + dY[i] = y3*4000/(z3+950); + + } +} + +void mapLights(int xw,int yw,int zw) +{ int i; + int x1,y1,z1,x2,y2,z2,x3,y3,z3; + + int y[] = {0,0,0,0,256,-256}; + int x[] = {0,0,256,-256,0,0}; + int z[] = {256,-256,0,0,0,0}; + + int lz = 256; // lightvector + int lx = 200, ly = 200; + + for (i=0;i<6;i++) + { y1 = (y[i]*cos_[xw]-z[i]*sin_[xw])>>PRECISION; + z1 = (y[i]*sin_[xw]+z[i]*cos_[xw])>>PRECISION; + x1 = x[i]; + + x2 = (x1*cos_[yw]+z1*sin_[yw])>>PRECISION; + y2 = y1; + z2 = (z1*cos_[yw]-x1*sin_[yw])>>PRECISION; + + x3 = (x2*cos_[zw]-y2*sin_[zw])>>PRECISION; + y3 = (x2*sin_[zw]+y2*cos_[zw])>>PRECISION; + z3 = z2; + + square_light[i] = -128-((x3*lx + y3*ly + z3*lz)>>9); + } +} + + +int main (int argc,char ** argv) +{ SWF swf; + LPTAG t; + RGBA rgb; + SRECT r; + LPSHAPE s; + S32 width = 800,height = 800; + U8 gbits,abits; + int fs,ls; // line & fillstyle + LPSWFFONT font; + FONTUSAGE use; + LPJPEGBITS jpeg; + MATRIX m; + + int f,i,j,frame; + + f = open("Arial.efont",O_RDONLY); + if (f>=0) + { if (FAILED(FontImport(f,&font))) + { fprintf(stderr,"Font import failed\n"); + close(f); + return -1; + } + } + else + { fprintf(stderr,"Font not found\n"); + return -1; + } + close(f); + + FontSetID(font,ID_FONT); + FontInitUsage(&use); + FontUse(&use,BANNER_TEXT); + FontReduce(font,&use); + + calcTables(); + + memset(&swf,0x00,sizeof(SWF)); + + swf.FileVersion = 4; + swf.FrameRate = 0x4000; + swf.MovieSize.xmax = 4*width; + swf.MovieSize.ymax = 4*height; + + swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + t = swf.FirstTag; + + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + SetRGB(t,&rgb); + + t = InsertTag(t,ST_DEFINEFONT); + + FontSetDefine(t,font); + + t = InsertTag(t,ST_DEFINEFONTINFO); + + FontSetInfo(t,font); + + t = InsertTag(t,ST_DEFINETEXT); + + SetU16(t,ID_BANNER); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 400; + r.ymax = 400; + SetRect(t,&r); + + SetMatrix(t,NULL); + + TextCountBits(font,BANNER_TEXT,80,&gbits,&abits); + + SetU8(t,gbits); + SetU8(t,abits); + + rgb.r = 0xc0; + rgb.g = 0xc0; + rgb.b = 0xc0; + + TextSetInfoRecord(t,font,height/4,&rgb,0,200); + TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits); + + SetU8(t,0); + + t = InsertTag(t,ST_DEFINETEXT); + + SetU16(t,ID_HIGHLIGHT); // ID + + r.xmin = 0; r.ymin = 0; r.xmax = 800; r.ymax = 400; + SetRect(t,&r); + + SetMatrix(t,NULL); + TextCountBits(font,BANNER_TEXT,80,&gbits,&abits); + + SetU8(t,gbits); + SetU8(t,abits); + + rgb.r = 0x20; + rgb.g = 0x20; + rgb.b = 0x20; + + TextSetInfoRecord(t,font,height/4,&rgb,0,200); + TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits); + + SetU8(t,0); + + t = InsertTag(t,ST_DEFINEBUTTON); + + GetMatrix(NULL,&m); + + m.tx = 3*width; + m.ty = 7*height/2; + + SetU16(t,ID_BUTTON); // ID + ButtonSetRecord(t,BS_UP,ID_BANNER,1,&m,NULL); + ButtonSetRecord(t,BS_DOWN|BS_HIT|BS_OVER,ID_HIGHLIGHT,1,&m,NULL); + SetU8(t,0); // End of Button Records + SetU8(t,0); // End of Action Records + + + t = InsertTag(t,ST_PLACEOBJECT2); + + ObjectPlace(t,ID_BUTTON,1,NULL,NULL,NULL); + + t = InsertTag(t,ST_DEFINEBITSJPEG2); + + SetU16(t,ID_BITMAP); + SetJPEGBits(t,"eye.jpg",QUALITY); + + t = InsertTag(t,ST_DEFINESHAPE); + + NewShape(&s); + rgb.b = rgb.g = rgb.r = 0x00; + ls = ShapeAddLineStyle(s,10,&rgb); + rgb.b = 0xff; + + m.tx = m.ty = 0; + m.r0 = m.r1 = 0; + m.sx = m.sy = width<<8; + + fs = ShapeAddBitmapFillStyle(s,&m,ID_BITMAP,0); + + SetU16(t,ID_SHAPE); // ID + + r.xmin = 0; r.ymin = 0; + r.xmax = 2*width; r.ymax = 2*height; + SetRect(t,&r); + + SetShapeHeader(t,s); + ShapeSetAll(t,s,width,0,0,fs,0); + ShapeSetLine(t,s,-width,height); + ShapeSetStyle(t,s,ls,fs,0); + ShapeSetLine(t,s,0,-height); + ShapeSetLine(t,s,width,0); + ShapeSetEnd(t); + + ShapeFree(s); + + t = InsertTag(t,ST_DEFINESHAPE); + + NewShape(&s); + rgb.b = rgb.g = rgb.r = 0x00; + ls = ShapeAddLineStyle(s,10,&rgb); + rgb.b = 0xff; + + m.tx = m.ty = 0; + m.r0 = m.r1 = 0; + m.sx = m.sy = -(width<<8); + + fs = ShapeAddBitmapFillStyle(s,&m,ID_BITMAP,0); + + SetU16(t,ID_SHAPE2); // ID + + r.xmin = 0; r.ymin = 0; + r.xmax = 2*width; r.ymax = 2*height; + SetRect(t,&r); + + SetShapeHeader(t,s); + ShapeSetAll(t,s,width,0,0,fs,0); + ShapeSetLine(t,s,-width,height); + ShapeSetStyle(t,s,ls,fs,0); + ShapeSetLine(t,s,0,-height); + ShapeSetLine(t,s,width,0); + ShapeSetEnd(t); + + ShapeFree(s); + + for (frame=0;frame<256;frame++) + { int dc = 3; // whitespace correction + + mapBox(frame<<1,frame<<1,frame); + if (SHADE) mapLights(frame<<1,frame<<1,frame); + + t = MapSquare(t,width-dc,height-dc,0,2,3,1,2*width,2*height,0); + t = MapSquare(t,width-dc,height-dc,4,5,7,6,2*width,2*height,1); + t = MapSquare(t,width-dc,height-dc,0,4,6,2,2*width,2*height,2); + t = MapSquare(t,width-dc,height-dc,1,3,7,5,2*width,2*height,3); + t = MapSquare(t,width-dc,height-dc,0,1,5,4,2*width,2*height,4); + t = MapSquare(t,width-dc,height-dc,2,6,7,3,2*width,2*height,5); + + t = InsertTag(t,ST_SHOWFRAME); + } + + + t = InsertTag(t,ST_END); + + WriteCGI(&swf); + FreeTags(&swf); + return 0; +} + + diff --git a/lib/example/texbox_ac.c b/lib/example/texbox_ac.c new file mode 100644 index 00000000..c94ec367 --- /dev/null +++ b/lib/example/texbox_ac.c @@ -0,0 +1,374 @@ + +// linux/gcc: cc texbox_ac.c ../rfxswf.c -funsigned-char -o texbox -lmingac -lm -ljpeg; cp texbox /home/www/cgi-bin/texbox + +#include +#include +#include +#include "../rfxswf.h" +#include "../mingac.h" // Action Compiler of MING library + +// Box + +#define BANNER_TEXT "reflex" +#define QUALITY 80 +#define ID_FONT 2000 +#define ID_BANNER 2001 +#define ID_HIGHLIGHT 2002 +#define ID_BUTTON 2003 +#define ID_BITMAP 2004 +#define ID_SHAPE 2005 +#define ID_SHAPE2 2006 + +#define a 200 +int sX[] = { a,-a, a,-a, a,-a, a,-a}; +int sY[] = { a, a,-a,-a, a, a,-a,-a}; +int sZ[] = { a, a, a, a,-a,-a,-a,-a}; +#undef a + +#define PRECISION 16 + +int SHADE = 1; + +int dX[8]; +int dY[8]; +int square_visible[6] = {0,0,0,0,0,0}; +int square_depth[6][2] = {{2,3},{4,5},{6,7},{8,9},{10,11},{12,13}}; +int square_light[6] = {0,0,64,64,-64,-64}; + +int sin_[512],cos_[512]; + +void calcTables() +{ int i; + double d; + for (i=0;i<512;i++) + { d = ((double)i)/128*3.14159; + sin_[i] = (int)(sin(d)*(1<>PRECISION; + z1 = ( y*sin_[xw]+ z*cos_[xw])>>PRECISION; + x1 = x; + + x2 = (x1*cos_[yw]+z1*sin_[yw])>>PRECISION; + y2 = y1; + + x3 = (x2*cos_[zw]-y2*sin_[zw])>>PRECISION; + y3 = (x2*sin_[zw]+y2*cos_[zw])>>PRECISION; + z3 = (z1*cos_[yw]-x1*sin_[yw])>>PRECISION; + + dX[i] = x3*4000/(z3+950); + dY[i] = y3*4000/(z3+950); + + } +} + +void mapLights(int xw,int yw,int zw) +{ int i; + int x1,y1,z1,x2,y2,z2,x3,y3,z3; + + int y[] = {0,0,0,0,256,-256}; + int x[] = {0,0,256,-256,0,0}; + int z[] = {256,-256,0,0,0,0}; + + int lz = 256; // lightvector + int lx = 200, ly = 200; + + for (i=0;i<6;i++) + { y1 = (y[i]*cos_[xw]-z[i]*sin_[xw])>>PRECISION; + z1 = (y[i]*sin_[xw]+z[i]*cos_[xw])>>PRECISION; + x1 = x[i]; + + x2 = (x1*cos_[yw]+z1*sin_[yw])>>PRECISION; + y2 = y1; + z2 = (z1*cos_[yw]-x1*sin_[yw])>>PRECISION; + + x3 = (x2*cos_[zw]-y2*sin_[zw])>>PRECISION; + y3 = (x2*sin_[zw]+y2*cos_[zw])>>PRECISION; + z3 = z2; + + square_light[i] = -128-((x3*lx + y3*ly + z3*lz)>>9); + } +} + + +int main (int argc,char ** argv) +{ SWF swf; + LPTAG t; + RGBA rgb; + SRECT r; + LPSHAPE s; + S32 width = 800,height = 800; + U8 gbits,abits; + int fs,ls; // line & fillstyle + LPSWFFONT font; + FONTUSAGE use; + LPJPEGBITS jpeg; + MATRIX m; + + int f,i,j,frame; + + InitCompiler(AC_DEFAULT); + + f = open("Arial.efont",O_RDONLY); + if (f>=0) + { if (FAILED(FontImport(f,&font))) + { fprintf(stderr,"Font import failed\n"); + close(f); + return -1; + } + } + else + { fprintf(stderr,"Font not found\n"); + return -1; + } + close(f); + + FontSetID(font,ID_FONT); + FontInitUsage(&use); + FontUse(&use,BANNER_TEXT); + FontReduce(font,&use); + + calcTables(); + + memset(&swf,0x00,sizeof(SWF)); + + swf.FileVersion = 4; + swf.FrameRate = 0x4000; + swf.MovieSize.xmax = 4*width; + swf.MovieSize.ymax = 4*height; + + swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + t = swf.FirstTag; + + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + SetRGB(t,&rgb); + + t = InsertTag(t,ST_DEFINEFONT); + + FontSetDefine(t,font); + + t = InsertTag(t,ST_DEFINEFONTINFO); + + FontSetInfo(t,font); + + t = InsertTag(t,ST_DEFINETEXT); + + SetU16(t,ID_BANNER); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 400; + r.ymax = 400; + SetRect(t,&r); + + SetMatrix(t,NULL); + + TextCountBits(font,BANNER_TEXT,80,&gbits,&abits); + + SetU8(t,gbits); + SetU8(t,abits); + + rgb.r = 0xc0; + rgb.g = 0xc0; + rgb.b = 0xc0; + + TextSetInfoRecord(t,font,height/4,&rgb,0,200); + TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits); + + SetU8(t,0); + + t = InsertTag(t,ST_DEFINETEXT); + + SetU16(t,ID_HIGHLIGHT); // ID + + r.xmin = 0; r.ymin = 0; r.xmax = 800; r.ymax = 400; + SetRect(t,&r); + + SetMatrix(t,NULL); + TextCountBits(font,BANNER_TEXT,80,&gbits,&abits); + + SetU8(t,gbits); + SetU8(t,abits); + + rgb.r = 0x20; + rgb.g = 0x20; + rgb.b = 0x20; + + TextSetInfoRecord(t,font,height/4,&rgb,0,200); + TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits); + + SetU8(t,0); + + t = InsertTag(t,ST_DEFINEBUTTON); + + GetMatrix(NULL,&m); + + m.tx = 3*width; + m.ty = 7*height/2; + + SetU16(t,ID_BUTTON); // ID + ButtonSetRecord(t,BS_UP,ID_BANNER,1,&m,NULL); + ButtonSetRecord(t,BS_DOWN|BS_HIT|BS_OVER,ID_HIGHLIGHT,1,&m,NULL); + SetU8(t,0); // End of Button Records + + ActionCompile(t,"if (status==1) { status = 0; stop();} else { status=1; play();}"); + + + t = InsertTag(t,ST_PLACEOBJECT2); + + ObjectPlace(t,ID_BUTTON,1,NULL,NULL,NULL); + + t = InsertTag(t,ST_DEFINEBITSJPEG2); + + SetU16(t,ID_BITMAP); + SetJPEGBits(t,"eye.jpg",QUALITY); + + t = InsertTag(t,ST_DEFINESHAPE); + + NewShape(&s); + rgb.b = rgb.g = rgb.r = 0x00; + ls = ShapeAddLineStyle(s,10,&rgb); + rgb.b = 0xff; + + m.tx = m.ty = 0; + m.r0 = m.r1 = 0; + m.sx = m.sy = width<<8; + + fs = ShapeAddBitmapFillStyle(s,&m,ID_BITMAP,0); + + SetU16(t,ID_SHAPE); // ID + + r.xmin = 0; r.ymin = 0; + r.xmax = 2*width; r.ymax = 2*height; + SetRect(t,&r); + + SetShapeHeader(t,s); + ShapeSetAll(t,s,width,0,0,fs,0); + ShapeSetLine(t,s,-width,height); + ShapeSetStyle(t,s,ls,fs,0); + ShapeSetLine(t,s,0,-height); + ShapeSetLine(t,s,width,0); + ShapeSetEnd(t); + + ShapeFree(s); + + t = InsertTag(t,ST_DEFINESHAPE); + + NewShape(&s); + rgb.b = rgb.g = rgb.r = 0x00; + ls = ShapeAddLineStyle(s,10,&rgb); + rgb.b = 0xff; + + m.tx = m.ty = 0; + m.r0 = m.r1 = 0; + m.sx = m.sy = -(width<<8); + + fs = ShapeAddBitmapFillStyle(s,&m,ID_BITMAP,0); + + SetU16(t,ID_SHAPE2); // ID + + r.xmin = 0; r.ymin = 0; + r.xmax = 2*width; r.ymax = 2*height; + SetRect(t,&r); + + SetShapeHeader(t,s); + ShapeSetAll(t,s,width,0,0,fs,0); + ShapeSetLine(t,s,-width,height); + ShapeSetStyle(t,s,ls,fs,0); + ShapeSetLine(t,s,0,-height); + ShapeSetLine(t,s,width,0); + ShapeSetEnd(t); + + ShapeFree(s); + + for (frame=0;frame<256;frame++) + { int dc = 3; // whitespace correction + + mapBox(frame<<1,frame<<1,frame); + if (SHADE) mapLights(frame<<1,frame<<1,frame); + + t = MapSquare(t,width-dc,height-dc,0,2,3,1,2*width,2*height,0); + t = MapSquare(t,width-dc,height-dc,4,5,7,6,2*width,2*height,1); + t = MapSquare(t,width-dc,height-dc,0,4,6,2,2*width,2*height,2); + t = MapSquare(t,width-dc,height-dc,1,3,7,5,2*width,2*height,3); + t = MapSquare(t,width-dc,height-dc,0,1,5,4,2*width,2*height,4); + t = MapSquare(t,width-dc,height-dc,2,6,7,3,2*width,2*height,5); + + t = InsertTag(t,ST_SHOWFRAME); + } + /* + t = InsertTag(t,ST_DOACTION); + + ActionCompile(t,"stop();"); + */ + t = InsertTag(t,ST_END); + + WriteCGI(&swf); + FreeTags(&swf); + return 0; +} + + diff --git a/lib/example/transtest.c b/lib/example/transtest.c new file mode 100644 index 00000000..647a615f --- /dev/null +++ b/lib/example/transtest.c @@ -0,0 +1,350 @@ + +// linux/gcc: cc transtest.c ../rfxswf.c -funsigned-char -o transtest -lm -ljpeg; cp transtest /home/www/cgi-bin/transtest + +#include +#include +#include +#include "../rfxswf.h" + +// Box + +#define BANNER_TEXT "reflex" +#define QUALITY 80 +#define ID_FONT 2000 +#define ID_BANNER 2001 +#define ID_HIGHLIGHT 2002 +#define ID_BUTTON 2003 +#define ID_BITMAP 2004 +#define ID_SHAPE 2005 + +#define a 200 +int sX[] = { a,-a, a,-a, a,-a, a,-a}; +int sY[] = { a, a,-a,-a, a, a,-a,-a}; +int sZ[] = { a, a, a, a,-a,-a,-a,-a}; +#undef a + +int dX[8]; +int dY[8]; + +int sin_[512],cos_[512]; + +void calcTables() +{ int i; + double d; + for (i=0;i<512;i++) + { d = ((double)i)/128*3.14159; + sin_[i] = (int)(sin(d)*256); + cos_[i] = (int)(cos(d)*256); + } +} + +void ShapeSquare(LPTAG t,LPSHAPE s,int p1,int p2,int p3,int p4,int dx,int dy) +{ + // Hidden-Line-Check + if (((dX[p2]-dX[p1])*(dY[p3]-dY[p1])-(dX[p3]-dX[p1])*(dY[p2]-dY[p1]))<0) return; + + ShapeSetMove(t,s,dX[p1]+dx,dY[p1]+dy); + ShapeSetLine(t,s,dX[p2]-dX[p1],dY[p2]-dY[p1]); + ShapeSetLine(t,s,dX[p3]-dX[p2],dY[p3]-dY[p2]); + ShapeSetLine(t,s,dX[p4]-dX[p3],dY[p4]-dY[p3]); + ShapeSetLine(t,s,dX[p1]-dX[p4],dY[p1]-dY[p4]); +} + + +void mapBox(int xw,int yw,int zw) +{ int i; + int x1,y1,z1,x2,y2,z2,x3,y3,z3; + int y,x,z; + + xw &= 255; + yw &= 255; + zw &= 255; + + for (i=0;i<8;i++) + { x = sX[i]; + y = sY[i]; + z = sZ[i]; + + y1 = ( y*cos_[xw]- z*sin_[xw])>>8; + z1 = ( y*sin_[xw]+ z*cos_[xw])>>8; + x1 = x; + + x2 = (x1*cos_[yw]+z1*sin_[yw])>>8; + y2 = y1; + + x3 = (x2*cos_[zw]-y2*sin_[zw])>>8; + y3 = (x2*sin_[zw]+y2*cos_[zw])>>8; + z3 = (z1*cos_[yw]-x1*sin_[yw])>>8; + + dX[i] = x3*4000/(z3+950); + dY[i] = y3*4000/(z3+950); + + } +} + + +#define S64 long long +SFIXED SP(SFIXED a1,SFIXED a2,SFIXED b1,SFIXED b2) +{ S64 a; + a = (S64)a1*(S64)b1+(S64)a2*(S64)b2; + return (SFIXED)(a>>16); +} +SFIXED QFIX(int zaehler,int nenner) // bildet Quotient von zwei INTs in SFIXED +{ S64 z = zaehler<<16; + S64 a = z/(S64)nenner; + return (SFIXED)a; +} +#undef S64 + +LPMATRIX MatrixJoin(LPMATRIX d,LPMATRIX s1,LPMATRIX s2) +{ + if (!d) return NULL; + if (!s1) return (s2)?(LPMATRIX)memcpy(d,s2,sizeof(MATRIX)):NULL; + if (!s2) return (LPMATRIX)memcpy(d,s1,sizeof(MATRIX)); + + d->tx = s1->tx + s2->tx; + d->ty = s1->ty + s2->ty; + + d->sx = SP(s1->sx,s1->r1,s2->sx,s2->r0); + d->sy = SP(s1->r0,s1->sy,s2->r1,s2->sy); + d->r0 = SP(s1->r0,s1->sy,s2->sx,s2->r0); + d->r1 = SP(s1->sx,s1->r1,s2->r1,s2->sy); + + //DumpMatrix(NULL,d); + + return d; +} + +LPMATRIX MatrixMapTriangle(LPMATRIX m,int dx,int dy,int x0,int y0, + int x1,int y1,int x2,int y2) +{ int dx1 = x1 - x0; + int dy1 = y1 - y0; + int dx2 = x2 - x0; + int dy2 = y2 - y0; + + if (!m) return NULL; + if ((!dx)||(!dy)) return NULL; // check DIV by zero + + m->tx = x0; + m->ty = y0; + m->sx = QFIX(dx1,dx); + m->sy = QFIX(dy2,dy); + m->r0 = QFIX(dy1,dx); + m->r1 = QFIX(dx2,dy); + + return m; +} + +int main (int argc,char ** argv) +{ SWF swf; + LPTAG t; + RGBA rgb; + SRECT r; + LPSHAPE s; + S32 width = 800,height = 800; + U8 gbits,abits; + int fs,ls; // line & fillstyle + LPSWFFONT font; + FONTUSAGE use; + LPJPEGBITS jpeg; + MATRIX m; + + int f,i,j,frame; + + f = open("Arial.efont",O_RDONLY); + if (f>=0) + { if (FAILED(FontImport(f,&font))) + { fprintf(stderr,"Font import failed\n"); + close(f); + return -1; + } + } + else + { fprintf(stderr,"Font not found\n"); + return -1; + } + close(f); + + FontSetID(font,ID_FONT); + FontInitUsage(&use); + FontUse(&use,BANNER_TEXT); + FontReduce(font,&use); + + calcTables(); + + memset(&swf,0x00,sizeof(SWF)); + + swf.FileVersion = 4; + swf.FrameRate = 0x4000; + swf.MovieSize.xmax = 4*width; + swf.MovieSize.ymax = 4*height; + + swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + t = swf.FirstTag; + + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + SetRGB(t,&rgb); + + t = InsertTag(t,ST_DEFINEFONT); + + FontSetDefine(t,font); + + t = InsertTag(t,ST_DEFINEFONTINFO); + + FontSetInfo(t,font); + + t = InsertTag(t,ST_DEFINETEXT); + + SetU16(t,ID_BANNER); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 400; + r.ymax = 400; + SetRect(t,&r); + + SetMatrix(t,NULL); + + TextCountBits(font,BANNER_TEXT,80,&gbits,&abits); + + SetU8(t,gbits); + SetU8(t,abits); + + rgb.r = 0xc0; + rgb.g = 0xc0; + rgb.b = 0xc0; + + TextSetInfoRecord(t,font,height/4,&rgb,0,200); + TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits); + + SetU8(t,0); + + t = InsertTag(t,ST_DEFINETEXT); + + SetU16(t,ID_HIGHLIGHT); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 800; + r.ymax = 400; + SetRect(t,&r); + + SetMatrix(t,NULL); + + TextCountBits(font,BANNER_TEXT,80,&gbits,&abits); + + SetU8(t,gbits); + SetU8(t,abits); + + rgb.r = 0x20; + rgb.g = 0x20; + rgb.b = 0x20; + + TextSetInfoRecord(t,font,height/4,&rgb,0,200); + TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits); + + SetU8(t,0); + + t = InsertTag(t,ST_DEFINEBUTTON); + + GetMatrix(NULL,&m); + + m.tx = 3*width; + m.ty = 7*height/2; + + SetU16(t,ID_BUTTON); // ID + ButtonSetRecord(t,BS_UP,ID_BANNER,1,&m,NULL); + ButtonSetRecord(t,BS_DOWN|BS_HIT|BS_OVER,ID_HIGHLIGHT,1,&m,NULL); + SetU8(t,0); // End of Button Records + SetU8(t,0); // End of Action Records + + + t = InsertTag(t,ST_PLACEOBJECT2); + + ObjectPlace(t,ID_BUTTON,1,NULL,NULL,NULL); + + t = InsertTag(t,ST_DEFINEBITSJPEG2); + + SetU16(t,ID_BITMAP); + SetJPEGBits(t,"eye.jpg",QUALITY); + + t = InsertTag(t,ST_DEFINESHAPE); + + NewShape(&s); + rgb.b = rgb.g = rgb.r = 0x00; + // ls = ShapeAddLineStyle(s,40,&rgb); + ls = 0; + rgb.b = 0xff; + + fs = ShapeAddBitmapFillStyle(s,&m,ID_BITMAP,0); + + SetU16(t,ID_SHAPE); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 2*width; + r.ymax = 2*height; + + SetRect(t,&r); + + SetShapeHeader(t,s); + + ShapeSetAll(t,s,0,0,ls,fs,0); + ShapeSetLine(t,s,width,0); + ShapeSetLine(t,s,-width,height); + ShapeSetLine(t,s,0,-height); + ShapeSetEnd(t); + + ShapeFree(s); + + + for (frame=0;frame<64;frame++) + { /*MATRIX m1,m2; + + m1.sy = m1.sx = (int)(cos(((float)(frame))/32*3.141)*0x10000); + m1.r0 = (int)(sin(((float)(frame))/32*3.141)*0x10000); + m1.r1 = -m1.r0; + m1.tx = width+frame*4; m1.ty = height; + + m2.sy = m2.sx = (int)(cos(((float)(64-frame))/32*3.141)*0x10000); + m2.r0 = (int)(sin(((float)(64-frame))/32*3.141)*0x10000); + m2.r1 = -m2.r0; + m2.tx = width; m2.ty = height; + + MatrixJoin(&m,&m1,&m2); */ + + int dx0 = width; // Konstanten der Shapes + int dy0 = width; + + int px0 = 2*width; // Zielpunkte des Mappings + int py0 = 2*width; + + int px1 = 3*width; + int py1 = 2*width-frame*4; + + int px2 = 2*width-frame*8; + int py2 = 3*width; + + MatrixMapTriangle(&m,dx0,dy0,px0,py0,px1,py1,px2,py2); + + t = InsertTag(t,ST_PLACEOBJECT2); + + if (!frame) + ObjectPlace(t,ID_SHAPE,1,&m,NULL,NULL); + else + ObjectMove(t,1,&m,NULL); + + t = InsertTag(t,ST_SHOWFRAME); + } + + + t = InsertTag(t,ST_END); + + WriteCGI(&swf); + FreeTags(&swf); + return 0; +} + + diff --git a/lib/log.c b/lib/log.c new file mode 100644 index 00000000..6c705ee1 --- /dev/null +++ b/lib/log.c @@ -0,0 +1,252 @@ +/* log.c + Logging facilities for displaying information on screen, as well as + (optional) storing it to a file and transmitting it over the network. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifdef __NT__ +#include "stdafx.h" +#include +#include +#include +#include +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +#else +#include +#include +#include +#include +#include +#endif + +#include "log.h" + +#define LOGLEVEL_FATAL 0 +#define LOGLEVEL_ERROR 1 +#define LOGLEVEL_WARNING 2 +#define LOGLEVEL_NOTICE 3 +#define LOGLEVEL_VERBOSE 4 +#define LOGLEVEL_DEBUG 5 + +int screenloglevel; +int fileloglevel; +int socketloglevel; +FILE *logFile = 0; +#ifdef __NT__ +SOCKET logSocket; +#else +int logSocket = 0; +#endif + +char bLogToSock = 0; + +void initlogSocket(char* servAddr, char* logPort); + +void initLog(char* pLogName, int fileloglevel, char* servAddr, char* logPort, int serverlevel, int screenlevel) +{ + screenloglevel = screenlevel; + fileloglevel = fileloglevel; + socketloglevel = screenlevel; + logFile = NULL; + bLogToSock = 0; + + if (pLogName && fileloglevel>=0) + logFile = fopen(pLogName, "a+"); + bLogToSock = (servAddr && logPort && (serverlevel>=0)); + if(bLogToSock) + initlogSocket(servAddr, logPort); +} + +void initlogSocket(char* servAddr, char* logPort) +{ +#ifndef __NT__ + bLogToSock = 0; +#else + // init winsock + // check and prepare WinSock DLL + WORD wVersionRequested = MAKEWORD( 2, 2 ); + WSADATA wsaData; + if ( WSAStartup(wVersionRequested, &wsaData) != 0 ) + { + bLogToSock = false; + return; + } + // Confirm that the WinSock DLL supports 2.2. + // Note that if the DLL supports versions greater + // than 2.2 in addition to 2.2, it will still return + // 2.2 in wVersion since that is the version we + // requested. + + if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) + { + bLogToSock = false; + return; + } + + struct hostent *hp; + hp = gethostbyname(servAddr); + if (hp == NULL) // we don't know who this host is + { + bLogToSock = false; + return; + } + + // connect socket + sockaddr_in SocketAddress; + + memset(&SocketAddress, 0, sizeof(SocketAddress)); + memcpy((char*)&SocketAddress.sin_addr, hp->h_addr, hp->h_length); // set address + SocketAddress.sin_family = hp->h_addrtype; + SocketAddress.sin_port = htons((u_short)atoi(logPort)); + + logSocket = socket(hp->h_addrtype, SOCK_STREAM, 0); + if (logSocket == INVALID_SOCKET) + { + bLogToSock = false; + return; + } + + // try to connect to the specified socket + if ( connect(logSocket, (struct sockaddr*)&SocketAddress, sizeof (SocketAddress)) == SOCKET_ERROR) { + bLogToSock = false; + return; + } + bLogToSock = true; +#endif +} + +void exitLog() +{ + // close socket communication + if(bLogToSock) +#ifndef __NT__ + close(logSocket); +#else + closesocket(logSocket); +#endif + // close file + if(logFile != NULL) + fclose(logFile); +} + + +static char * logimportance[]= {"Fatal","Error","Warning","Notice","Verbose","Debug"}; +static int loglevels=6; +static char * logimportance2[]= {" ","FATAL ","ERROR ","WARNING","NOTICE ","VERBOSE","DEBUG "}; +void log(char* logString) +{ + char timebuffer[32]; + char* logBuffer; + char dbuffer[9]; + char tbuffer[9]; + int level; + char*lt; + char*gt; + int l; + + logBuffer = (char*)malloc (strlen(logString) + 24 + 15); +#ifndef __NT__ + { + /*time_t t = time(0); + tm*t2 = localtime(t); + strftime(dbuffer, 8, "%m %d", t2); + strftime(tbuffer, 8, "%m %d", t2); + dbuffer[0]=0; //FIXME + tbuffer[0]=0;*/ + time_t t = time(0); + char* a = ctime(&t); + int l = strlen(a); + while(a[l-1] == 13 || a[l-1] == 10) + l--; + a[l]=0; + sprintf(timebuffer, "%s", a); + } +#else + _strdate( dbuffer ); + _strtime( tbuffer ); + sprintf(timebuffer, "%s - %s",dbuffer,tbuffer); +#endif + + // search for field + level = -1; + lt=strchr(logString, '<'); + gt=strchr(logString, '>'); + if(lt && gt && lt=0) + { + logBuffer[l]=0; + l--; + } + + if (level <= screenloglevel) + { + printf("%s\n", logBuffer); + fflush(stdout); + } + + if (level <= fileloglevel) + { + if (logFile != NULL) + { + fprintf(logFile, "%s\n", logBuffer); + fflush(logFile); + } + } + + if (level <= socketloglevel) + { + if (bLogToSock) + { + // send data +#ifndef __NT__ + write(logSocket, logBuffer, strlen(logBuffer)); +#else + send(logSocket, logBuffer, strlen(logBuffer), 0); +#endif + } + } + free (logBuffer); +} + +void logf(const char* pszFormat, ...) +{ + char buf[1024]; + va_list arglist; + va_start(arglist, pszFormat); + buf[0] = 0; + vsprintf(&buf[strlen(buf)], pszFormat, arglist); + va_end(arglist); + strcat(buf, "\n"); + log(buf); +} + diff --git a/lib/log.h b/lib/log.h new file mode 100644 index 00000000..e3fbc2dc --- /dev/null +++ b/lib/log.h @@ -0,0 +1,39 @@ +/* log.h + Header file for log.c. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __log_h__ +#define __log_h__ + +#ifdef __NT__ +#include "stdafx.h" +#include +#include +#else +#include +#include +#include +#endif + +#define LOGLEVEL_FATAL 0 +#define LOGLEVEL_ERROR 1 +#define LOGLEVEL_WARNING 2 +#define LOGLEVEL_NOTICE 3 +#define LOGLEVEL_VERBOSE 4 +#define LOGLEVEL_DEBUG 5 + +extern int screenloglevel; +extern int socketloglevel; +extern int fileloglevel; + +extern void initLog(char* pLogDir, int fileloglevel, char* servAddr, char* logPort, int serverloglevel, int screenloglevel); +extern void log(char* logString); +extern void logf(const char* logFormat, ...); +extern void exitLog(void); + +#endif // __log_h__ diff --git a/lib/modules/swfbits.c b/lib/modules/swfbits.c new file mode 100644 index 00000000..05b21fb6 --- /dev/null +++ b/lib/modules/swfbits.c @@ -0,0 +1,152 @@ +/* swfbits.c + + Bitmap functions (needs libjpeg) + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + +#ifdef _JPEGLIB_INCLUDED_ +#define OUTBUFFER_SIZE 32768 + +typedef struct _JPEGDESTMGR +{ struct jpeg_destination_mgr mgr; + LPTAG t; + JOCTET * buffer; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; +} JPEGDESTMGR, * LPJPEGDESTMGR; + +// Destination manager callbacks + +void swf_init_destination(j_compress_ptr cinfo) +{ LPJPEGDESTMGR dmgr = (LPJPEGDESTMGR)cinfo->dest; + dmgr->buffer = (JOCTET*)malloc(OUTBUFFER_SIZE); + dmgr->mgr.next_output_byte = dmgr->buffer; + dmgr->mgr.free_in_buffer = OUTBUFFER_SIZE; +} + +boolean swf_empty_output_buffer(j_compress_ptr cinfo) +{ LPJPEGDESTMGR dmgr = (LPJPEGDESTMGR)cinfo->dest; + SetBlock(dmgr->t, + (U8*)dmgr->buffer, + OUTBUFFER_SIZE-dmgr->mgr.free_in_buffer); + dmgr->mgr.next_output_byte = dmgr->buffer; + dmgr->mgr.free_in_buffer = OUTBUFFER_SIZE; +} + +void swf_term_destination(j_compress_ptr cinfo) +{ LPJPEGDESTMGR dmgr = (LPJPEGDESTMGR)cinfo->dest; + swf_empty_output_buffer(cinfo); + free(dmgr->buffer); + dmgr->mgr.free_in_buffer = 0; +} + +LPJPEGBITS SetJPEGBitsStart(LPTAG t,int width,int height,int quality) +{ + LPJPEGDESTMGR jpeg; + + // redirect compression lib output to local SWF Tag structure + + jpeg = (LPJPEGDESTMGR)malloc(sizeof(JPEGDESTMGR)); + if (!jpeg) return NULL; + + memset(jpeg,0x00,sizeof(JPEGDESTMGR)); + jpeg->cinfo.err = jpeg_std_error(&jpeg->jerr); + + jpeg_create_compress(&jpeg->cinfo); + + jpeg->mgr.init_destination = swf_init_destination; + jpeg->mgr.empty_output_buffer = swf_empty_output_buffer; + jpeg->mgr.term_destination = swf_term_destination; + + jpeg->t = t; + + jpeg->cinfo.dest = (struct jpeg_destination_mgr *)jpeg; + + // init compression + + jpeg->cinfo.image_width = width; + jpeg->cinfo.image_height = height; + jpeg->cinfo.input_components = 3; + jpeg->cinfo.in_color_space = JCS_RGB; + + jpeg_set_defaults(&jpeg->cinfo); + jpeg_set_quality(&jpeg->cinfo,quality,TRUE); + + // write tables to SWF + + jpeg_write_tables(&jpeg->cinfo); + + // compess image to SWF + + jpeg_suppress_tables(&jpeg->cinfo, TRUE); + jpeg_start_compress(&jpeg->cinfo, FALSE); + + return (LPJPEGBITS)jpeg; +} + +int SetJPEGBitsLines(LPJPEGBITS jpegbits,U8 ** data,int n) +{ LPJPEGDESTMGR jpeg = (LPJPEGDESTMGR)jpegbits; + if (!jpeg) return -1; + jpeg_write_scanlines(&jpeg->cinfo,data,n); + return 0; +} + +int SetJPEGBitsLine(LPJPEGBITS jpegbits,U8 * data) +{ return SetJPEGBitsLines(jpegbits,&data,1); +} + +int SetJPEGBitsFinish(LPJPEGBITS jpegbits) +{ LPJPEGDESTMGR jpeg = (LPJPEGDESTMGR)jpegbits; + if (!jpeg) return -1; + jpeg_finish_compress(&jpeg->cinfo); + free(jpeg); + return 0; +} + +int SetJPEGBits(LPTAG t,char * fname,int quality) +{ struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + LPJPEGBITS out; + FILE * f; + U8 * scanline; + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + + if ((f=fopen(fname,"rb"))==NULL) return -1; + + + jpeg_stdio_src(&cinfo,f); + jpeg_read_header(&cinfo, TRUE); + jpeg_start_decompress(&cinfo); + + out = SetJPEGBitsStart(t,cinfo.output_width,cinfo.output_height,quality); + scanline = (U8*)malloc(4*cinfo.output_width); + + if (scanline) + { int y; + U8 * js = scanline; + for (y=0;y + + This file is distributed under the GPL, see file COPYING for details + +*/ + +int ButtonSetRecord(LPTAG t,U8 state,U16 id,U16 layer,LPMATRIX m,LPCXFORM cx) + +{ SetU8(t,state); + SetU16(t,id); + SetU16(t,layer); + SetMatrix(t,m); +// SetCXForm(t,cx,0); + return 0; +} + +int ButtonSetCondition(LPTAG t,U16 condition) +{ SetU16(t,0); // dummy for Action Offset -> later set by ButtonPostProcess + SetU16(t,condition); + return 0; +} + +int ButtonSetFlags(LPTAG t,U8 flags) +{ if (GetTagID(t)==ST_DEFINEBUTTON2) + { SetU8(t,flags); + SetU16(t,0); // dummy for Action Offset -> later set by ButtonPostProcess + } + return 0; +} + +void SetButtonOffset(LPTAG t,U32 offsetpos) +{ U32 now = GetTagPos(t); + U16 diff = now-offsetpos; + SetTagPos(t,offsetpos); + t->data[t->pos++] = (U8)(diff&0xff); + t->data[t->pos++] = (U8)(diff>>8); + SetTagPos(t,now); +} + +int ButtonPostProcess(LPTAG t,int anz_action) +{ if (GetTagID(t)==ST_DEFINEBUTTON2) + { U32 oldTagPos; + U32 offsetpos; + + oldTagPos = GetTagPos(t); + + // scan DefineButton2 Record + + GetU16(t); // Character ID + GetU8(t); // Flags; + + offsetpos = GetTagPos(t); // first offset + GetU16(t); + + while (GetU8(t)) // state -> parse ButtonRecord + { GetU16(t); // id + GetU16(t); // layer + GetMatrix(t,NULL); // matrix + // evtl.: CXForm + } + + SetButtonOffset(t,offsetpos); + + while(anz_action) + { U8 a; + + offsetpos = GetTagPos(t); // offset + GetU16(t); + + GetU16(t); // condition + + while (a=GetU8(t)) // skip action records + { if (a&0x80) + { U16 l = GetU16(t); + GetBlock(t,NULL,l); + } + } + + if (--anz_action) SetButtonOffset(t,offsetpos); + } + + SetTagPos(t,oldTagPos); + } + return 0; +} diff --git a/lib/modules/swfcgi.c b/lib/modules/swfcgi.c new file mode 100644 index 00000000..98e5f032 --- /dev/null +++ b/lib/modules/swfcgi.c @@ -0,0 +1,179 @@ +/* swfcgi.c + + Parse CGI parameters + + Partly adopted from Steven Grimm's uncgi tool and library. + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + + +#define ishex(x) (((x) >= '0' && (x) <= '9') || ((x) >= 'a' && (x) <= 'f') || ((x) >= 'A' && (x) <= 'F')) + +#define PREFIX "WWW_" + +static int htoi(unsigned char * s) +{ int value; + char c; + + c = s[0]; + if (isupper(c)) c = tolower(c); + value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16; + + c = s[1]; + if (isupper(c)) c = tolower(c); + value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10; + + return (value); +} + +static void url_unescape(unsigned char * s) +{ unsigned char *dest = s; + + while (s[0]) + { if (s[0] == '+') dest[0] = ' '; + else + { if (s[0] == '%' && ishex(s[1]) && ishex(s[2])) + { dest[0] = (unsigned char) htoi(s + 1); + s += 2; + } + else dest[0] = s[0]; + } + s++;dest++; + } + dest[0] = 0; +} + +static void cgienv(unsigned char * var) +{ unsigned char *buf, *c, *s, *t, *oldval = NULL, *newval; + int despace = 0, got_cr = 0; + + // fprintf(stderr,"%s\n",var); + url_unescape(var); + // fprintf(stderr,"%s\n",var); + + + buf = (unsigned char*)malloc(strlen(var) + sizeof(PREFIX) + 2); + if (!buf) return; + + strcpy(buf, PREFIX); + if (var[0] == '_') + { strcpy(&buf[sizeof(PREFIX)-1], &var[1]); + despace = 1; + } + else strcpy(&buf[sizeof(PREFIX)-1], var); + + for (c = buf; c[0] ; c++) + { if (c[0] == '.') c[0] = '_'; + if (c[0] == '=') break; + } + if (!c[0]) c[1] = 0; + c[0] = 0; + + if (despace && c[1]) + { for (s = c+1; s[0] && isspace(s[0]); s++); + t = c + 1; + while (s[0]) + { if (s[0] == '\r') + { got_cr = 1; + s++; + continue; + } + if (got_cr) + { if (s[0] != '\n') + *t++ = '\n'; + got_cr = 0; + } + *t++ = *s++; + } + while (t > c && isspace(*--t)); + t[1] = 0; + } + + if ((oldval = getenv(buf))) + { newval = (unsigned char*)malloc(strlen(oldval) + strlen(buf) + strlen(&c[1]) + 3); + if (!newval) return; + + c[0] = '='; + sprintf(newval, "%s#%s", buf, oldval); + c[0] = 0; + + oldval -= strlen(buf) + 1; // skip past VAR= + } + else + { c[0] = '='; + newval = buf; + } + + putenv(newval); + + if (oldval) + { free(oldval); + free(buf); + } +} + +static void scanquery(char * q) +{ char *next = q; + if (!q) return; + + while (next) + { next = strchr(q, '&'); + if (next) next[0] = 0; + cgienv(q); + if (next) + { next[0] = '&'; + q = next+1; + } + } +} + +char * postread() +{ char * buf = NULL; + int size = 0, sofar = 0, got; + + buf = getenv("CONTENT_TYPE"); + if ((!buf) || strcmp(buf, "application/x-www-form-urlencoded")) return NULL; + + buf = getenv("CONTENT_LENGTH"); + if (!buf) return NULL; + + size = atoi(buf); + buf = (unsigned char*)malloc(size + 1); + if (buf) + { do + { got = fread(buf + sofar, 1, size - sofar, stdin); + sofar += got; + } while (got && sofar < size); + buf[sofar] = 0; + } + + return buf; +} + +void uncgi() +{ char *query, *dupquery, *method; + + query = getenv("QUERY_STRING"); + if ((query) && strlen(query)) + { dupquery = strdup(query); + scanquery(dupquery); + free(dupquery); + } + + method = getenv("REQUEST_METHOD"); + if ((method) && ! strcmp(method, "POST")) + { query = postread(); + if ((query)&&(query[0]!=0)) scanquery(query); + free(query); + } + +} + +#undef ishex diff --git a/lib/modules/swfdump.c b/lib/modules/swfdump.c new file mode 100644 index 00000000..12b3fdfe --- /dev/null +++ b/lib/modules/swfdump.c @@ -0,0 +1,131 @@ +/* swfdump.c + + Dump / debug functions + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + +void DumpHeader(FILE * f,LPSWF swf) +{ if (!f) f = stderr; + fprintf(f,"File size\t%u\n",swf->FileSize); + fprintf(f,"Movie width\t%u\n",(swf->MovieSize.xmax - swf->MovieSize.xmin)/20); + fprintf(f,"Movie height\t%u\n",(swf->MovieSize.ymax - swf->MovieSize.ymin)/20); + fprintf(f,"Frame rate\t%u.%u\n",swf->FrameRate>>8,swf->FrameRate&0xff); + fprintf(f,"Frame count\t%u\n",swf->FrameCount); +} + +void DumpMatrix(FILE * f,LPMATRIX m) +{ if (!f) f = stderr; + fprintf(f,"[%08x][%08x]\n",m->sx,m->r1); + fprintf(f,"[%08x][%08x]\n",m->r0,m->sy); + fprintf(f," %08x, %08x\n",m->tx,m->ty); +} + +void DumpTag(FILE * f,LPTAG t) +{ int i; + if (!f) f = stderr; + for (i=0;ilen;i++) + { if (!(i&15)) fprintf(f,"\n"); + fprintf(f,"%02x ",t->data[i]); + } + fprintf(f,"\n"); +} + +char* getTagName(TAG*tag) +{ + switch(tag->id) + { + case ST_END: + return "END"; + case ST_SHOWFRAME: + return "SHOWFRAME"; + case ST_DEFINESHAPE: + return "DEFINESHAPE"; + case ST_FREECHARACTER: + return "FREECHARACTER"; + case ST_PLACEOBJECT: + return "PLACEOBJECT"; + case ST_REMOVEOBJECT: + return "REMOVEOBJECT"; + case ST_DEFINEBITS: + return "DEFINEBITS"; + case ST_DEFINEBUTTON: + return "DEFINEBUTTON"; + case ST_JPEGTABLES: + return "JPEGTABLES"; + case ST_SETBACKGROUNDCOLOR: + return "SETBACKGROUNDCOLOR"; + case ST_DEFINEFONT: + return "DEFINEFONT"; + case ST_DEFINETEXT: + return "DEFINETEXT"; + case ST_DOACTION: + return "DOACTION"; + case ST_DEFINEFONTINFO: + return "DEFINEFONTINFO"; + case ST_DEFINESOUND: + return "DEFINESOUND"; + case ST_STARTSOUND: + return "STARTSOUND"; + case ST_DEFINEBUTTONSOUND: + return "DEFINEBUTTONSOUND"; + case ST_SOUNDSTREAMHEAD: + return "SOUNDSTREAMHEAD"; + case ST_SOUNDSTREAMBLOCK: + return "SOUNDSTREAMBLOCK"; + case ST_DEFINEBITSLOSSLESS: + return "DEFINEBITSLOSSLESS"; + case ST_DEFINEBITSJPEG2: + return "DEFINEBITSJPEG2"; + case ST_DEFINESHAPE2: + return "DEFINESHAPE2"; + case ST_DEFINEBUTTONCXFORM: + return "DEFINEBUTTONCXFORM"; + case ST_PROTECT: + return "PROTECT"; + case ST_PLACEOBJECT2: + return "PLACEOBJECT2"; + case ST_REMOVEOBJECT2: + return "REMOVEOBJECT2"; + case ST_DEFINESHAPE3: + return "DEFINESHAPE3"; + case ST_DEFINETEXT2: + return "DEFINETEXT2"; + case ST_DEFINEBUTTON2: + return "DEFINEBUTTON2"; + case ST_DEFINEBITSJPEG3: + return "DEFINEBITSJPEG3"; + case ST_DEFINEBITSLOSSLESS2: + return "DEFINEBITSLOSSLESS2"; + case ST_DEFINESPRITE: + return "DEFINESPRITE"; + case ST_NAMECHARACTER: + return "NAMECHARACTER"; + case ST_SERIALNUMBER: + return "SERIALNUMBER"; + case ST_GENERATORTEXT: + return "GENERATORTEXT"; + case ST_FRAMELABEL: + return "FRAMELABEL"; + case ST_SOUNDSTREAMHEAD2: + return "SOUNDSTREAMHEAD2"; + case ST_DEFINEMORPHSHAPE: + return "DEFINEMORPHSHAPE"; + case ST_DEFINEFONT2: + return "DEFINEFONT2"; + case ST_TEMPLATECOMMAND: + return "TEMPLATECOMMAND"; + case ST_GENERATOR3: + return "GENERATOR3"; + case ST_EXTERNALFONT: + return "EXTERNALFONT"; + case ST_REFLEX: + return "REFLEX"; + } +} diff --git a/lib/modules/swfobject.c b/lib/modules/swfobject.c new file mode 100644 index 00000000..132f1169 --- /dev/null +++ b/lib/modules/swfobject.c @@ -0,0 +1,59 @@ +/* swfobject.c + + Object place and move routines + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + +#define PF_MOVE 0x01 +#define PF_CHAR 0x02 +#define PF_MATRIX 0x04 +#define PF_CXFORM 0x08 +#define PF_RATIO 0x10 +#define PF_NAME 0x20 +#define PF_CLIPACTION 0x40 + +int ObjectPlace(LPTAG t,U16 id,U16 depth,LPMATRIX m,LPCXFORM cx,U8 * name) +{ U8 flags; + if (!t) return -1; + + flags = (id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(name?PF_NAME:0)|((m||cx)&&(!id)?PF_MOVE:0); + + SetU8(t,flags); + SetU16(t,depth); + if (flags&PF_CHAR) SetU16(t,id); + if (flags&PF_MATRIX) SetMatrix(t,m); + if (flags&PF_CXFORM) SetCXForm(t,cx,(cx->a0!=256)||(cx->a1)); + if (flags&PF_RATIO) SetU16(t,0); + if (flags&PF_NAME) SetString(t,name); + + return 0; +} + +int PlaceObject(LPTAG t,U16 id,U16 depth,LPMATRIX m,LPCXFORM cx,U8 * name, U16 clipaction) +{ U8 flags; + if (!t) return -1; + + flags = (id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(name?PF_NAME:0)| + ((m||cx)&&(!id)?PF_MOVE:0)|(clipaction?PF_CLIPACTION:0); + + SetU8(t,flags); + SetU16(t,depth); + if (flags&PF_CHAR) SetU16(t,id); + if (flags&PF_MATRIX) SetMatrix(t,m); + if (flags&PF_CXFORM) SetCXForm(t,cx,(cx->a0!=256)||(cx->a1)); + if (flags&PF_RATIO) SetU16(t,0); + if (flags&PF_NAME) SetString(t,name); + if (flags&PF_CLIPACTION) SetU16(t, clipaction); + return 0; +} + +int ObjectMove(LPTAG t,U16 depth,LPMATRIX m,LPCXFORM cx) +{ return ObjectPlace(t,0,depth,m,cx,NULL); +} diff --git a/lib/modules/swfshape.c b/lib/modules/swfshape.c new file mode 100644 index 00000000..c09f30d9 --- /dev/null +++ b/lib/modules/swfshape.c @@ -0,0 +1,523 @@ +/* swfshape.c + + shape functions + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + +#define SF_MOVETO 0x01 +#define SF_FILL0 0x02 +#define SF_FILL1 0x04 +#define SF_LINE 0x08 +#define SF_NEWSTYLE 0x10 + +#define FILL_SOLID 0x00 +#define FILL_LINEAR 0x10 // Gradient +#define FILL_RADIAL 0x12 +#define FILL_TILED 0x40 // Bitmap +#define FILL_CLIPPED 0x41 + +void ShapeFree(LPSHAPE s) +{ if (s) + { if (s->linestyle.data) free(s->linestyle.data); + s->linestyle.data = NULL; + s->linestyle.n = 0; + if (s->fillstyle.data) free(s->fillstyle.data); + s->fillstyle.data = NULL; + s->fillstyle.n = 0; + if (s->data) free(s->data); + s->data = NULL; + } + free(s); +} + +int NewShape(LPSHAPE * s) +{ LPSHAPE sh; + if (!s) return -1; + sh = (LPSHAPE)malloc(sizeof(SHAPE)); s[0] = sh; + if (sh) memset(sh,0x00,sizeof(SHAPE)); + return sh?0:-1; +} + +int GetSimpleShape(LPTAG t,LPSHAPE * s) // without Linestyle/Fillstyle Record +{ LPSHAPE sh; + int bitl, len; + int end; + U32 pos; + + if (FAILED(NewShape(s))) return -1; + sh = s[0]; + + ResetBitmask(t); + sh->bits.fill = (U16)GetBits(t,4); + sh->bits.line = (U16)GetBits(t,4); + bitl = 0; end = 0; pos = GetTagPos(t); + + while (!end) + { int edge = GetBits(t,1); bitl+=1; + if (edge) + { bitl+=1; + if (GetBits(t,1)) // Line + { U16 nbits = GetBits(t,4)+2; + bitl+=5; + + if (GetBits(t,1)) // x/y Line + { GetBits(t,nbits); + GetBits(t,nbits); + bitl+=nbits*2; + } + else // hline/vline + { GetBits(t,nbits+1); + bitl+=nbits+1; + } + } + else // Curve + { U16 nbits = GetBits(t,4)+2; + bitl+=4; + + GetBits(t,nbits); + GetBits(t,nbits); + GetBits(t,nbits); + GetBits(t,nbits); + + bitl+=4*nbits; + } + } + else + { U16 flags = GetBits(t,5); bitl+=5; + if (flags) + { + if (flags&SF_MOVETO) + { U16 nbits = GetBits(t,5); bitl+=5; + GetBits(t,nbits); + GetBits(t,nbits); + bitl+=2*nbits; + } + + if (flags&SF_FILL0) + { GetBits(t,sh->bits.fill); + bitl+=sh->bits.fill; + } + + if (flags&SF_FILL1) + { GetBits(t,sh->bits.fill); + bitl+=sh->bits.fill; + } + + if (flags&SF_LINE) + { GetBits(t,sh->bits.line); + bitl+=sh->bits.line; + } + + if (flags&SF_NEWSTYLE) + { fprintf(stderr,"Can't process extended styles in shape.\n"); + } + } + else end = 1; + } + } + SetTagPos(t,pos); + len = (bitl+7)/8; + + if (sh->data) free(sh->data); + sh->data = (U8*)malloc(len); + + if (sh->data) + { sh->bitlen = bitl; + GetBlock(t,sh->data,len); + } + else return -1; + + return len; +} + +int SetSimpleShape(LPTAG t,LPSHAPE s) // without Linestyle/Fillstyle Record +{ int l; + + if (!s) return -1; + l = (s->bitlen+7)/8; + + if (t) + { ResetBitcount(t); + + SetBits(t,s->bits.fill,4); + SetBits(t,s->bits.line,4); + SetBlock(t,s->data,l); + + ResetBitcount(t); + } + return l+1; +} + +int SetFillStyle(LPTAG t,LPFILLSTYLE f) +{ if ((!t)||(!f)) return -1; + SetU8(t,f->type); + + // no gradients yet! + + switch (f->type) + { case FILL_SOLID: + if (GetTagID(t)!=ST_DEFINESHAPE3) SetRGB(t,&f->color); + else SetRGBA(t,&f->color); + break; + + case FILL_TILED: + case FILL_CLIPPED: + SetU16(t,f->id_bitmap); + SetMatrix(t,&f->m); + break; + } + + return 0; +} + +int SetLineStyle(LPTAG t,LPLINESTYLE l) +{ if ((!l)||(!t)) return -1; + SetU16(t,l->width); + + if (GetTagID(t)!=ST_DEFINESHAPE3) SetRGB(t,&l->color); + else SetRGBA(t,&l->color); + + return 0; +} + +int SetShapeStyleCount(LPTAG t,U16 n) +{ if (n>254) + { SetU8(t,0xff); + SetU16(t,n); + return 3; + } + else + { SetU8(t,n); + return 1; + } +} + +int SetShapeStyles(LPTAG t,LPSHAPE s) +{ int i,l; + if (!s) return -1; + + l = 0; + l += SetShapeStyleCount(t,s->fillstyle.n); + + for (i=0;ifillstyle.n;i++) + l+=SetFillStyle(t,&s->fillstyle.data[i]); + + l += SetShapeStyleCount(t,s->linestyle.n); + + for (i=0;ilinestyle.n;i++) + l+=SetLineStyle(t,&s->linestyle.data[i]); + + return l; +} + +int ShapeCountBits(LPSHAPE s,U8 * fbits,U8 * lbits) +{ if (!s) return -1; + + s->bits.fill = CountBits(s->fillstyle.n,0); + s->bits.line = CountBits(s->linestyle.n,0); + + if (fbits) fbits[0] = s->bits.fill; + if (lbits) lbits[0] = s->bits.line; + + return 0; +} + +int SetShapeBits(LPTAG t,LPSHAPE s) +{ if ((!t)||(!s)) return -1; + ResetBitcount(t); + SetBits(t,s->bits.fill,4); + SetBits(t,s->bits.line,4); + return 0; +} + +int SetShapeHeader(LPTAG t,LPSHAPE s) +{ int res; + res = SetShapeStyles(t,s); + if (res>=0) res = ShapeCountBits(s,NULL,NULL); + if (res>=0) res = SetShapeBits(t,s); + return res; +} + +int ShapeExport(int handle,LPSHAPE s) // without Linestyle/Fillstyle Record +{ int l; + if (!s) return 0; + + l = sizeof(SHAPE); + + if (handle>=0) + if (write(handle,s,sizeof(SHAPE))!=sizeof(SHAPE)) return -1; + + // Fillstyle, Linestyle ... + + if (s->data) + { int ll = (s->bitlen+7)/8; + l+=ll; + if (handle>=0) + if (write(handle,s->data,ll)!=ll) return -1; + } + + return l; +} + +int ShapeImport(int handle,LPSHAPE * shape) +{ LPSHAPE s; + + if (handle<0) return -1; + + s = (LPSHAPE)malloc(sizeof(SHAPE)); shape[0] = s; + if (!s) return -1; + + if (read(handle,s,sizeof(SHAPE))!=sizeof(SHAPE)) + { shape[0] = NULL; + free(s); + return -1; + } + + if (s->data) + { int ll = (s->bitlen+7)/8; + s->data = (U8*)malloc(ll); + if (!s->data) + { shape[0] = NULL; + free(s); + return -1; + } + if (read(handle,s->data,ll)!=ll) + { free(s->data); + free(s); + shape[0] = NULL; + return -1; + } + } + + return 0; +} + +int ShapeAddFillStyle(LPSHAPE s,U8 type,LPMATRIX m,LPRGBA color,U16 id_bitmap) +{ RGBA def_c; + MATRIX def_m; + + // handle defaults + + if (!s) return -1; + if (!color) + { color = &def_c; + def_c.a = 0xff; + def_c.r = def_c.g = def_c.b = 0; + } + if (!m) + { m = &def_m; + GetMatrix(NULL,m); + } + + // handle memory + + if (s->fillstyle.data) + { LPFILLSTYLE new = (LPFILLSTYLE)realloc(s->fillstyle.data,(s->fillstyle.n+1)*sizeof(FILLSTYLE)); + if (!new) return -1; + s->fillstyle.data = new; + } + else + { s->fillstyle.data = (LPFILLSTYLE)malloc(sizeof(FILLSTYLE)); + s->fillstyle.n = 0; + if (!s->fillstyle.data) return -1; + } + + // set fillstyle (no gradients yet!) + + s->fillstyle.data[s->fillstyle.n].type = type; + s->fillstyle.data[s->fillstyle.n].id_bitmap = id_bitmap; + memcpy(&s->fillstyle.data[s->fillstyle.n].m,m,sizeof(MATRIX)); + memcpy(&s->fillstyle.data[s->fillstyle.n].color,color,sizeof(RGBA)); + + return (++s->fillstyle.n); +} + +int ShapeAddSolidFillStyle(LPSHAPE s,LPRGBA color) +{ return ShapeAddFillStyle(s,FILL_SOLID,NULL,color,0); +} + +int ShapeAddBitmapFillStyle(LPSHAPE s,LPMATRIX m,U16 id_bitmap,int clip) +{ return ShapeAddFillStyle(s,clip?FILL_CLIPPED:FILL_TILED,m,NULL,id_bitmap); +} + +int ShapeAddLineStyle(LPSHAPE s,U16 width,LPRGBA color) +{ RGBA def; + if (!s) return -1; + if (!color) + { color = &def; + def.a = 0xff; + def.r = def.g = def.b = 0; + } + if (s->linestyle.data) + { LPLINESTYLE new = (LPLINESTYLE)realloc(s->linestyle.data,(s->linestyle.n+1)*sizeof(LINESTYLE)); + if (!new) return -1; + s->linestyle.data = new; + } + else + { s->linestyle.data = (LPLINESTYLE)malloc(sizeof(LINESTYLE)); + s->linestyle.n = 0; + if (!s->linestyle.data) return -1; + } + + s->linestyle.data[s->linestyle.n].width = width; + memcpy(&s->linestyle.data[s->linestyle.n].color,color,sizeof(RGBA)); + + return (++s->linestyle.n); +} + +int ShapeSetMove(LPTAG t,LPSHAPE s,S32 x,S32 y) +{ U8 b; + if (!t) return -1; + SetBits(t,0,1); + SetBits(t,SF_MOVETO,5); + + b = CountBits(x,0); + b = CountBits(y,b); + + SetBits(t,b,5); + SetBits(t,x,b); + SetBits(t,y,b); + + if (s) + { s->px = x; + s->py = y; + } + return 0; +} + +int ShapeSetStyle(LPTAG t,LPSHAPE s,U16 line,U16 fill0,U16 fill1) +{ if ((!t)||(!s)) return -1; + + SetBits(t,0,1); + SetBits(t,(line?SF_LINE:0)|(fill0?SF_FILL0:0)|(fill1?SF_FILL1:0),5); + + if (fill0) SetBits(t,fill0,s->bits.fill); + if (fill1) SetBits(t,fill1,s->bits.fill); + if (line) SetBits(t,line ,s->bits.line); + + return 0; +} + +/* TODO: sometimes we want to set fillstyle 0, as that's the empty fill + used for line drawings. At the moment, we can't, as 0 fill be considered + nonexistent and therefore not set. + these defines are a workaround (they also reduce the maximal number of + fill styles to 32768) + */ +#define FILL_RESET 0x8000 +#define LINE_RESET 0x8000 +int ShapeSetAll(LPTAG t,LPSHAPE s,S32 x,S32 y,U16 line,U16 fill0,U16 fill1) +{ U8 b; + if ((!t)||(!s)) return -1; + + SetBits(t,0,1); + SetBits(t,SF_MOVETO|(line?SF_LINE:0)|(fill0?SF_FILL0:0)|(fill1?SF_FILL1:0),5); + + b = CountBits(x,0); + b = CountBits(y,b); + SetBits(t,b,5); + SetBits(t,x,b); + SetBits(t,y,b); + s->px = x; + s->py = y; + + if (fill0) SetBits(t,fill0,s->bits.fill); + if (fill1) SetBits(t,fill1,s->bits.fill); + if (line) SetBits(t,line ,s->bits.line); + + return 0; +} + +int ShapeSetEnd(LPTAG t) +{ if (!t) return -1; + SetBits(t,0,6); + return 0; +} + +int ShapeSetLine(LPTAG t,LPSHAPE s,S32 x,S32 y) +{ U8 b; + if (!t) return -1; + SetBits(t,3,2); // Straight Edge + + if ((!s)||(s->px!=x)||(s->py!=y)) + { b = CountBits(x,2); + b = CountBits(y,b); + SetBits(t,b-2,4); + SetBits(t,1,1); + SetBits(t,x,b); + SetBits(t,y,b); + if (s) + { s->px += x; + s->py += y; + } + return 0; + } + + if (s->px==x) + { b = CountBits(y,2); + SetBits(t,b-2,4); + SetBits(t,1,2); + SetBits(t,y,b); + s->py += y; + } + else + { b = CountBits(x,2); + SetBits(t,b-2,4); + SetBits(t,0,2); + SetBits(t,x,b); + s->px += x; + } + return 0; +} + +int ShapeSetCurve(LPTAG t,LPSHAPE s,S32 x,S32 y,S32 ax,S32 ay) +{ U8 b; + if (!t) return -1; + + SetBits(t,2,2); + + b = CountBits(ax,2); + b = CountBits(ay,b); + b = CountBits(x,b); + b = CountBits(y,b); + + SetBits(t,b-2,4); + SetBits(t,x,b); + SetBits(t,y,b); + SetBits(t,ax,b); + SetBits(t,ay,b); + + if (s) + { s->px += x+ax; + s->py += y+ay; + } + return 0; +} + +int ShapeSetCircle(LPTAG t,LPSHAPE s,S32 x,S32 y,S32 rx,S32 ry) +{ double C1 = 0.2930; + double C2 = 0.4140; + double begin = 0.7070; + + if (!t) return -1; + + ShapeSetMove(t,s,x+begin*rx,y+begin*ry); + ShapeSetCurve(t,s, -C1*rx, C1*ry, -C2*rx, 0); + ShapeSetCurve(t,s, -C2*rx, 0, -C1*rx, -C1*ry); + ShapeSetCurve(t,s, -C1*rx, -C1*ry, 0, -C2*ry); + ShapeSetCurve(t,s, 0, -C2*ry, C1*rx, -C1*ry); + ShapeSetCurve(t,s, C1*rx, -C1*ry, C2*rx, 0); + ShapeSetCurve(t,s, C2*rx, 0, C1*rx, C1*ry); + ShapeSetCurve(t,s, C1*rx, C1*ry, 0, C2*ry); + ShapeSetCurve(t,s, 0, C2*ry, -C1*rx, C1*ry); + + return 0; +} + diff --git a/lib/modules/swftext.c b/lib/modules/swftext.c new file mode 100644 index 00000000..3c9eb076 --- /dev/null +++ b/lib/modules/swftext.c @@ -0,0 +1,503 @@ +/* swftext.c + + Text and font routines + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + +#define TF_TEXTCONTROL 0x80 +#define TF_HASFONT 0x08 +#define TF_HASCOLOR 0x04 +#define TF_HASYOFFSET 0x02 +#define TF_HASXOFFSET 0x01 + +#define FF_WIDECODES 0x01 +#define FF_BOLD 0x02 +#define FF_ITALIC 0x04 +#define FF_ANSI 0x08 +#define FF_SHIFTJIS 0x10 +#define FF_UNICODE 0x20 + +int FontEnumerate(LPSWF swf,void (*FontCallback) (U16,U8*)) +{ int n; + LPTAG t; + if (!swf) return -1; + t = swf->FirstTag; + n = 0; + + while (t) + { if (GetTagID(t)==ST_DEFINEFONTINFO) + { n++; + if (FontCallback) + { U16 id; + int l; + U8 s[257]; + SaveTagPos(t); + SetTagPos(t,0); + + id = GetU16(t); + l = GetU8(t); + GetBlock(t,s,l); + s[l] = 0; + + (FontCallback)(id,s); + + RestoreTagPos(t); + } + } + t = NextTag(t); + } + return n; +} + +int FontExtract_DefineFont(int id,LPSWFFONT f,LPTAG t,LPSHAPE * shapes) +{ U16 fid; + SaveTagPos(t); + SetTagPos(t,0); + + fid = GetU16(t); + if ((!id)||(id==fid)) + { U16 ofs[MAX_CHAR_PER_FONT]; + int n,i; + + id = fid; + f->id = fid; + + ofs[0] = GetU16(t); + n = ofs[0]/2; + + for (i=1;iname) free(f->name); + f->name = (U8*)malloc(l+1); + if (f->name) + { GetBlock(t,f->name,l); + f->name[l] = 0; + } + else + { RestoreTagPos(t); + return -1; + } + } + f->flags = GetU8(t); + + i = 0; + while (shapes[i]) + { U16 code = ((f->flags&FF_WIDECODES)?GetU16(t):GetU8(t))%MAX_CHAR_PER_FONT; + + f->glyph[code].shape = shapes[i]; + f->glyph[code].gid = i; + if (icodes[i] = code; + + i++; + } + } + + RestoreTagPos(t); + return id; +} + +#define FEDTJ_PRINT 0x01 +#define FEDTJ_MODIFY 0x02 + +int FontExtract_DefineText(int id,LPSWFFONT f,LPTAG t,int jobs) +{ U16 cid; + SRECT r; + MATRIX m; + U8 gbits, abits, flags; + int fid; + + fid = 0; + + SaveTagPos(t); + SetTagPos(t,0); + + cid = GetU16(t); + GetRect(t,&r); + GetMatrix(t,&m); + gbits = GetU8(t); + abits = GetU8(t); + + flags = GetU8(t); + + while(flags) + { if (flags&TF_TEXTCONTROL) + { if (flags&TF_HASFONT) fid = GetU16(t); + if (flags&TF_HASCOLOR) + { GetU8(t); // rgb + GetU8(t); + GetU8(t); + if (GetTagID(t)==ST_DEFINETEXT2) GetU8(t); + } + if (flags&TF_HASXOFFSET) GetS16(t); + if (flags&TF_HASYOFFSET) GetS16(t); + if (flags&TF_HASFONT) GetU16(t); + } + else + { int i; + for (i=0;icodes[glyph]; + if (jobs&FEDTJ_PRINT) printf("%c",code); + if (jobs&FEDTJ_MODIFY) + /*if (f->glyph[code].advance)*/ f->glyph[code].advance = adv; + } + } + if ((id==fid)&&(jobs&FEDTJ_PRINT)) printf("\n"); + } + flags = GetU8(t); + } + + RestoreTagPos(t); + return id; +} + +int FontExtract(LPSWF swf,int id,LPSWFFONT * font) +{ LPTAG t; + LPSWFFONT f; + LPSHAPE shapes[MAX_CHAR_PER_FONT]; + + if ((!swf)||(!font)) return -1; + + f = (LPSWFFONT)malloc(sizeof(SWFFONT)); font[0] = f; + if (!f) return -1; + + memset(shapes,0x00,sizeof(shapes)); + memset(f,0x00,sizeof(SWFFONT)); + + t = swf->FirstTag; + + while (t) + { int nid = 0; + switch (GetTagID(t)) + { case ST_DEFINEFONT: + nid = FontExtract_DefineFont(id,f,t,shapes); + break; + + case ST_DEFINEFONTINFO: + nid = FontExtract_DefineFontInfo(id,f,t,shapes); + break; + + case ST_DEFINETEXT: + case ST_DEFINETEXT2: + nid = FontExtract_DefineText(id,f,t,FEDTJ_MODIFY); + break; + } + if (nid>0) id = nid; + t = NextTag(t); + } + return 0; +} + +int FontIsItalic(LPSWFFONT f) { return f->flags&FF_ITALIC; } +int FontIsBold(LPSWFFONT f) { return f->flags&FF_BOLD; } + +int FontSetID(LPSWFFONT f,U16 id) { if (!f) return -1; f->id = id; return 0; } + +int FontReduce(LPSWFFONT f,LPFONTUSAGE use) +{ int i,j; + if ((!f)||(!use)) return -1; + + memset(&f->codes,0x00,sizeof(f->codes)); + + j = 0; + for (i=0;iglyph[i].shape) + { if (use->code[i]) + { f->glyph[i].gid = j; + f->codes[j] = i; + j++; + } + else + { ShapeFree(f->glyph[i].shape); + f->glyph[i].shape = 0; + f->glyph[i].gid = 0; + f->glyph[i].advance = 0; + } + } else f->glyph[i].gid = 0; + + return j; +} + +int FontInitUsage(LPFONTUSAGE use) +{ if (!use) return -1; + memset(&use->code,0x00,sizeof(use->code)); + return 0; +} + +int FontUse(LPFONTUSAGE use,U8 * s) +{ if ((!use)||(!s)) return -1; + while (s[0]) + { use->code[s[0]] = 1; + s++; + } + return 0; +} + +int FontSetDefine(LPTAG t,LPSWFFONT f) +{ U16 ofs[MAX_CHAR_PER_FONT]; + int p,i,j; + + if ((!t)||(!f)) return -1; + ResetBitcount(t); + SetU16(t,f->id); + + p = 0; j = 0; + for (i=0;iglyph[i].shape) + { ofs[j++] = p; + p+=SetSimpleShape(NULL,f->glyph[i].shape); + } + + for (i=0;iglyph[i].shape) + SetSimpleShape(t,f->glyph[i].shape); + + ResetBitcount(t); + return 0; +} + +int FontSetInfo(LPTAG t,LPSWFFONT f) +{ int l,i; + if ((!t)||(!f)) return -1; + ResetBitcount(t); + SetU16(t,f->id); + l = strlen(f->name); if (l>255) l = 255; + SetU8(t,l); + SetBlock(t,f->name,l); + SetU8(t,f->flags&0xfe); // no Wide-Codes + + for (i=0;iglyph[i].shape) + SetU8(t,i); + + return 0; +} + +int FontExport(int handle,LPSWFFONT f) +{ int l; + int i; + if (!f) return 0; + + l = sizeof(SWFFONT); + if (handle>=0) + if (write(handle,f,sizeof(SWFFONT))!=sizeof(SWFFONT)) return -1; + + if (f->name) + { U16 ln = strlen(f->name); + l+=2+ln; + if (handle>=0) + { if (write(handle,&ln,2)!=2) return -1; + if (write(handle,f->name,ln)!=ln) return -1; + } + } + + if (f->layout) + { l+=sizeof(SWFLAYOUT); + if (handle>=0) + if (write(handle,f->layout,sizeof(SWFLAYOUT))!=sizeof(SWFLAYOUT)) return -1; + if (f->layout->kerning.data) + { l+=f->layout->kerning.count*4; + if (handle>=0) + if (write(handle,f->layout->kerning.data,f->layout->kerning.count*4)!=f->layout->kerning.count*4) return -1; + } + } + + for (i=0;iglyph[i].shape) + { int ll = ShapeExport(handle,f->glyph[i].shape); + if (ll<0) return -1; + l+=ll; + } + } + + return l; +} + +int FontImport(int handle,LPSWFFONT * font) +{ LPSWFFONT f; + int layout; + int i = 0; + + if ((!font)||(handle<0)) return -1; + + f = (LPSWFFONT)malloc(sizeof(SWFFONT)); font[0] = f; + if (!f) return -1; + + memset(f,0x00,sizeof(SWFFONT)); + + if (read(handle,f,sizeof(SWFFONT))!=sizeof(SWFFONT)) goto fehler; + + layout = (f->layout)?1:0; // avoid illegal free() + f->layout = NULL; + + if (f->name) + { U16 ln; + f->name = NULL; + if (read(handle,&ln,2)!=2) goto fehler; + f->name = (U8*)malloc(ln+1); + if (!f->name) goto fehler; + if (read(handle,f->name,ln)!=ln) goto fehler; + f->name[ln] = 0; + } + + if (f->layout) + { f->layout = (LPSWFLAYOUT)malloc(sizeof(SWFLAYOUT)); + if (!f->layout) goto fehler; + if (read(handle,f->layout,sizeof(SWFLAYOUT))!=sizeof(SWFLAYOUT)) goto fehler; + if (f->layout->kerning.data) + { int l = f->layout->kerning.count*4; + f->layout->kerning.data = (U8*)malloc(l); + if (!f->layout->kerning.data) goto fehler; + if (read(handle,f->layout->kerning.data,l)!=l) goto fehler; + } + } + + for (i=0;iglyph[i].shape) + { if (ShapeImport(handle,&f->glyph[i].shape)<0) goto fehler; + } + } + + f->id = 0; + + return 0; + +fehler: + if (f) for (;iglyph[i].shape = NULL; + FontFree(f); + font[0] = NULL; + return -1; +} + +int TextPrintDefineText(LPTAG t,LPSWFFONT f) +{ int id = GetTagID(t); + if ((id==ST_DEFINETEXT)||(id==ST_DEFINETEXT2)) FontExtract_DefineText(f->id,f,t,FEDTJ_PRINT); + else return -1; + return 0; +} + +void LayoutFree(LPSWFLAYOUT l) +{ if (l) + { if (l->kerning.data) free(l->kerning.data); + l->kerning.data = NULL; + } + free(l); +} + +void FontFree(LPSWFFONT f) +{ if (f) + { int i; + + if (f->name) free(f->name); + if (f->layout) LayoutFree(f->layout); + + f->name = NULL; + f->layout = NULL; + + for (i=0;iglyph[i].shape) + { ShapeFree(f->glyph[i].shape); + f->glyph[i].shape = NULL; + } + } + free(f); +} + +int TextSetInfoRecord(LPTAG t,LPSWFFONT font,U16 size,LPRGBA color,S16 dx,S16 dy) +{ U8 flags; + if (!t) return -1; + + flags = TF_TEXTCONTROL|(font?TF_HASFONT:0)|(color?TF_HASCOLOR:0)|(dx?TF_HASXOFFSET:0)|(dy?TF_HASYOFFSET:0); + + SetU8(t,flags); + if (font) SetU16(t,font->id); + if (color) + { if (GetTagID(t)==ST_DEFINETEXT2) SetRGBA(t,color); + else SetRGB(t,color); + } + if (dx) SetS16(t,dx); + if (dy) SetS16(t,dy); + if (font) SetU16(t,size); + + return 0; +} + +int TextCountBits(LPSWFFONT font,U8 * s,int scale,U8 * gbits,U8 * abits) +{ U16 g,a; + if ((!s)||(!font)||((!gbits)&&(!abits))) return -1; + g = a = 0; + + while(s[0]) + { g = CountBits(font->glyph[s[0]].gid,g); + a = CountBits((((U32)font->glyph[s[0]].advance)*scale)/100,a); + s++; + } + + if (gbits) gbits[0] = (U8)g; + if (abits) abits[0] = (U8)a; + + return 0; +} + +int TextSetCharRecord(LPTAG t,LPSWFFONT font,U8 * s,int scale,U8 gbits,U8 abits) +{ int l,i; + + if ((!t)||(!font)||(!s)) return -1; + + l = strlen(s); + if (l>0x7f) l = 0x7f; + SetU8(t,l); + + for (i=0;iglyph[s[i]].gid,gbits); + SetBits(t,(((U32)font->glyph[s[i]].advance)*scale)/100,abits); + } + + ResetBitcount(t); + return 0; +} + +U32 TextGetWidth(LPSWFFONT font,U8 * s,int scale) +{ U32 res = 0; + + if (font&&s) + { while (s[0]) + { res += font->glyph[s[0]].advance; + s++; + } + if (scale) res = (res*scale)/100; + } + + return res; +} diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c new file mode 100644 index 00000000..7f3865b0 --- /dev/null +++ b/lib/modules/swftools.c @@ -0,0 +1,260 @@ +/* swftools.c + + Math and matrix functions, misc tools + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + +// Matrix & Math tools for SWF files + +#define S64 long long +SFIXED SP(SFIXED a1,SFIXED a2,SFIXED b1,SFIXED b2) +{ S64 a; + a = (S64)a1*(S64)b1+(S64)a2*(S64)b2; + return (SFIXED)(a>>16); +} +SFIXED QFIX(int zaehler,int nenner) // bildet Quotient von zwei INTs in SFIXED +{ S64 z = zaehler<<16; + S64 a = z/(S64)nenner; + return (SFIXED)a; +} +#undef S64 + +LPMATRIX MatrixJoin(LPMATRIX d,LPMATRIX s1,LPMATRIX s2) +{ + if (!d) return NULL; + if (!s1) return (s2)?(LPMATRIX)memcpy(d,s2,sizeof(MATRIX)):NULL; + if (!s2) return (LPMATRIX)memcpy(d,s1,sizeof(MATRIX)); + + d->tx = s1->tx + s2->tx; + d->ty = s1->ty + s2->ty; + + d->sx = SP(s1->sx,s1->r1,s2->sx,s2->r0); + d->sy = SP(s1->r0,s1->sy,s2->r1,s2->sy); + d->r0 = SP(s1->r0,s1->sy,s2->sx,s2->r0); + d->r1 = SP(s1->sx,s1->r1,s2->r1,s2->sy); + + //DumpMatrix(NULL,d); + + return d; +} + +LPMATRIX MatrixMapTriangle(LPMATRIX m,int dx,int dy,int x0,int y0, + int x1,int y1,int x2,int y2) +{ int dx1 = x1 - x0; + int dy1 = y1 - y0; + int dx2 = x2 - x0; + int dy2 = y2 - y0; + + if (!m) return NULL; + if ((!dx)||(!dy)) return NULL; // check DIV by zero + + m->tx = x0; + m->ty = y0; + m->sx = QFIX(dx1,dx); + m->sy = QFIX(dy2,dy); + m->r0 = QFIX(dy1,dx); + m->r1 = QFIX(dx2,dy); + + return m; +} + +U16 GetDefineID(LPTAG t) +// up to SWF 4.0 +{ U32 oldTagPos; + U16 id = 0; + + oldTagPos = GetTagPos(t); + SetTagPos(t,0); + + switch (GetTagID(t)) + { case ST_DEFINESHAPE: + case ST_DEFINESHAPE2: + case ST_DEFINESHAPE3: + case ST_DEFINEMORPHSHAPE: + case ST_DEFINEBITS: + case ST_DEFINEBITSJPEG2: + case ST_DEFINEBITSJPEG3: + case ST_DEFINEBITSLOSSLESS: + case ST_DEFINEBITSLOSSLESS2: + case ST_DEFINEBUTTON: + case ST_DEFINEBUTTON2: + case ST_DEFINEBUTTONCXFORM: + case ST_DEFINEBUTTONSOUND: + case ST_DEFINEFONT: + case ST_DEFINEFONT2: + case ST_DEFINEFONTINFO: + case ST_DEFINETEXT: + case ST_DEFINETEXT2: + case ST_DEFINESOUND: + case ST_DEFINESPRITE: + id = GetU16(t); + break; + } + + SetTagPos(t,oldTagPos); + + return id; +} + +U16 GetPlaceID(LPTAG t) +// up to SWF 4.0 +{ U32 oldTagPos; + U16 id = 0; + + oldTagPos = GetTagPos(t); + SetTagPos(t,0); + + switch (GetTagID(t)) + { case ST_PLACEOBJECT: + case ST_REMOVEOBJECT: + case ST_STARTSOUND: + id = GetU16(t); + break; + + case ST_PLACEOBJECT2: + { U8 flags = GetU8(t); + U16 d = GetU16(t); + id = (flags&PF_CHAR)?GetU16(t):id; + } break; + + } + + SetTagPos(t,oldTagPos); + + return id; +} + +int definingtagids[] = +{ST_DEFINESHAPE, + ST_DEFINESHAPE2, + ST_DEFINESHAPE3, + ST_DEFINEMORPHSHAPE, + ST_DEFINEFONT, + ST_DEFINEFONT2, + ST_DEFINETEXT, + ST_DEFINETEXT2, + ST_DEFINEEDITTEXT, + ST_DEFINEBITS, + ST_DEFINEBITSJPEG2, + ST_DEFINEBITSJPEG3, + ST_DEFINEBITSLOSSLESS, + ST_DEFINEBITSLOSSLESS2, + ST_DEFINEMOVIE, + ST_DEFINESPRITE, + ST_DEFINEBUTTON, + ST_DEFINEBUTTON2, + ST_DEFINESOUND, + -1 +}; + +// tags which may be used inside a sprite definition +int spritetagids[] = +{ST_SHOWFRAME, + ST_PLACEOBJECT, + ST_PLACEOBJECT2, + ST_REMOVEOBJECT, + ST_REMOVEOBJECT2, //? + ST_DOACTION, + ST_STARTSOUND, + ST_FRAMELABEL, + ST_SOUNDSTREAMHEAD, + ST_SOUNDSTREAMHEAD2, + ST_SOUNDSTREAMBLOCK, + ST_END, + -1 +}; + +char isAllowedSpriteTag (TAG*tag) +{ + int id = tag->id; + int t=0; + while(spritetagids[t]>=0) + { + if(spritetagids[t] == id) + return 1; + t++; + } + return 0; +} + +char isDefiningTag (TAG*tag) +{ + int id = tag->id; + int t=0; + while(definingtagids[t]>=0) + { + if(definingtagids[t] == id) + return 1; + t++; + } + return 0; +} + +U16 GetDepth(LPTAG t) +// up to SWF 4.0 +{ + U16 depth = 0; + U32 oldTagPos; + oldTagPos = GetTagPos(t); + SetTagPos(t,0); + + switch (GetTagID(t)) + { case ST_PLACEOBJECT: + case ST_REMOVEOBJECT: + GetU16(t); //id + depth = GetU16(t); + break; + case ST_REMOVEOBJECT2: + depth = GetU16(t); + break; + case ST_PLACEOBJECT2: + { U8 flags = GetU8(t); + depth = GetU16(t); + } break; + } + SetTagPos(t,oldTagPos); + return depth; +} + +char* GetName(LPTAG t) +{ + char* name = 0; + U32 oldTagPos; + MATRIX m; + CXFORM c; + oldTagPos = GetTagPos(t); + SetTagPos(t,0); + switch(GetTagID(t)) + { + case ST_FRAMELABEL: + name = GetTagPosPtr(t); + break; + case ST_PLACEOBJECT2: { + U8 flags = GetU8(t); + GetU16(t); //depth; + if(flags&PF_CHAR) + GetU16(t); //id + if(flags&PF_MATRIX) + GetMatrix(t, &m); + if(flags&PF_CXFORM) + GetCXForm(t, &c, 1); + if(flags&PF_RATIO) + GetU16(t); + if(flags&PF_NAME) { + ResetBitmask(t); + name = GetTagPosPtr(t); + } + } + break; + } + SetTagPos(t,oldTagPos); + return name; +} + diff --git a/lib/rfxswf.c b/lib/rfxswf.c new file mode 100644 index 00000000..2912350f --- /dev/null +++ b/lib/rfxswf.c @@ -0,0 +1,809 @@ +/* rfxswf.c + + Library for creating and reading SWF files or parts of it. + There's a module directory which provides some extended functionality. + Most modules are included at the bottom of this file. + + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + +#include "rfxswf.h" + +#include +#define _JPEGLIB_INCLUDED_ + +// Win32 support may be broken since it was only tested in an older version for Watcom C +#ifdef __NT__ +# include +# include +# include +# ifdef DEBUG_RFXSWF +# include +# endif +#else +#endif + +// internal constants + +#define MALLOC_SIZE 128 +#define INSERT_RFX_TAG + +#define MEMSIZE(l) (((l/MALLOC_SIZE)+1)*MALLOC_SIZE) + +// inline wrapper functions + +LPTAG NextTag(LPTAG t) { return t->next; } +LPTAG PrevTag(LPTAG t) { return t->prev; } +int GetFrameNo(LPTAG t) { return t->frame; } +U16 GetTagID(LPTAG t) { return t->id; } +U32 GetDataSize(LPTAG t) { return t->len; } +U32 GetTagPos(LPTAG t) { return t->pos; } +U8* GetTagPosPtr(LPTAG t) { return &t->data[t->pos]; } + +// Basic Data Access Functions + +#define ResetBitmask(tag) if (tag->bitmask) { tag->pos++; tag->bitmask = 0; } +#define ResetBitcount(tag) if (tag->bitcount) { tag->bitcount = 0; } + +// for future purpose: avoid high level lib functions to change tagpos/bitcount + +#define SaveTagPos(tag) +#define RestoreTagPos(tag) + +void SetTagPos(LPTAG t,U32 pos) +{ ResetBitmask(t); + if (pos<=t->len) t->pos = pos; + #ifdef DEBUG_RFXSWF + else fprintf(stderr,"SetTagPos() out of bounds: TagID = %i\n",t->id); + #endif +} + +U8 GetU8(LPTAG t) +{ ResetBitmask(t); + #ifdef DEBUG_RFXSWF + if (t->pos>=t->len) + { fprintf(stderr,"GetU8() out of bounds: TagID = %i\n",t->id); + return 0; + } + #endif + return t->data[t->pos++]; +} + +U16 GetU16(LPTAG t) +{ U16 res; + ResetBitmask(t); + #ifdef DEBUG_RFXSWF + if (t->pos>(t->len-2)) + { fprintf(stderr,"GetU16() out of bounds: TagID = %i\n",t->id); + return 0; + } + #endif + res = t->data[t->pos] | (t->data[t->pos+1]<<8); + t->pos+=2; + return res; +} + +U32 GetU32(LPTAG t) +{ U32 res; + ResetBitmask(t); + #ifdef DEBUG_RFXSWF + if (t->pos>(t->len-4)) + { fprintf(stderr,"GetU32() out of bounds: TagID = %i\n",t->id); + return 0; + } + #endif + res = t->data[t->pos] | (t->data[t->pos+1]<<8) | + (t->data[t->pos+2]<<16) | (t->data[t->pos+3]<<24); + t->pos+=4; + return res; +} + +int GetBlock(LPTAG t,U8 * b,int l) +// returns number of bytes written (<=l) +// b = NULL -> skip data +{ ResetBitmask(t); + if ((t->len-t->pos)len-t->pos; + if (b && l) memcpy(b,&t->data[t->pos],l); + t->pos+=l; + return l; +} + +int SetBlock(LPTAG t,U8 * b,int l) +// Appends Block to the end of Tagdata, returns size +{ U32 newlen = t->len + l; + ResetBitcount(t); + if (newlen>t->memsize) + { U32 newmem = MEMSIZE(newlen); + U8 * newdata = (U8*)((t->data)?realloc(t->data,newmem):malloc(newmem)); + if (!newdata) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"Fatal Error: malloc()/realloc() failed.\n"); + #endif + return 0; + } + t->memsize = newmem; + t->data = newdata; + } + if (b) memcpy(&t->data[t->len],b,l); + else memset(&t->data[t->len],0x00,l); + t->len+=l; + return l; +} + +int SetU8(LPTAG t,U8 v) +{ ResetBitcount(t); + if ((t->len+1)>t->memsize) return (SetBlock(t,&v,1)==1)?0:-1; + t->data[t->len++] = v; + return 0; +} + +int SetU16(LPTAG t,U16 v) +{ U8 a[2]; + a[0] = v&0xff; + a[1] = v>>8; + + ResetBitcount(t); + if ((t->len+2)>t->memsize) return (SetBlock(t,a,2)==2)?0:-1; + t->data[t->len++] = a[0]; + t->data[t->len++] = a[1]; + return 0; +} + +int SetU32(LPTAG t,U32 v) +{ U8 a[4]; + a[0] = v&0xff; // to ensure correct handling of non-intel byteorder + a[1] = (v>>8)&0xff; + a[2] = (v>>16)&0xff; + a[3] = (v>>24)&0xff; + + ResetBitcount(t); + if ((t->len+4)>t->memsize) return (SetBlock(t,a,4)==4)?0:-1; + t->data[t->len++] = a[0]; + t->data[t->len++] = a[1]; + t->data[t->len++] = a[2]; + t->data[t->len++] = a[3]; + return 0; +} + +U32 GetBits(LPTAG t,int nbits) +{ U32 res = 0; + if (!nbits) return 0; + if (!t->bitmask) t->bitmask = 0x80; + while (nbits) + { res<<=1; + if (t->data[t->pos]&t->bitmask) res|=1; + t->bitmask>>=1; + nbits--; + if (!t->bitmask) + { if (nbits) t->bitmask = 0x80; + #ifdef DEBUG_RFXSWF + if (t->pos>=t->len) + { fprintf(stderr,"GetBits() out of bounds: TagID = %i\n",t->id); + return res; + } + #endif + t->pos++; + } + } + return res; +} + +S32 GetSBits(LPTAG t,int nbits) +{ U32 res = GetBits(t,nbits); + if (res&(1<<(nbits-1))) res|=(0xffffffff<bitcount) + { if (FAILED(SetU8(t,0))) return -1; + t->bitcount = 0x80; + } + if (v&bm) t->data[t->len-1] |= t->bitcount; + bm>>=1; + t->bitcount>>=1; + nbits--; + } + return 0; +} + +// Advanced Data Access Functions + +int SetRGB(LPTAG t,LPRGBA col) +{ if (!t) return -1; + if (col) + { SetU8(t,col->r); + SetU8(t,col->g); + SetU8(t,col->b); + } else SetBlock(t,NULL,3); + return 0; +} + +int SetRGBA(LPTAG t,LPRGBA col) +{ if (!t) return -1; + if (col) + { SetU8(t,col->r); + SetU8(t,col->g); + SetU8(t,col->b); + SetU8(t,col->a); + } else SetBlock(t,NULL,4); + return 0; +} + +int CountBits(U32 v,int nbits) +{ int n = 33; + U32 m = 0x80000000; + if (!v) n = 0; else + if (v&m) + { while (v&m) + { n--; + m>>=1; + if (!m) break; + } + } + else + { while (!(v&m)) + { n--; + m>>=1; + if (!m) break; + } + } + return (n>nbits)?n:nbits; +} + +int GetRect(LPTAG t,LPSRECT r) +{ int nbits; + SRECT dummy; + if (!r) r = &dummy; + nbits = (int) GetBits(t,5); + r->xmin = GetSBits(t,nbits); + r->xmax = GetSBits(t,nbits); + r->ymin = GetSBits(t,nbits); + r->ymax = GetSBits(t,nbits); + return 0; +} + +int SetRect(LPTAG t,LPSRECT r) +{ int nbits; + + nbits = CountBits(r->xmin,0); + nbits = CountBits(r->xmax,nbits); + nbits = CountBits(r->ymin,nbits); + nbits = CountBits(r->ymax,nbits); + + SetBits(t,nbits,5); + SetBits(t,r->xmin,nbits); + SetBits(t,r->xmax,nbits); + SetBits(t,r->ymin,nbits); + SetBits(t,r->ymax,nbits); + + return 0; +} + +int GetMatrix(LPTAG t,LPMATRIX m) +{ MATRIX dummy; + int nbits; + + if (!m) m = &dummy; + + if (!t) + { m->sx = m->sy = 0x10000; + m->r0 = m->r1 = 0; + m->tx = m->ty = 0; + return -1; + } + + ResetBitmask(t); + + if (GetBits(t,1)) + { nbits = GetBits(t,5); + m->sx = GetSBits(t,nbits); + m->sy = GetSBits(t,nbits); + } + else m->sx = m->sy = 0x10000; + + if (GetBits(t,1)) + { nbits = GetBits(t,5); + m->r0 = GetSBits(t,nbits); + m->r1 = GetSBits(t,nbits); + } + else m->r0 = m->r1 = 0x0; + + nbits = GetBits(t,5); + m->tx = GetSBits(t,nbits); + m->ty = GetSBits(t,nbits); + + return 0; +} + +int SetMatrix(LPTAG t,LPMATRIX m) +{ int nbits; + MATRIX ma; + + if (!m) + { m = &ma; + ma.sx = ma.sy = 0x10000; + ma.r0 = ma.r1 = 0; + ma.tx = ma.ty = 0; + } + + ResetBitcount(t); + + if ((m->sx==0x10000)&&(m->sy==0x10000)) SetBits(t,0,1); + else + { SetBits(t,1,1); + nbits = CountBits(m->sx,0); + nbits = CountBits(m->sy,nbits); + SetBits(t,nbits,5); + SetBits(t,m->sx,nbits); + SetBits(t,m->sy,nbits); + } + + if ((!m->r0)&&(!m->r1)) SetBits(t,0,1); + else + { SetBits(t,1,1); + nbits = CountBits(m->r0,0); + nbits = CountBits(m->r1,nbits); + SetBits(t,nbits,5); + SetBits(t,m->r0,nbits); + SetBits(t,m->r1,nbits); + } + + nbits = CountBits(m->tx,0); + nbits = CountBits(m->ty,nbits); + SetBits(t,nbits,5); + SetBits(t,m->tx,nbits); + SetBits(t,m->ty,nbits); + + return 0; +} + +int GetCXForm(LPTAG t,LPCXFORM cx,U8 alpha) //FIXME: alpha should be type bool +{ CXFORM cxf; + int hasadd; + int hasmul; + int nbits; + + if (!cx) cx = &cxf; + + cx->a0 = cx->r0 = cx->g0 = cx->b0 = 256; + cx->a1 = cx->r1 = cx->g1 = cx->b1 = 0; + + if (!t) return 0; + + ResetBitmask(t); + hasadd = GetBits(t,1); + hasmul = GetBits(t,1); + nbits = GetBits(t,4); + + if (hasmul) + { cx->r0 = (S16)GetSBits(t,nbits); + cx->g0 = (S16)GetSBits(t,nbits); + cx->b0 = (S16)GetSBits(t,nbits); + if (alpha) + cx->a0 = (S16)GetSBits(t,nbits); + } + + if (hasadd) + { cx->r1 = (S16)GetSBits(t,nbits); + cx->g1 = (S16)GetSBits(t,nbits); + cx->b1 = (S16)GetSBits(t,nbits); + if (alpha) + cx->a1 = (S16)GetSBits(t,nbits); + } + + return 0; +} + +int SetCXForm(LPTAG t,LPCXFORM cx,U8 alpha) +{ CXFORM cxf; + int hasadd; + int hasmul; + int nbits; + + if (!cx) + { cx = &cxf; + cx->a0 = cx->r0 = cx->g0 = cx->b0 = 256; + cx->a1 = cx->r1 = cx->g1 = cx->b1 = 0; + } + + if (!alpha) + { cx->a0 = 256; + cx->a1 = 0; + } + + nbits = 0; + + hasmul = (cx->a0!=256)||(cx->r0!=256)||(cx->g0!=256)||(cx->b0!=256); + hasadd = cx->a1|cx->r1|cx->g1|cx->b1; + + if (hasmul) + { if (alpha) nbits = CountBits((S32)cx->a0,nbits); + nbits = CountBits((S32)cx->r0,nbits); + nbits = CountBits((S32)cx->g0,nbits); + nbits = CountBits((S32)cx->b0,nbits); + } + + if (hasadd) + { if (alpha) nbits = CountBits((S32)cx->a1,nbits); + nbits = CountBits((S32)cx->r1,nbits); + nbits = CountBits((S32)cx->g1,nbits); + nbits = CountBits((S32)cx->b1,nbits); + } + + ResetBitcount(t); + SetBits(t,hasadd?1:0,1); + SetBits(t,hasmul?1:0,1); + SetBits(t,nbits,4); + + if (hasmul) + { SetBits(t,cx->r0,nbits); + SetBits(t,cx->g0,nbits); + SetBits(t,cx->b0,nbits); + if (alpha) SetBits(t,cx->a0,nbits); + } + + if (hasadd) + { SetBits(t,cx->r1,nbits); + SetBits(t,cx->g1,nbits); + SetBits(t,cx->b1,nbits); + if (alpha) SetBits(t,cx->a1,nbits); + } + + return 0; +} + +int GetPoint(LPTAG t,LPSPOINT p) { return 0; } +int SetPoint(LPTAG t,LPSPOINT p) { return 0; } + +// Tag List Manipulating Functions + +int RFXSWF_UpdateFrame(LPTAG t,S8 delta) +// returns number of frames +{ int res = -1; + while (t) + { t->frame+=delta; + res = t->frame; + t = t->next; + } + return res; +} + +#define UpdateFrame(a,b) RFXSWF_UpdateFrame(a,b) + +LPTAG InsertTag(LPTAG after,U16 id) // updates frames, if nescessary +{ LPTAG t; + + t = (LPTAG)malloc(sizeof(TAG)); + if (t) + { memset(t,0x00,sizeof(TAG)); + t->id = id; + + if (after) + { t->frame = after->frame; + t->prev = after; + t->next = after->next; + after->next = t; + if (t->next) t->next->prev = t; + + if (id==ST_SHOWFRAME) UpdateFrame(t->next,+1); + } + } + return t; +} + +int DeleteTag(LPTAG t) +{ if (!t) return -1; + + if (t->id==ST_SHOWFRAME) UpdateFrame(t->next,-1); + + if (t->prev) t->prev->next = t->next; + if (t->next) t->next->prev = t->prev; + + if (t->data) free(t->data); + free(t); + return 0; +} + +LPTAG RFXSWF_ReadTag(int handle,LPTAG prev) +{ LPTAG t; + U16 raw; + U32 len; + int id; + + if (read(handle,&raw,2)!=2) return NULL; + + len = raw&0x3f; + id = raw>>6; + + if (len==0x3f) + { if (read(handle,&len,4)!=4) return NULL; + } + + if (id==ST_DEFINESPRITE) len = 2*sizeof(U16); + // Sprite handling fix: Flaten sprite tree + + t = (LPTAG)malloc(sizeof(TAG)); + + if (!t) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"Fatal Error: malloc()/realloc() failed.\n"); + #endif + return NULL; + } + + memset(t,0x00,sizeof(TAG)); + + t->len = len; + t->id = id; + + if (t->len) + { t->data = (U8*)malloc(t->len); + if (!t->data) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"Fatal Error: malloc()/realloc() failed.\n"); + #endif + return NULL; + } + t->memsize = t->len; + if (read(handle,t->data,t->len)!=t->len) return NULL; + } + + if (prev) + { t->frame = prev->frame+((prev->id==ST_SHOWFRAME)?1:0); + t->prev = prev; + prev->next = t; + } + + return t; +} + +int DefineSprite_GetRealSize(LPTAG t); + +int RFXSWF_WriteTag(int handle,LPTAG t) +// returns tag length in bytes (incl. Header), -1 = Error +// handle = -1 -> no output +{ U16 raw[3]; + U32 len; + int short_tag; + + if (!t) return -1; + + len = (t->id==ST_DEFINESPRITE)?DefineSprite_GetRealSize(t):t->len; + + short_tag = len<0x3f; + + if (handle>=0) + { if (short_tag) + { raw[0] = len|((t->id&0x3ff)<<6); + if (write(handle,raw,2)!=2) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"WriteTag() failed: Short Header.\n"); + #endif + return -1; + } + } + else + { raw[0] = (t->id<<6)|0x3f; + raw[1] = (U16)(len&0xffff); + raw[2] = (U16)(len>>16); + if (write(handle,raw,6)!=6) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"WriteTag() failed: Long Header.\n"); + #endif + return -1; + } + } + + if (t->data) + { if (write(handle,t->data,t->len)!=t->len) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"WriteTag() failed: Data.\n"); + #endif + return -1; + } + } + #ifdef DEBUG_RFXSWF + else if (t->len) fprintf(stderr,"WriteTag(): Tag Data Error, id=%i\n",t->id); + #endif + } + + return t->len+(short_tag?2:6); +} + +int DefineSprite_GetRealSize(LPTAG t) +// Sprite Handling: Helper function to pack DefineSprite-Tag +{ U32 len = t->len; + do + { t = NextTag(t); + if (t->id!=ST_DEFINESPRITE) len += RFXSWF_WriteTag(-1,t); + else t = NULL; + } while (t&&(t->id!=ST_END)); + return len; +} + +#define ReadTag(a,b) RFXSWF_ReadTag(a,b) +#define WriteTag(a,b) RFXSWF_WriteTag(a,b) + +// Movie Functions + +int ReadSWF(int handle,LPSWF swf) // Reads SWF to memory (malloc'ed), returns length or <0 if fails +{ + if (!swf) return -1; + memset(swf,0x00,sizeof(SWF)); + + { char b[32]; // Header lesen + TAG t1; + LPTAG t; + + memset(&t1,0x00,sizeof(TAG)); + + if ((t1.len=read(handle,b,32))<21) return -1; + t1.data = (U8*)b; + + if (GetU8(&t1)!=(U8)'F') return -1; + if (GetU8(&t1)!=(U8)'W') return -1; + if (GetU8(&t1)!=(U8)'S') return -1; + + swf->FileVersion = GetU8(&t1); + swf->FileSize = GetU32(&t1); + GetRect(&t1,&swf->MovieSize); + swf->FrameRate = GetU16(&t1); + swf->FrameCount = GetU16(&t1); + + GetU8(&t1); + lseek(handle,GetTagPos(&t1)-1,SEEK_SET); + + // Tags lesen und verketten + t = &t1; + while (t) t = ReadTag(handle,t); + swf->FirstTag = t1.next; + t1.next->prev = NULL; + } + + return 0; +} +int WriteSWF(int handle,LPSWF swf) // Writes SWF to file, returns length or <0 if fails +{ U32 len; + LPTAG t; + + if (!swf) return -1; + + // Insert REFLEX Tag + +#ifdef INSERT_RFX_TAG + + if (NextTag(swf->FirstTag)) + if (GetTagID(NextTag(swf->FirstTag))!=ST_REFLEX) + SetBlock(InsertTag(swf->FirstTag,ST_REFLEX),"rfx",3); + +#endif // INSERT_RFX_TAG + + // Count Frames + File Size + + len = 0; + t = swf->FirstTag; + swf->FrameCount = 0; + + while(t) + { len += WriteTag(-1,t); + if (t->id==ST_SHOWFRAME) swf->FrameCount++; + t = NextTag(t); + } + + { TAG t1; + char b[64]; + U32 l; + + memset(&t1,0x00,sizeof(TAG)); + t1.data = (U8*)b; + t1.memsize = 64; + + SetU8(&t1,'F'); + SetU8(&t1,'W'); + SetU8(&t1,'S'); + SetU8(&t1,swf->FileVersion); + + SetU32(&t1,0); // Keep space for filesize + SetRect(&t1,&swf->MovieSize); + SetU16(&t1,swf->FrameRate); + SetU16(&t1,swf->FrameCount); + + l = GetDataSize(&t1); + swf->FileSize = l+len; + t1.len = 4; // bad & ugly trick ! + SetU32(&t1,swf->FileSize); + + if (handle>=0) + { + int ret = write(handle,b,l); + if (ret!=l) + { + #ifdef DEBUG_RFXSWF + printf("ret:%d (fd:%d)\n",ret, handle); + perror("write:"); + fprintf(stderr,"WriteSWF() failed: Header.\n"); + #endif + return -1; + } + + t = swf->FirstTag; + while (t) + { if (WriteTag(handle,t)<0) return -1; + t = NextTag(t); + } + } + } + return (int)swf->FileSize; +} + +int WriteCGI(LPSWF swf) +{ int len; + char s[1024]; + + len = WriteSWF(-1,swf); + + if (len<0) return -1; + + sprintf(s,"Content-type: application/x-shockwave-flash\n"\ + "Accept-Ranges: bytes\n"\ + "Content-Length: %lu\n"\ + "Expires: Thu, 13 Apr 2000 23:59:59 GMT\n"\ + "\n",len); + + write(fileno(stdout),s,strlen(s)); + return WriteSWF(fileno(stdout),swf); +} + +void FreeTags(LPSWF swf) // Frees all malloc'ed memory for tags +{ LPTAG t = swf->FirstTag; + + while (t) + { LPTAG tnew = t->next; + if (t->data) free(t->data); + free(t); + t = tnew; + } +} + +// include advanced functions + +#ifdef __NT__ + +#include "modules\swfdump.c" +#include "modules\swfshape.c" +#include "modules\swftext.c" +#include "modules\swfobject.c" +#include "modules\swfbutton.c" +#include "modules\swfbits.c" +#include "modules\swftools.c" +#include "modules\swfcgi.c" + +#else + +#include "modules/swfdump.c" +#include "modules/swfshape.c" +#include "modules/swftext.c" +#include "modules/swfobject.c" +#include "modules/swfbutton.c" +#include "modules/swfbits.c" +#include "modules/swftools.c" +#include "modules/swfcgi.c" + +#endif + + diff --git a/lib/rfxswf.h b/lib/rfxswf.h new file mode 100644 index 00000000..ca6316ad --- /dev/null +++ b/lib/rfxswf.h @@ -0,0 +1,439 @@ +/* rfxswf.h + + Headers for rfxswf.c and modules + + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details + +*/ + +#ifndef __RFX_SWF_INCLUDED__ +#define __RFX_SWF_INCLUDED__ + +#include +#include +#include +#include "../config.h" + +#define DEBUG_RFXSWF + +// SWF Types + +typedef unsigned long U32; +typedef signed long S32; +typedef unsigned short U16; +typedef signed short S16; +typedef unsigned char U8; +typedef signed char S8; +typedef signed long SFIXED; +typedef signed long SCOORD; + +// Basic Structures + +typedef struct _SPOINT +{ SCOORD x; + SCOORD y; +} SPOINT, * LPSPOINT; + +typedef struct _RGBA +{ U8 r; + U8 g; + U8 b; + U8 a; +} RGBA, * LPRGBA; + +typedef struct _SRECT +{ SCOORD xmin; + SCOORD ymin; + SCOORD xmax; + SCOORD ymax; +} SRECT, * LPSRECT; + +typedef struct _MATRIX +{ SFIXED sx; // factor x + SFIXED sy; + SFIXED r0; // rotation + SFIXED r1; + SCOORD tx; // delta x + SCOORD ty; +} MATRIX, * LPMATRIX; + +typedef struct _CXFORM +{ S16 a0, a1; + S16 r0, r1; + S16 g0, g1; + S16 b0, b1; +} CXFORM, * LPCXFORM; + +typedef struct _TAG // NEVER access a Tag-Struct directly ! +{ U16 id; + U32 len; + U8 * data; + + int frame; + + struct _TAG * next; + struct _TAG * prev; + + U32 memsize; // to minimize realloc() calls + U32 pos; // for Get/Set-Access + U8 bitmask; // for Bit-Manipulating Functions [read] + U8 bitcount; // [write] +} TAG, * LPTAG; + +typedef struct _SWF +{ U8 FileVersion; + U32 FileSize; // valid after load and save + SRECT MovieSize; + U16 FrameRate; + U16 FrameCount; // valid after load and save + LPTAG FirstTag; +} SWF, * LPSWF; + +// Basic Functions + +int ReadSWF(int handle,LPSWF swf); // Reads SWF to memory (malloc'ed), returns length or <0 if fails +int WriteSWF(int handle,LPSWF swf); // Writes SWF to file, returns length or <0 if fails +int WriteCGI(LPSWF swf); // Outputs SWF with valid CGI header to stdout +void FreeTags(LPSWF swf); // Frees all malloc'ed memory for swf + +LPTAG InsertTag(LPTAG after,U16 id); // updates frames, if necessary +int DeleteTag(LPTAG t); + +void SetTagPos(LPTAG t,U32 pos); // resets Bitcount +U32 GetTagPos(LPTAG t); +U8* GetTagPosPtr(LPTAG t); + +LPTAG NextTag(LPTAG t); +LPTAG PrevTag(LPTAG t); + +int GetFrameNo(LPTAG t); +U16 GetTagID(LPTAG t); +U32 GetDataSize(LPTAG t); + +U32 GetBits(LPTAG t,int nbits); +S32 GetSBits(LPTAG t,int nbits); +int SetBits(LPTAG t,U32 v,int nbits); + +int GetBlock(LPTAG t,U8 * b,int l); // resets Bitcount +int SetBlock(LPTAG t,U8 * b,int l); + +U8 GetU8(LPTAG t); // resets Bitcount +U16 GetU16(LPTAG t); +U32 GetU32(LPTAG t); + +int SetU8(LPTAG t,U8 v); // resets Bitcount +int SetU16(LPTAG t,U16 v); +int SetU32(LPTAG t,U32 v); + +int GetPoint(LPTAG t,LPSPOINT p); // resets Bitcount +int GetRect(LPTAG t,LPSRECT r); +int GetMatrix(LPTAG t,LPMATRIX m); +int GetCXForm(LPTAG t,LPCXFORM cx,U8 alpha); + +int SetPoint(LPTAG t,LPSPOINT p); // resets Bitcount +int SetRect(LPTAG t,LPSRECT r); +int SetMatrix(LPTAG t,LPMATRIX m); +int SetCXForm(LPTAG t,LPCXFORM cx,U8 alpha); +int SetRGB(LPTAG t,LPRGBA col); +int SetRGBA(LPTAG t,LPRGBA col); + +// Function Macros + +#define GetS8(tag) ((S8)GetU8(tag)) +#define GetS16(tag) ((S16)GetU16(tag)) +#define GetS32(tag) ((S32)GetU32(tag)) +#define GetCoord(tag) ((SCOORD)GetU32(tag)) +#define GetFixed(tag) ((SFIXED)GetU32(tag)) + +#define SetS8(tag,v) SetU8(tag,(U8)v) +#define SetS16(tag,v) SetU16(tag,(U16)v) +#define SetS32(tag,v) SetU32(tag,(U32)v) +#define SetCoord(tag,v) SetU32(tag,(U32)v) +#define SetFixed(tag,v) SetU32(tag,(U32)v) +#define SetString(t,s) SetBlock(t,s,strlen(s)+1) + +#define FAILED(b) ((b)<0) +#define SUCCEDED(b) ((b)>=0) + +// Tag IDs (adopted from J. C. Kessels' Form2Flash) + +#define ST_END 0 +#define ST_SHOWFRAME 1 +#define ST_DEFINESHAPE 2 +#define ST_FREECHARACTER 3 +#define ST_PLACEOBJECT 4 +#define ST_REMOVEOBJECT 5 +#define ST_DEFINEBITS 6 +#define ST_DEFINEBUTTON 7 +#define ST_JPEGTABLES 8 +#define ST_SETBACKGROUNDCOLOR 9 +#define ST_DEFINEFONT 10 +#define ST_DEFINETEXT 11 +#define ST_DOACTION 12 +#define ST_DEFINEFONTINFO 13 +#define ST_DEFINESOUND 14 /* Event sound tags. */ +#define ST_STARTSOUND 15 +#define ST_DEFINEBUTTONSOUND 17 +#define ST_SOUNDSTREAMHEAD 18 +#define ST_SOUNDSTREAMBLOCK 19 +#define ST_DEFINEBITSLOSSLESS 20 /* A bitmap using lossless zlib compression. */ +#define ST_DEFINEBITSJPEG2 21 /* A bitmap using an internal JPEG compression table. */ +#define ST_DEFINESHAPE2 22 +#define ST_DEFINEBUTTONCXFORM 23 +#define ST_PROTECT 24 /* This file should not be importable for editing. */ +#define ST_PLACEOBJECT2 26 /* The new style place w/ alpha color transform and name. */ +#define ST_REMOVEOBJECT2 28 /* A more compact remove object that omits the character tag (just depth). */ +#define ST_DEFINESHAPE3 32 /* A shape V3 includes alpha values. */ +#define ST_DEFINETEXT2 33 /* A text V2 includes alpha values. */ +#define ST_DEFINEBUTTON2 34 /* A button V2 includes color transform, alpha and multiple actions */ +#define ST_DEFINEBITSJPEG3 35 /* A JPEG bitmap with alpha info. */ +#define ST_DEFINEBITSLOSSLESS2 36 /* A lossless bitmap with alpha info. */ +#define ST_DEFINEEDITTEXT 37 +#define ST_DEFINEMOVIE 38 +#define ST_DEFINESPRITE 39 /* Define a sequence of tags that describe the behavior of a sprite. */ +#define ST_NAMECHARACTER 40 /* Name a character definition, character id and a string, (used for buttons, bitmaps, sprites and sounds). */ +#define ST_SERIALNUMBER 41 +#define ST_GENERATORTEXT 42 /* contains an id */ +#define ST_FRAMELABEL 43 /* A string label for the current frame. */ +#define ST_SOUNDSTREAMHEAD2 45 /* For lossless streaming sound, should not have needed this... */ +#define ST_DEFINEMORPHSHAPE 46 /* A morph shape definition */ +#define ST_DEFINEFONT2 48 +#define ST_TEMPLATECOMMAND 49 +#define ST_GENERATOR3 51 +#define ST_EXTERNALFONT 52 + +#define ST_REFLEX 777 /* to identify generator software */ + +// Advanced Funtions + +// swfdump.c + +void DumpHeader(FILE * f,LPSWF swf); +void DumpMatrix(FILE * f,LPMATRIX m); +void DumpTag(FILE * f,LPTAG t); +char* getTagName(TAG*tag); + +// swfshape.c + +typedef struct _LINESTYLE +{ U16 width; + RGBA color; +} LINESTYLE, * LPLINESTYLE; + +typedef struct _FILLSTYLE +{ U8 type; + RGBA color; + MATRIX m; + U16 id_bitmap; +} FILLSTYLE, * LPFILLSTYLE; + +typedef struct _SHAPE // NEVER access a Shape-Struct directly ! +{ + struct + { LPLINESTYLE data; + U16 n; + } linestyle; + // note: changes of shape structure + struct // lead to incompatible .efont formats + { LPFILLSTYLE data; + U16 n; + } fillstyle; + + S32 px; + S32 py; + + struct + { U16 fill; + U16 line; + } bits; + + U8 * data; + U32 bitlen; // length of data in bits +} SHAPE, * LPSHAPE; + +// Shapes + +int NewShape(LPSHAPE * s); +void ShapeFree(LPSHAPE s); + +int GetSimpleShape(LPTAG t,LPSHAPE * s); // without Linestyle/Fillstyle Record +int SetSimpleShape(LPTAG t,LPSHAPE s); // without Linestyle/Fillstyle Record + +int ShapeAddLineStyle(LPSHAPE s,U16 width,LPRGBA color); +int ShapeAddSolidFillStyle(LPSHAPE s,LPRGBA color); +int ShapeAddBitmapFillStyle(LPSHAPE s,LPMATRIX m,U16 id_bitmap,int clip); + +int SetShapeStyles(LPTAG t,LPSHAPE s); +int ShapeCountBits(LPSHAPE s,U8 * fbits,U8 * lbits); +int SetShapeBits(LPTAG t,LPSHAPE s); +int SetShapeHeader(LPTAG t,LPSHAPE s); // one call for upper three functions + +int ShapeSetMove(LPTAG t,LPSHAPE s,S32 x,S32 y); +int ShapeSetStyle(LPTAG t,LPSHAPE s,U16 line,U16 fill0,U16 fill1); +int ShapeSetAll(LPTAG t,LPSHAPE s,S32 x,S32 y,U16 line,U16 fill0,U16 fill1); + +int ShapeSetLine(LPTAG t,LPSHAPE s,S32 x,S32 y); +int ShapeSetCurve(LPTAG t,LPSHAPE s,S32 x,S32 y,S32 ax,S32 ay); +int ShapeSetCircle(LPTAG t,LPSHAPE s,S32 x,S32 y,S32 rx,S32 ry); +int ShapeSetEnd(LPTAG t); + + +// swffont.c + +// does not support wide characters ! + +#define MAX_CHAR_PER_FONT 256 + +typedef struct _SWFLAYOUT +{ S16 ascent; + S16 descent; + S16 leading; + SRECT bounds[MAX_CHAR_PER_FONT]; + struct + { U16 count; + U8 * data; // size = count*4 bytes + } kerning; +} SWFLAYOUT, * LPSWFLAYOUT; + +typedef struct _SWFFONT +{ U16 id; + U8 * name; + LPSWFLAYOUT layout; + + U8 flags; // bold/italic/unicode/ansi ... + + U16 codes[MAX_CHAR_PER_FONT]; + + struct + { U16 advance; + U16 gid; // Glyph-ID after DefineFont + LPSHAPE shape; + } glyph[MAX_CHAR_PER_FONT]; +} SWFFONT, * LPSWFFONT; + +typedef struct _FONTUSAGE +{ U8 code[MAX_CHAR_PER_FONT]; +} FONTUSAGE, * LPFONTUSAGE; + +int FontEnumerate(LPSWF swf,void (*FontCallback) (U16,U8*)); +// -> void fontcallback(U16 id,U8 * name); returns number of defined fonts + +int FontExtract(LPSWF swf,int id,LPSWFFONT * f); +// Fetches all available information from DefineFont, DefineFontInfo, DefineText, ... +// id = FontID, id=0 -> Extract first Font + +int FontIsItalic(LPSWFFONT f); +int FontIsBold(LPSWFFONT f); + +int FontSetID(LPSWFFONT f,U16 id); +int FontReduce(LPSWFFONT f,LPFONTUSAGE use); + +int FontInitUsage(LPFONTUSAGE use); +int FontUse(LPFONTUSAGE use,U8 * s); + +int FontSetDefine(LPTAG t,LPSWFFONT f); +int FontSetInfo(LPTAG t,LPSWFFONT f); + +int FontExport(int handle,LPSWFFONT f); +int FontImport(int handle,LPSWFFONT * f); + +void FontFree(LPSWFFONT f); + +U32 TextGetWidth(LPSWFFONT font,U8 * s,int scale); +int TextCountBits(LPSWFFONT font,U8 * s,int scale,U8 * gbits,U8 * abits); + +int TextSetInfoRecord(LPTAG t,LPSWFFONT font,U16 size,LPRGBA color,S16 dx,S16 dy); +int TextSetCharRecord(LPTAG t,LPSWFFONT font,U8 * s,int scale,U8 gbits,U8 abits); + +int TextPrintDefineText(LPTAG t,LPSWFFONT f); +// Prints text defined in tag t with font f to stdout + + +// swfobject.c + +// Always use ST_PLACEOBJECT2 !!! + +int ObjectPlace(LPTAG t,U16 id,U16 depth,LPMATRIX m,LPCXFORM cx,U8 * name); +int PlaceObject(LPTAG t,U16 id,U16 depth,LPMATRIX m,LPCXFORM cx,U8 * name, U16 clipaction); +int ObjectMove(LPTAG t,U16 depth,LPMATRIX m,LPCXFORM cx); + +// swfbutton.c + +// Button States + +#define BS_HIT 0x08 +#define BS_DOWN 0x04 +#define BS_OVER 0x02 +#define BS_UP 0x01 + +// Button Conditions + +#define BC_OVERDOWN_IDLE 0x0100 +#define BC_IDLE_OVERDOWN 0x0080 +#define BC_OUTDOWN_IDLE 0x0040 +#define BC_OUTDOWN_OVERDOWN 0x0020 +#define BC_OVERDOWN_OUTDOWN 0x0010 +#define BC_OVERDOWN_OVERUP 0x0008 +#define BC_OVERUP_OVERDOWN 0x0004 +#define BC_OVERUP_IDLE 0x0002 +#define BC_IDLE_OVERUP 0x0001 + +#define BC_KEY(c) (c<<9) + +#define BC_CURSORLEFT 0x0200 +#define BC_CURSORRIGHT 0x0400 +#define BC_POS1 0x0600 +#define BC_END 0x0800 +#define BC_INSERT 0x0a00 +#define BC_DELETE 0x0c00 +#define BC_BACKSPACE 0x1000 +#define BC_ENTER 0x1a00 +#define BC_CURSORUP 0x1c00 +#define BC_CURSORDOWN 0x1e00 +#define BC_PAGEUP 0x2000 +#define BC_PAGEDOWN 0x2200 +#define BC_TAB 0x2400 +#define BC_SPACE 0x4000 + +// Button Flag + +#define BF_TRACKMENU 0x01 + +int ButtonSetRecord(LPTAG t,U8 state,U16 id,U16 layer,LPMATRIX m,LPCXFORM cx); +int ButtonSetCondition(LPTAG t,U16 condition); // for DefineButton2 +int ButtonSetFlags(LPTAG t,U8 flags); // necessary for DefineButton2 +int ButtonPostProcess(LPTAG t,int anz_action); // Set all offsets in DefineButton2-Tags (how many conditions to process) + +// swfbits.c + +typedef int * LPJPEGBITS; // cover libjpeg structures + +LPJPEGBITS SetJPEGBitsStart(LPTAG t,int width,int height,int quality); +int SetJPEGBitsLines(LPJPEGBITS jpegbits,U8 ** data,int n); +int SetJPEGBitsLine(LPJPEGBITS jpegbits,U8 * data); +int SetJPEGBitsFinish(LPJPEGBITS jpegbits); + +int SetJPEGBits(LPTAG t,char * fname,int quality); // paste jpg file into swf stream + +// swftools.c + +char isDefiningTag(LPTAG t); +char isAllowedSpriteTag(LPTAG t); +U16 GetDefineID(LPTAG t); +U16 GetPlaceID(LPTAG t); //PLACEOBJECT, PLACEOBJECT2 (sometimes), REMOVEOBJECT +U16 GetDepth(LPTAG t); //PLACEOBJECT,PLACEOBJECT2,REMOVEOBJECT,REMOVEOBJECT2 +char* GetName(LPTAG t); //PLACEOBJECT2, FRAMELABEL +LPMATRIX MatrixJoin(LPMATRIX d,LPMATRIX s1,LPMATRIX s2); +LPMATRIX MatrixMapTriangle(LPMATRIX m,int dx,int dy, + int x0,int y0,int x1,int y1,int x2,int y2); + + +// swfcgi.c + +void uncgi(); // same behaviour as Steven Grimm's uncgi-library + +#endif diff --git a/missing b/missing new file mode 100755 index 00000000..7789652e --- /dev/null +++ b/missing @@ -0,0 +1,190 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997 Free Software Foundation, Inc. +# Franc,ois Pinard , 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. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +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 + +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 + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing - GNU libit 0.0" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`configure.in'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`configure.in'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`configure.in'. 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.in` + 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) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. + 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 + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. 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 missing on your system. 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 + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. 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 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. 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 prerequirements 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 diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 00000000..cd392cdc --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 2001/10/18 10:31:20 kramm 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/pdf2swf/Makefile.am b/pdf2swf/Makefile.am new file mode 100644 index 00000000..a88df65a --- /dev/null +++ b/pdf2swf/Makefile.am @@ -0,0 +1,10 @@ +## Process this file with automake to produce Makefile.in +SUBDIRS = xpdf fonts +bin_PROGRAMS = pdf2swf +LDADD = +pdf2swf_SOURCES = pdf2swf.cc pdfswf.cc pdfswf.h swfoutput.cc swfoutput.h spline.cc spline.h +pdf2swf_LDADD = ../lib/log.o ../lib/rfxswf.o xpdf/libpdf.a +INCLUDES = -I../lib -I./xpdf +man_MANS = pdf2swf.1 +CXXCOMPILE = $(CXX) -DDATADIR=\"$(pkgdatadir)\" $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) + diff --git a/pdf2swf/Makefile.in b/pdf2swf/Makefile.in new file mode 100644 index 00000000..4d1f1798 --- /dev/null +++ b/pdf2swf/Makefile.in @@ -0,0 +1,467 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 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. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +AWK = @AWK@ +CC = @CC@ +CPP = @CPP@ +CXX = @CXX@ +EXEEXT = @EXEEXT@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +LN_S = @LN_S@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ + +SUBDIRS = xpdf fonts +bin_PROGRAMS = pdf2swf +LDADD = +pdf2swf_SOURCES = pdf2swf.cc pdfswf.cc pdfswf.h swfoutput.cc swfoutput.h spline.cc spline.h +pdf2swf_LDADD = ../lib/log.o ../lib/rfxswf.o xpdf/libpdf.a +INCLUDES = -I../lib -I./xpdf +man_MANS = pdf2swf.1 +CXXCOMPILE = $(CXX) -DDATADIR=\"$(pkgdatadir)\" $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +bin_PROGRAMS = pdf2swf$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I.. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +pdf2swf_OBJECTS = pdf2swf.o pdfswf.o swfoutput.o spline.o +pdf2swf_DEPENDENCIES = ../lib/log.o ../lib/rfxswf.o xpdf/libpdf.a +pdf2swf_LDFLAGS = +CXXFLAGS = @CXXFLAGS@ +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +man1dir = $(mandir)/man1 +MANS = $(man_MANS) + +NROFF = nroff +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +DEP_FILES = .deps/pdf2swf.P .deps/pdfswf.P .deps/spline.P \ +.deps/swfoutput.P +SOURCES = $(pdf2swf_SOURCES) +OBJECTS = $(pdf2swf_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .cc .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu pdf2swf/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ + $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + done + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +pdf2swf$(EXEEXT): $(pdf2swf_OBJECTS) $(pdf2swf_DEPENDENCIES) + @rm -f pdf2swf$(EXEEXT) + $(CXXLINK) $(pdf2swf_LDFLAGS) $(pdf2swf_OBJECTS) $(pdf2swf_LDADD) $(LIBS) +.cc.o: + $(CXXCOMPILE) -c $< + +install-man1: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done + +uninstall-man1: + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +install-man: $(MANS) + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-man1 +uninstall-man: + @$(NORMAL_UNINSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 + +# 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. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + 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) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + 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: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && 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) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = pdf2swf + +distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu pdf2swf/Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done + +DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) + +-include $(DEP_FILES) + +mostlyclean-depend: + +clean-depend: + +distclean-depend: + -rm -rf .deps + +maintainer-clean-depend: + +%.o: %.c + @echo '$(COMPILE) -c $<'; \ + $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.c + @echo '$(LTCOMPILE) -c $<'; \ + $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp + +%.o: %.cc + @echo '$(CXXCOMPILE) -c $<'; \ + $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.cc + @echo '$(LTCXXCOMPILE) -c $<'; \ + $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +install-exec-am: install-binPROGRAMS +install-exec: install-exec-recursive + +install-data-am: install-man +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: uninstall-binPROGRAMS uninstall-man +uninstall: uninstall-recursive +all-am: Makefile $(PROGRAMS) $(MANS) +all-redirect: all-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/man1 + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ + mostlyclean-tags mostlyclean-depend mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-binPROGRAMS clean-compile clean-tags clean-depend \ + clean-generic mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ + distclean-depend distclean-generic clean-am + +distclean: distclean-recursive + +maintainer-clean-am: maintainer-clean-binPROGRAMS \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-depend maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + +.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ +maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile install-man1 uninstall-man1 install-man \ +uninstall-man install-data-recursive uninstall-data-recursive \ +install-exec-recursive uninstall-exec-recursive installdirs-recursive \ +uninstalldirs-recursive all-recursive check-recursive \ +installcheck-recursive info-recursive dvi-recursive \ +mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir \ +mostlyclean-depend distclean-depend clean-depend \ +maintainer-clean-depend info-am info dvi-am dvi check check-am \ +installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs-am installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# 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/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc new file mode 100644 index 00000000..766bd6be --- /dev/null +++ b/pdf2swf/SWFOutputDev.cc @@ -0,0 +1,1104 @@ +/* pdfswf.cc + implements a pdf output device (OutputDev). + + This file is part of swftools. + + Swftools 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. + + Swftools 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 swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include +#include +//xpdf header files +#include "GString.h" +#include "gmem.h" +#include "Object.h" +#include "Stream.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "PDFDoc.h" +#include "Params.h" +#include "Error.h" +#include "config.h" +#include "OutputDev.h" +#include "GfxState.h" +#include "GfxFont.h" +#include "FontFile.h" +//swftools header files +#include "swfoutput.h" +extern "C" { +#include "../lib/log.h" +} + +static char* filename = 0; + +static void printInfoString(Dict *infoDict, char *key, char *fmt); +static void printInfoDate(Dict *infoDict, char *key, char *fmt); + +static char userPassword[33] = ""; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; + +double fontsizes[] = +{ + 0.833,0.833,0.889,0.889,0.788,0.722,0.833,0.778,0.600,0.600,0.600,0.600,0.576,0.576,0.576,0.576 +}; +char*fontnames[]={ +"Helvetica", +"Helvetica-Bold", +"Helvetica-BoldOblique", +"Helvetica-Oblique", +"Times-Roman", +"Times-Bold", +"Times-BoldItalic", +"Times-Italic", +"Courier", +"Courier-Bold", +"Courier-BoldOblique", +"Courier-Oblique", +"Symbol", +"Symbol", +"Symbol", +"Symbol", +"ZapfDingBats" +}; + +struct mapping { + char*pdffont; + char*filename; + int id; +} pdf2t1map[] ={ +{"Times-Roman", "n021003l.pfb"}, +{"Times-Italic", "n021023l.pfb"}, +{"Times-Bold", "n021004l.pfb"}, +{"Times-BoldItalic", "n021024l.pfb"}, +{"Helvetica", "n019003l.pfb"}, +{"Helvetica-Oblique", "n019023l.pfb"}, +{"Helvetica-Bold", "n019004l.pfb"}, +{"Helvetica-BoldOblique", "n019024l.pfb"}, +{"Courier", "n022003l.pfb"}, +{"Courier-Oblique", "n022023l.pfb"}, +{"Courier-Bold", "n022004l.pfb"}, +{"Courier-BoldOblique", "n022024l.pfb"}, +{"Symbol", "s050000l.pfb"}, +{"ZapfDingbats", "d050000l.pfb"}}; + +static void printInfoString(Dict *infoDict, char *key, char *fmt) { + Object obj; + GString *s1, *s2; + int i; + + if (infoDict->lookup(key, &obj)->isString()) { + s1 = obj.getString(); + if ((s1->getChar(0) & 0xff) == 0xfe && + (s1->getChar(1) & 0xff) == 0xff) { + s2 = new GString(); + for (i = 2; i < obj.getString()->getLength(); i += 2) { + if (s1->getChar(i) == '\0') { + s2->append(s1->getChar(i+1)); + } else { + delete s2; + s2 = new GString(""); + break; + } + } + printf(fmt, s2->getCString()); + delete s2; + } else { + printf(fmt, s1->getCString()); + } + } + obj.free(); +} + +static void printInfoDate(Dict *infoDict, char *key, char *fmt) { + Object obj; + char *s; + + if (infoDict->lookup(key, &obj)->isString()) { + s = obj.getString()->getCString(); + if (s[0] == 'D' && s[1] == ':') { + s += 2; + } + printf(fmt, s); + } + obj.free(); +} + +class GfxState; +class GfxImageColorMap; + +class SWFOutputDev: public OutputDev { + struct swfoutput output; + int outputstarted; +public: + + // Constructor. + SWFOutputDev(); + + // Destructor. + virtual ~SWFOutputDev() ; + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown(); + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar(); + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state) ; + + //----- link borders + virtual void drawLink(Link *link, Catalog *catalog) ; + + //----- save/restore graphics state + virtual void saveState(GfxState *state) ; + virtual void restoreState(GfxState *state) ; + + //----- update graphics state + + virtual void updateFont(GfxState *state); + virtual void updateFillColor(GfxState *state); + virtual void updateStrokeColor(GfxState *state); + virtual void updateLineWidth(GfxState *state); + + virtual void updateAll(GfxState *state) + { + updateFont(state); + updateFillColor(state); + updateStrokeColor(state); + updateLineWidth(state); + }; + + //----- path painting + virtual void stroke(GfxState *state) ; + virtual void fill(GfxState *state) ; + virtual void eoFill(GfxState *state) ; + + //----- path clipping + virtual void clip(GfxState *state) ; + virtual void eoClip(GfxState *state) ; + + //----- text drawing + virtual void beginString(GfxState *state, GString *s) ; + virtual void endString(GfxState *state) ; + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, Guchar c) ; + virtual void drawChar16(GfxState *state, double x, double y, + double dx, double dy, int c) ; + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool inlineImg); + + private: + int clipping[32]; + int clippos; + + int setT1Font(char*name,FontEncoding*enc); + int initT1Font(int id, FontEncoding*encoding); + int t1id; +}; + +char mybuf[1024]; +char* gfxstate2str(GfxState *state) +{ + char*bufpos = mybuf; + GfxRGB rgb; + bufpos+=sprintf(bufpos,"CTM[%.3f/%.3f/%.3f/%.3f/%.3f/%.3f] ", + state->getCTM()[0], + state->getCTM()[1], + state->getCTM()[2], + state->getCTM()[3], + state->getCTM()[4], + state->getCTM()[5]); + if(state->getX1()!=0.0) + bufpos+=sprintf(bufpos,"X1-%.1f ",state->getX1()); + if(state->getY1()!=0.0) + bufpos+=sprintf(bufpos,"Y1-%.1f ",state->getY1()); + bufpos+=sprintf(bufpos,"X2-%.1f ",state->getX2()); + bufpos+=sprintf(bufpos,"Y2-%.1f ",state->getY2()); + bufpos+=sprintf(bufpos,"PW%.1f ",state->getPageWidth()); + bufpos+=sprintf(bufpos,"PH%.1f ",state->getPageHeight()); + /*bufpos+=sprintf(bufpos,"FC[%.1f/%.1f] ", + state->getFillColor()->c[0], state->getFillColor()->c[1]); + bufpos+=sprintf(bufpos,"SC[%.1f/%.1f] ", + state->getStrokeColor()->c[0], state->getFillColor()->c[1]);*/ +/* bufpos+=sprintf(bufpos,"FC[%.1f/%.1f/%.1f/%.1f/%.1f/%.1f/%.1f/%.1f]", + state->getFillColor()->c[0], state->getFillColor()->c[1], + state->getFillColor()->c[2], state->getFillColor()->c[3], + state->getFillColor()->c[4], state->getFillColor()->c[5], + state->getFillColor()->c[6], state->getFillColor()->c[7]); + bufpos+=sprintf(bufpos,"SC[%.1f/%.1f/%.1f/%.1f/%.1f/%.1f/%.1f/%.1f]", + state->getStrokeColor()->c[0], state->getFillColor()->c[1], + state->getStrokeColor()->c[2], state->getFillColor()->c[3], + state->getStrokeColor()->c[4], state->getFillColor()->c[5], + state->getStrokeColor()->c[6], state->getFillColor()->c[7]);*/ + state->getFillRGB(&rgb); + if(rgb.r || rgb.g || rgb.b) + bufpos+=sprintf(bufpos,"FR[%.1f/%.1f/%.1f] ", rgb.r,rgb.g,rgb.b); + state->getStrokeRGB(&rgb); + if(rgb.r || rgb.g || rgb.b) + bufpos+=sprintf(bufpos,"SR[%.1f/%.1f/%.1f] ", rgb.r,rgb.g,rgb.b); + if(state->getFillColorSpace()->getNComps()>1) + bufpos+=sprintf(bufpos,"CS[[%d]] ",state->getFillColorSpace()->getNComps()); + if(state->getStrokeColorSpace()->getNComps()>1) + bufpos+=sprintf(bufpos,"SS[[%d]] ",state->getStrokeColorSpace()->getNComps()); + if(state->getFillPattern()) + bufpos+=sprintf(bufpos,"FP%08x ", state->getFillPattern()); + if(state->getStrokePattern()) + bufpos+=sprintf(bufpos,"SP%08x ", state->getStrokePattern()); + + if(state->getFillOpacity()!=1.0) + bufpos+=sprintf(bufpos,"FO%.1f ", state->getFillOpacity()); + if(state->getStrokeOpacity()!=1.0) + bufpos+=sprintf(bufpos,"SO%.1f ", state->getStrokeOpacity()); + + bufpos+=sprintf(bufpos,"LW%.1f ", state->getLineWidth()); + + double * dash; + int length; + double start; + state->getLineDash(&dash, &length, &start); + int t; + if(length) + { + bufpos+=sprintf(bufpos,"DASH%.1f[",start); + for(t=0;tgetFlatness()!=1) + bufpos+=sprintf(bufpos,"F%d ", state->getFlatness()); + if(state->getLineJoin()!=0) + bufpos+=sprintf(bufpos,"J%d ", state->getLineJoin()); + if(state->getLineJoin()!=0) + bufpos+=sprintf(bufpos,"C%d ", state->getLineCap()); + if(state->getLineJoin()!=0) + bufpos+=sprintf(bufpos,"ML%d ", state->getMiterLimit()); + + if(state->getFont() && state->getFont()->getName() && state->getFont()->getName()->getCString()) + bufpos+=sprintf(bufpos,"F\"%s\" ",((state->getFont())->getName())->getCString()); + bufpos+=sprintf(bufpos,"FS%.1f ", state->getFontSize()); + bufpos+=sprintf(bufpos,"MAT[%.1f/%.1f/%.1f/%.1f/%.1f/%.1f] ", state->getTextMat()[0],state->getTextMat()[1],state->getTextMat()[2], + state->getTextMat()[3],state->getTextMat()[4],state->getTextMat()[5]); + if(state->getCharSpace()) + bufpos+=sprintf(bufpos,"CS%.5f ", state->getCharSpace()); + if(state->getWordSpace()) + bufpos+=sprintf(bufpos,"WS%.5f ", state->getWordSpace()); + if(state->getHorizScaling()!=1.0) + bufpos+=sprintf(bufpos,"SC%.1f ", state->getHorizScaling()); + if(state->getLeading()) + bufpos+=sprintf(bufpos,"L%.1f ", state->getLeading()); + if(state->getRise()) + bufpos+=sprintf(bufpos,"R%.1f ", state->getRise()); + if(state->getRender()) + bufpos+=sprintf(bufpos,"R%d ", state->getRender()); + bufpos+=sprintf(bufpos,"P%08x ", state->getPath()); + bufpos+=sprintf(bufpos,"CX%.1f ", state->getCurX()); + bufpos+=sprintf(bufpos,"CY%.1f ", state->getCurY()); + if(state->getLineX()) + bufpos+=sprintf(bufpos,"LX%.1f ", state->getLineX()); + if(state->getLineY()) + bufpos+=sprintf(bufpos,"LY%.1f ", state->getLineY()); + bufpos+=sprintf(bufpos," "); + return mybuf; +} + +void dumpFontInfo(char*loglevel, GfxFont*font); +int lastdumps[1024]; +int lastdumppos = 0; +/* nr = 0 unknown + nr = 1 substituting + nr = 2 type 3 + */ +void showFontError(GfxFont*font, int nr) +{ + Ref r=font->getID(); + int t; + for(t=0;t The following font caused problems:"); + else if(nr == 1) + logf(" The following font caused problems (substituting):"); + else if(nr == 2) + logf(" This document contains Type 3 Fonts: (some text may be incorrectly displayed)"); + + dumpFontInfo("", font); +} + +void dumpFontInfo(char*loglevel, GfxFont*font) +{ + GString *gstr; + char*name; + gstr = font->getName(); + Ref r=font->getID(); + logf("%s=========== %s (ID:%d) ==========\n", loglevel, gstr?gstr->getCString():"(unknown font)", r.num); + + gstr = font->getTag(); + if(gstr) + logf("%sTag: %s\n", loglevel, gstr->getCString()); + if(font->is16Bit()) logf("%sis 16 bit\n", loglevel); + + GfxFontType type=font->getType(); + switch(type) { + case fontUnknownType: + logf("%sType: unknown\n",loglevel); + break; + case fontType0: + logf("%sType: 0\n",loglevel); + break; + case fontType1: + logf("%sType: 1\n",loglevel); + break; + case fontType1C: + logf("%sType: 1C\n",loglevel); + break; + case fontType3: + logf("%sType: 3\n",loglevel); + break; + case fontTrueType: + logf("%sType: TrueType\n",loglevel); + break; + } + name = font->getEmbeddedFontName(); + if(name) + logf("%sEmbedded name: %s\n",loglevel, name); + + gstr = font->getExtFontFile(); + if(gstr) + logf("%sExternal Font file: %s\n", loglevel, gstr->getCString()); + + // Get font descriptor flags. + if(font->isFixedWidth()) logf("%sis fixed width\n", loglevel); + if(font->isSerif()) logf("%sis serif\n", loglevel); + if(font->isSymbolic()) logf("%sis symbolic\n", loglevel); + if(font->isItalic()) logf("%sis italic\n", loglevel); + if(font->isBold()) logf("%sis bold\n", loglevel); +} + +//void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) {printf("void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) \n");} +//void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool inlineImg) {printf("void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool inlineImg) \n");} + +SWFOutputDev::SWFOutputDev() +{ + clippos = 0; + clipping[clippos] = 0; + outputstarted = 0; +// printf("SWFOutputDev::SWFOutputDev() \n"); +}; + +T1_OUTLINE* gfxPath_to_T1_OUTLINE(GfxState*state, GfxPath*path) +{ + int num = path->getNumSubpaths(); + int s,t; + bezierpathsegment*start,*last; + bezierpathsegment*outline = start = new bezierpathsegment(); + int cpos = 0; + double lastx=0,lasty=0; + for(t = 0; t < num; t++) { + GfxSubpath *subpath = path->getSubpath(t); + int subnum = subpath->getNumPoints(); + + for(s=0;stransform(subpath->getX(s),subpath->getY(s),&nx,&ny); + int x = (int)((nx-lastx)*0xffff); + int y = (int)((ny-lasty)*0xffff); + if(s==0) + { + last = outline; + outline->type = T1_PATHTYPE_MOVE; + outline->dest.x = x; + outline->dest.y = y; + outline->link = (T1_OUTLINE*)new bezierpathsegment(); + outline = (bezierpathsegment*)outline->link; + cpos = 0; + lastx = nx; + lasty = ny; + } + else if(subpath->getCurve(s) && !cpos) + { + outline->B.x = x; + outline->B.y = y; + cpos = 1; + } + else if(subpath->getCurve(s) && cpos) + { + outline->C.x = x; + outline->C.y = y; + cpos = 2; + } + else + { + last = outline; + outline->dest.x = x; + outline->dest.y = y; + outline->type = cpos?T1_PATHTYPE_BEZIER:T1_PATHTYPE_LINE; + outline->link = 0; + outline->link = (T1_OUTLINE*)new bezierpathsegment(); + outline = (bezierpathsegment*)outline->link; + cpos = 0; + lastx = nx; + lasty = ny; + } + } + } + last->link = 0; + return (T1_OUTLINE*)start; +} +/*---------------------------------------------------------------------------- + * Primitive Graphic routines + *----------------------------------------------------------------------------*/ + +void SWFOutputDev::stroke(GfxState *state) +{ + logf(" %s stroke\n",gfxstate2str(state)); + GfxPath * path = state->getPath(); + struct swfmatrix m; + m.m11 = 1; m.m21 = 0; m.m22 = 1; + m.m21 = 0; m.m13 = 0; m.m23 = 0; + T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); + swfoutput_setdrawmode(&output, DRAWMODE_STROKE); + swfoutput_drawpath(&output, outline, &m); +} +void SWFOutputDev::fill(GfxState *state) +{ + logf(" %s fill\n",gfxstate2str(state)); + GfxPath * path = state->getPath(); + struct swfmatrix m; + m.m11 = 1; m.m21 = 0; m.m22 = 1; + m.m21 = 0; m.m13 = 0; m.m23 = 0; + T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); + swfoutput_setdrawmode(&output, DRAWMODE_FILL); + swfoutput_drawpath(&output, outline, &m); +} +void SWFOutputDev::eoFill(GfxState *state) +{ + logf(" %s eofill\n",gfxstate2str(state)); + GfxPath * path = state->getPath(); + struct swfmatrix m; + m.m11 = 1; m.m21 = 0; m.m22 = 1; + m.m21 = 0; m.m13 = 0; m.m23 = 0; + T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); + swfoutput_setdrawmode(&output, DRAWMODE_EOFILL); + swfoutput_drawpath(&output, outline, &m); +} +void SWFOutputDev::clip(GfxState *state) +{ + logf(" %s clip\n",gfxstate2str(state)); + GfxPath * path = state->getPath(); + struct swfmatrix m; + m.m11 = 1; m.m21 = 0; m.m22 = 1; + m.m21 = 0; m.m13 = 0; m.m23 = 0; + T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); + swfoutput_startclip(&output, outline, &m); + clipping[clippos] = 1; +} +void SWFOutputDev::eoClip(GfxState *state) +{ + logf(" %s eoclip\n",gfxstate2str(state)); + GfxPath * path = state->getPath(); + struct swfmatrix m; + m.m11 = 1; m.m21 = 0; m.m22 = 1; + m.m21 = 0; m.m13 = 0; m.m23 = 0; + T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path); + swfoutput_startclip(&output, outline, &m); + clipping[clippos] = 1; +} + +SWFOutputDev::~SWFOutputDev() +{ + swfoutput_destroy(&output); + outputstarted = 0; +}; +GBool SWFOutputDev::upsideDown() +{ + logf(" upsidedown?"); + return gTrue; +}; +GBool SWFOutputDev::useDrawChar() +{ + logf(" usedrawchar?"); + return gTrue; +} + +void SWFOutputDev::beginString(GfxState *state, GString *s) +{ + double m11,m21,m12,m22; + logf(" %s beginstring \"%s\"\n", gfxstate2str(state), s->getCString()); + state->getFontTransMat(&m11, &m12, &m21, &m22); + m11 *= state->getHorizScaling(); + m21 *= state->getHorizScaling(); + swfoutput_setfontmatrix(&output,m11,-m12,m21,-m22); +} + +int charcounter = 0; +void SWFOutputDev::drawChar(GfxState *state, double x, double y, double dx, double dy, Guchar c) +{ + logf(" %s drawChar(%f,%f,%f,%f,'%c')\n",gfxstate2str(state), x,y,dx,dy,c); + // check for invisible text -- this is used by Acrobat Capture + if ((state->getRender() & 3) != 3) + { + FontEncoding*enc=state->getFont()->getEncoding(); + + double x1,y1; + x1 = x; + y1 = y; + state->transform(x, y, &x1, &y1); + + swfoutput_drawchar(&output, x1, y1, c); + } +} + +void SWFOutputDev::drawChar16(GfxState *state, double x, double y, double dx, double dy, int c) +{ + printf(" %s drawChar16(%f,%f,%f,%f,%08x)\n",gfxstate2str(state), x,y,dx,dy,c); + exit(1); +} + +void SWFOutputDev::endString(GfxState *state) +{ + logf(" %s endstring\n", gfxstate2str(state)); +} + +void SWFOutputDev::startPage(int pageNum, GfxState *state) +{ + double x1,y1,x2,y2; + logf(" %s, startPage %d\n", gfxstate2str(state), pageNum); + logf(" processing page %d", pageNum); + + state->transform(state->getX1(),state->getY1(),&x1,&y1); + state->transform(state->getX2(),state->getY2(),&x2,&y2); + if(!outputstarted) { + swfoutput_init(&output, filename, abs((int)(x2-x1)),abs((int)(y2-y1))); + outputstarted = 1; + } + else + swfoutput_newpage(&output); +} + +void SWFOutputDev::drawLink(Link *link, Catalog *catalog) +{ + logf(" drawlink\n"); + double x1, y1, x2, y2, w; + GfxRGB rgb; + swfcoord points[5]; + int x, y; + + link->getBorder(&x1, &y1, &x2, &y2, &w); + if (w > 0) { + rgb.r = 0; + rgb.g = 0; + rgb.b = 1; + cvtUserToDev(x1, y1, &x, &y); + points[0].x = points[4].x = x; + points[0].y = points[4].y = y; + cvtUserToDev(x2, y1, &x, &y); + points[1].x = x; + points[1].y = y; + cvtUserToDev(x2, y2, &x, &y); + points[2].x = x; + points[2].y = y; + cvtUserToDev(x1, y2, &x, &y); + points[3].x = x; + points[3].y = y; + //PDF: draw rect + LinkAction*action=link->getAction(); + char*s; + switch(action->getKind()) + { + case actionGoTo: { + LinkGoTo*l = (LinkGoTo*)action; + s = l->getNamedDest()->getCString(); + } + break; + case actionGoToR: { + LinkGoToR*l = (LinkGoToR*)action; + s = l->getNamedDest()->getCString(); + } + break; + case actionLaunch: { + LinkLaunch*l = (LinkLaunch*)action; + GString * str = new GString(l->getFileName()); + str->append(l->getParams()); + s = str->getCString(); + } + break; + case actionURI: { + LinkURI*l = (LinkURI*)action; + s = l->getURI()->getCString(); + } + break; + case actionNamed: { + LinkNamed*l = (LinkNamed*)action; + s = l->getName()->getCString(); + } + break; + case actionUnknown: { + LinkUnknown*l = (LinkUnknown*)action; + s = ""; + } + break; + } + logf(" link to \"%s\"\n", s); + } +} + +void SWFOutputDev::saveState(GfxState *state) { + logf(" %s saveState\n", gfxstate2str(state)); + updateAll(state); + clippos ++; + clipping[clippos] = 0; +}; + +void SWFOutputDev::restoreState(GfxState *state) { + logf(" %s restoreState\n", gfxstate2str(state)); + updateAll(state); + if(clipping[clippos]) + swfoutput_endclip(&output); + clippos--; +} + +char type3Warning=0; + +int SWFOutputDev::setT1Font(char*name, FontEncoding*encoding) +{ + int i; + + int id=-1; + int mapid=-1; + char*filename=0; + for(i=0;igetSize(); ++i) { + if (encoding->getCharName(i)) { + encStrSize += strlen(encoding->getCharName(i)) + 1; + } + } + char**enc = (char **)gmalloc(257 * sizeof(char *)); + char*encStr = (char *)gmalloc(encStrSize * sizeof(char)); + encPtr = encStr; + for (i = 0; i < 256 && i < encoding->getSize(); ++i) { + if (encoding->getCharName(i)) { + strcpy(encPtr, encoding->getCharName(i)); + enc[i] = encPtr; + encPtr += strlen(encPtr) + 1; + } else { + enc[i] = ".notdef"; + } + } + for (; i < 256; ++i) { + enc[i] = ".notdef"; + } + enc[256] = "custom"; + int ret=T1_ReencodeFont(id, enc); + t1id = id; + return 1; +} + +void SWFOutputDev::updateLineWidth(GfxState *state) +{ + double width = state->getLineWidth(); + swfoutput_setlinewidth(&output, width); +} + +void SWFOutputDev::updateFillColor(GfxState *state) +{ + GfxRGB rgb; + double opaq = state->getFillOpacity(); + state->getFillRGB(&rgb); + + swfoutput_setfillcolor(&output, (char)(rgb.r*255), (char)(rgb.g*255), + (char)(rgb.b*255), (char)(opaq*255)); +} + +void SWFOutputDev::updateStrokeColor(GfxState *state) +{ + GfxRGB rgb; + double opaq = state->getStrokeOpacity(); + state->getStrokeRGB(&rgb); + + swfoutput_setstrokecolor(&output, (char)(rgb.r*255), (char)(rgb.g*255), + (char)(rgb.b*255), (char)(opaq*255)); +} + +void SWFOutputDev::updateFont(GfxState *state) { + double m11, m12, m21, m22; + char * fontname = 0; + GfxFont*gfxFont = state->getFont(); + char * filename; + + if (!gfxFont) { + return; + } + // look for Type 3 font + if (!type3Warning && gfxFont->getType() == fontType3) { + type3Warning = gTrue; + showFontError(gfxFont, 2); + } + //dumpFontInfo (gfxFont); + + + Ref embRef; + GBool embedded = gfxFont->getEmbeddedFontID(&embRef); + if(embedded) { + char*tmpFileName = NULL; + char*fileName = NULL; + FILE *f; + char *fontBuf; + int fontLen; + Type1CFontConverter *cvt; + Ref embRef; + Object refObj, strObj; + int c; + if (!gfxFont->is16Bit() && + (gfxFont->getType() == fontType1 || + gfxFont->getType() == fontType1C) && + gfxFont->getEmbeddedFontID(&embRef)) { + tmpFileName = "tmpfont"; + f = fopen(tmpFileName, "wb"); + if (!f) { + logf(" Couldn't create temporary Type 1 font file"); + return; + } + if (gfxFont->getType() == fontType1C) { + if (!(fontBuf = gfxFont->readEmbFontFile(&fontLen))) { + fclose(f); + logf(" Couldn't read embedded font file"); + return ; + } + cvt = new Type1CFontConverter(fontBuf, fontLen, f); + cvt->convert(); + delete cvt; + gfree(fontBuf); + } else { + gfxFont->getEmbeddedFontID(&embRef); + refObj.initRef(embRef.num, embRef.gen); + refObj.fetch(&strObj); + refObj.free(); + strObj.streamReset(); + while ((c = strObj.streamGetChar()) != EOF) { + fputc(c, f); + } + strObj.streamClose(); + strObj.free(); + } + fclose(f); + fileName = tmpFileName; + if(!fileName) { + logf(" Embedded font writer didn't create a file"); + return ; + } + } + else { + showFontError(gfxFont,0); + return ; + } + t1id = T1_AddFont(fileName); + initT1Font(t1id, gfxFont->getEncoding()); + } else { + fontname = NULL; + if(gfxFont->getName()) { + fontname = gfxFont->getName()->getCString(); + //logf(" Processing font %s", fontname); + } + if(!fontname || !setT1Font(state->getFont()->getName()->getCString(), gfxFont->getEncoding())) + { //substitute font + int index; + int code; + double w,w1,w2; + double*fm; + double v; + showFontError(gfxFont, 1); + if (!gfxFont->is16Bit()) { + if (gfxFont->isFixedWidth()) { + index = 8; + } else if (gfxFont->isSerif()) { + index = 4; + } else { + index = 0; + } + if (gfxFont->isBold()) + index += 2; + if (gfxFont->isItalic()) + index += 1; + fontname = fontnames[index]; + // get width of 'm' in real font and substituted font + if ((code = gfxFont->getCharCode("m")) >= 0) + w1 = gfxFont->getWidth(code); + else + w1 = 0; + w2 = fontsizes[index]; + if (gfxFont->getType() == fontType3) { + // This is a hack which makes it possible to substitute for some + // Type 3 fonts. The problem is that it's impossible to know what + // the base coordinate system used in the font is without actually + // rendering the font. This code tries to guess by looking at the + // width of the character 'm' (which breaks if the font is a + // subset that doesn't contain 'm'). + if (w1 > 0 && (w1 > 1.1 * w2 || w1 < 0.9 * w2)) { + w1 /= w2; + m11 *= w1; + m12 *= w1; + m21 *= w1; + m22 *= w1; + } + fm = gfxFont->getFontMatrix(); + v = (fm[0] == 0) ? 1 : (fm[3] / fm[0]); + m21 *= v; + m22 *= v; + } else if (!gfxFont->isSymbolic()) { + // if real font is substantially narrower than substituted + // font, reduce the font size accordingly + if (w1 > 0.01 && w1 < 0.9 * w2) { + w1 /= w2; + if (w1 < 0.8) { + w1 = 0.8; + } + m11 *= w1; + m12 *= w1; + m21 *= w1; + m22 *= w1; + } + } + } + if(fontname) + setT1Font(fontname, gfxFont->getEncoding()); + } + } + + swfoutput_setfont(&output,t1id); +} + +void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg) { + FILE *fi; + int c; + char fileName[128]; + double x1,y1,x2,y2,x3,y3,x4,y4; + state->transform(0, 1, &x1, &y1); + state->transform(0, 0, &x2, &y2); + state->transform(1, 0, &x3, &y3); + state->transform(1, 1, &x4, &y4); + + if (str->getKind() == strDCT) { + sprintf(fileName, "/tmp/tmp%08x.jpg",lrand48()); + logf(" Found picture. Temporary storage is %s", fileName); + if (!(fi = fopen(fileName, "wb"))) { + logf(" Couldn't open temporary image file '%s'", fileName); + return; + } + str = ((DCTStream *)str)->getRawStream(); + str->reset(); + while ((c = str->getChar()) != EOF) + fputc(c, fi); + fclose(fi); + swfoutput_drawimagefile(&output, fileName, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + } else { + logf(" File contains pbm pictures."); + } +} + +void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, GBool inlineImg) { + FILE *fi; + int c; + char fileName[128]; + double x1,y1,x2,y2,x3,y3,x4,y4; + state->transform(0, 1, &x1, &y1); + state->transform(0, 0, &x2, &y2); + state->transform(1, 0, &x3, &y3); + state->transform(1, 1, &x4, &y4); + + if (str->getKind() == strDCT && + colorMap->getNumPixelComps() == 3) { + sprintf(fileName, "/tmp/tmp%08x.jpg", lrand48()); + logf(" Found picture. Temporary storage is %s", fileName); + if (!(fi = fopen(fileName, "wb"))) { + error(-1, "Couldn't open temporary image file '%s'", fileName); + return; + } + str = ((DCTStream *)str)->getRawStream(); + str->reset(); + while ((c = str->getChar()) != EOF) + fputc(c, fi); + fclose(fi); + swfoutput_drawimagefile(&output, fileName, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + } else { + logf(" File contains pbm pictures."); + } +} + +PDFDoc*doc = 0; +SWFOutputDev*output = 0; + +void pdfswf_init(char*filename, char*userPassword) +{ + GString *fileName = new GString(filename); + GString *userPW; + Object info; + // init error file + errorInit(); + + // read config file + initParams(xpdfConfigFile); + + // open PDF file + xref = NULL; + if (userPassword && userPassword[0]) { + userPW = new GString(userPassword); + } else { + userPW = NULL; + } + doc = new PDFDoc(fileName, userPW); + if (userPW) { + delete userPW; + } + if (!doc->isOk()) { + exit(1); + } + + // print doc info + doc->getDocInfo(&info); + if (info.isDict()) { + printInfoString(info.getDict(), "Title", "Title: %s\n"); + printInfoString(info.getDict(), "Subject", "Subject: %s\n"); + printInfoString(info.getDict(), "Keywords", "Keywords: %s\n"); + printInfoString(info.getDict(), "Author", "Author: %s\n"); + printInfoString(info.getDict(), "Creator", "Creator: %s\n"); + printInfoString(info.getDict(), "Producer", "Producer: %s\n"); + printInfoDate(info.getDict(), "CreationDate", "CreationDate: %s\n"); + printInfoDate(info.getDict(), "ModDate", "ModDate: %s\n"); + } + info.free(); + + // print page count + printf("Pages: %d\n", doc->getNumPages()); + + // print linearization info + printf("Linearized: %s\n", doc->isLinearized() ? "yes" : "no"); + + // print encryption info + printf("Encrypted: "); + if (doc->isEncrypted()) { + printf("yes (print:%s copy:%s change:%s addNotes:%s)\n", + doc->okToPrint() ? "yes" : "no", + doc->okToCopy() ? "yes" : "no", + doc->okToChange() ? "yes" : "no", + doc->okToAddNotes() ? "yes" : "no"); + /*ERROR: This pdf is encrypted, and disallows copying. + Due to the DMCA, paragraph 1201, (2) A-C, circumventing + a technological measure that efficively controls access to + a protected work is violating American law. + See www.eff.org for more information about DMCA issues. + */ + if(!doc->okToCopy()) { + printf("PDF disallows copying. Bailing out.\n"); + exit(1); //bail out + } + if(!doc->okToChange() || !doc->okToAddNotes()) + swfoutput_setprotected(); + } + else { + printf("no\n"); + } + + + output = new SWFOutputDev(); +} + +void pdfswf_setoutputfilename(char*_filename) +{ + filename = _filename; +} + +void pdfswf_convertpage(int page) +{ + doc->displayPage((OutputDev*)output, page, /*zoom*/100, /*rotate*/0, /*doLinks*/(int)1); +} + +int pdfswf_numpages() +{ + return doc->getNumPages(); +} + +void pdfswf_close() +{ + delete doc; + delete output; + + freeParams(); + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); +} + diff --git a/pdf2swf/SWFOutputDev.h b/pdf2swf/SWFOutputDev.h new file mode 100644 index 00000000..c6a6f491 --- /dev/null +++ b/pdf2swf/SWFOutputDev.h @@ -0,0 +1,17 @@ +/* pdfswf.h + Header file for pdfswf.cc. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __pdf_h__ +#define __pdf_h__ +void pdfswf_init(char*filename, char*userPassword) ; +void pdfswf_setoutputfilename(char*filename); +int pdfswf_numpages(); +void pdfswf_convertpage(int page) ; +void pdfswf_close(); +#endif //__pdf_h__ diff --git a/pdf2swf/args.h b/pdf2swf/args.h new file mode 100644 index 00000000..a5699df4 --- /dev/null +++ b/pdf2swf/args.h @@ -0,0 +1,63 @@ +/* args.h + Routines to simplify argument handling + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __args_h__ +#define __args_h__ + +extern int args_callback_option(char*,char*); +extern int args_callback_longoption(char*,char*); +extern int args_callback_command(char*,char*); +extern void args_callback_usage(char*name); + +int argn; +char**argv; + +void processargs(int argn2,char**argv2) +{ + int t; + if(argn2==1) + { + args_callback_usage(argv2[0]); + exit(1); + } + for(t=1;t /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-pkgdataDATA +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-pkgdataDATA +uninstall: uninstall-am +all-am: Makefile $(DATA) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: uninstall-pkgdataDATA install-pkgdataDATA tags distdir info-am \ +info dvi-am dvi check check-am installcheck-am installcheck \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# 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/pdf2swf/fonts/d050000l.afm b/pdf2swf/fonts/d050000l.afm new file mode 100644 index 00000000..98735a0a --- /dev/null +++ b/pdf2swf/fonts/d050000l.afm @@ -0,0 +1,226 @@ +StartFontMetrics 3.0 +Comment Copyright URW Software, Copyright 1997 by URW +Comment Creation Date: 10/19/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName Dingbats +FullName Dingbats +FamilyName Dingbats +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -72 +UnderlineThickness 36 +Version 001.005 +Notice URW Software, Copyright 1997 by URW +EncodingScheme FontSpecific +FontBBox -1 -143 981 819 +CapHeight 691 +XHeight 567 +Descender -143 +Ascender 691 +StartCharMetrics 203 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 974 ; N a1 ; B 35 71 939 617 ; +C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ; +C 35 ; WX 974 ; N a202 ; B 35 69 939 615 ; +C 36 ; WX 980 ; N a3 ; B 35 0 945 691 ; +C 37 ; WX 719 ; N a4 ; B 34 138 685 566 ; +C 38 ; WX 789 ; N a5 ; B 35 -13 755 707 ; +C 39 ; WX 790 ; N a119 ; B 35 -14 755 706 ; +C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ; +C 41 ; WX 690 ; N a117 ; B 35 137 655 556 ; +C 42 ; WX 960 ; N a11 ; B 35 122 925 568 ; +C 43 ; WX 939 ; N a12 ; B 35 133 904 559 ; +C 44 ; WX 549 ; N a13 ; B 29 -10 516 706 ; +C 45 ; WX 855 ; N a14 ; B 33 59 820 632 ; +C 46 ; WX 911 ; N a15 ; B 35 51 876 641 ; +C 47 ; WX 933 ; N a16 ; B 35 141 899 550 ; +C 48 ; WX 911 ; N a105 ; B 35 49 876 636 ; +C 49 ; WX 945 ; N a17 ; B 35 139 909 550 ; +C 50 ; WX 974 ; N a18 ; B 35 103 938 588 ; +C 51 ; WX 755 ; N a19 ; B 34 -14 721 706 ; +C 52 ; WX 846 ; N a20 ; B 36 -14 811 706 ; +C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ; +C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ; +C 55 ; WX 571 ; N a23 ; B -1 -69 572 660 ; +C 56 ; WX 677 ; N a24 ; B 36 -14 642 705 ; +C 57 ; WX 763 ; N a25 ; B 35 0 728 694 ; +C 58 ; WX 760 ; N a26 ; B 35 0 726 691 ; +C 59 ; WX 759 ; N a27 ; B 35 0 725 690 ; +C 60 ; WX 754 ; N a28 ; B 35 0 720 685 ; +C 61 ; WX 494 ; N a6 ; B 35 0 460 691 ; +C 62 ; WX 552 ; N a7 ; B 35 0 517 691 ; +C 63 ; WX 537 ; N a8 ; B 35 0 503 691 ; +C 64 ; WX 577 ; N a9 ; B 35 96 542 595 ; +C 65 ; WX 692 ; N a10 ; B 35 -14 657 702 ; +C 66 ; WX 786 ; N a29 ; B 35 -13 751 705 ; +C 67 ; WX 788 ; N a30 ; B 35 -14 752 703 ; +C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ; +C 69 ; WX 790 ; N a32 ; B 35 -14 756 707 ; +C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ; +C 71 ; WX 794 ; N a34 ; B 35 -14 759 705 ; +C 72 ; WX 816 ; N a35 ; B 35 -13 782 707 ; +C 73 ; WX 823 ; N a36 ; B 35 2 787 719 ; +C 74 ; WX 789 ; N a37 ; B 35 -13 754 706 ; +C 75 ; WX 841 ; N a38 ; B 35 -14 807 706 ; +C 76 ; WX 823 ; N a39 ; B 35 -12 789 706 ; +C 77 ; WX 833 ; N a40 ; B 35 -14 798 706 ; +C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ; +C 79 ; WX 831 ; N a42 ; B 35 -13 796 707 ; +C 80 ; WX 923 ; N a43 ; B 35 -13 888 706 ; +C 81 ; WX 744 ; N a44 ; B 35 0 710 691 ; +C 82 ; WX 723 ; N a45 ; B 35 0 688 691 ; +C 83 ; WX 749 ; N a46 ; B 35 0 714 691 ; +C 84 ; WX 790 ; N a47 ; B 34 -15 756 706 ; +C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ; +C 86 ; WX 695 ; N a49 ; B 35 -16 661 706 ; +C 87 ; WX 776 ; N a50 ; B 35 -7 741 698 ; +C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ; +C 89 ; WX 792 ; N a52 ; B 35 -1 757 720 ; +C 90 ; WX 759 ; N a53 ; B 35 0 725 693 ; +C 91 ; WX 707 ; N a54 ; B 35 -11 672 704 ; +C 92 ; WX 708 ; N a55 ; B 35 -14 672 704 ; +C 93 ; WX 682 ; N a56 ; B 35 -3 647 694 ; +C 94 ; WX 701 ; N a57 ; B 35 -13 666 708 ; +C 95 ; WX 826 ; N a58 ; B 35 -18 791 716 ; +C 96 ; WX 815 ; N a59 ; B 35 -16 780 705 ; +C 97 ; WX 789 ; N a60 ; B 35 -14 754 704 ; +C 98 ; WX 789 ; N a61 ; B 35 -14 754 704 ; +C 99 ; WX 707 ; N a62 ; B 33 0 674 717 ; +C 100 ; WX 687 ; N a63 ; B 36 0 651 688 ; +C 101 ; WX 696 ; N a64 ; B 35 0 661 693 ; +C 102 ; WX 689 ; N a65 ; B 35 0 655 681 ; +C 103 ; WX 786 ; N a66 ; B 34 -14 751 703 ; +C 104 ; WX 787 ; N a67 ; B 35 -15 752 704 ; +C 105 ; WX 713 ; N a68 ; B 35 -13 678 709 ; +C 106 ; WX 791 ; N a69 ; B 35 -14 756 707 ; +C 107 ; WX 785 ; N a70 ; B 36 -14 751 701 ; +C 108 ; WX 791 ; N a71 ; B 35 -14 757 708 ; +C 109 ; WX 873 ; N a72 ; B 35 -13 838 705 ; +C 110 ; WX 761 ; N a73 ; B 35 0 726 691 ; +C 111 ; WX 762 ; N a74 ; B 35 0 727 691 ; +C 112 ; WX 762 ; N a203 ; B 35 0 727 691 ; +C 113 ; WX 759 ; N a75 ; B 35 0 725 691 ; +C 114 ; WX 759 ; N a204 ; B 35 0 725 691 ; +C 115 ; WX 892 ; N a76 ; B 35 0 858 706 ; +C 116 ; WX 892 ; N a77 ; B 35 -14 858 691 ; +C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ; +C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ; +C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ; +C 120 ; WX 138 ; N a82 ; B 35 0 104 691 ; +C 121 ; WX 277 ; N a83 ; B 35 0 242 691 ; +C 122 ; WX 415 ; N a84 ; B 35 0 380 691 ; +C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ; +C 124 ; WX 392 ; N a98 ; B 34 262 357 705 ; +C 125 ; WX 668 ; N a99 ; B 35 263 633 707 ; +C 126 ; WX 668 ; N a100 ; B 36 261 634 705 ; +C 161 ; WX 732 ; N a101 ; B 35 -143 697 805 ; +C 162 ; WX 544 ; N a102 ; B 56 -14 488 705 ; +C 163 ; WX 544 ; N a103 ; B 34 -14 508 704 ; +C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ; +C 165 ; WX 667 ; N a106 ; B 35 -13 633 706 ; +C 166 ; WX 760 ; N a107 ; B 35 -13 726 705 ; +C 167 ; WX 760 ; N a108 ; B 0 121 758 570 ; +C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ; +C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ; +C 170 ; WX 694 ; N a110 ; B 35 -14 659 704 ; +C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ; +C 172 ; WX 788 ; N a120 ; B 35 -13 754 706 ; +C 173 ; WX 788 ; N a121 ; B 35 -13 754 706 ; +C 174 ; WX 788 ; N a122 ; B 35 -13 754 706 ; +C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ; +C 176 ; WX 788 ; N a124 ; B 35 -13 754 706 ; +C 177 ; WX 788 ; N a125 ; B 35 -13 754 706 ; +C 178 ; WX 788 ; N a126 ; B 35 -13 754 706 ; +C 179 ; WX 788 ; N a127 ; B 35 -13 754 706 ; +C 180 ; WX 788 ; N a128 ; B 35 -13 754 706 ; +C 181 ; WX 788 ; N a129 ; B 35 -13 754 706 ; +C 182 ; WX 788 ; N a130 ; B 35 -13 754 706 ; +C 183 ; WX 788 ; N a131 ; B 35 -13 754 706 ; +C 184 ; WX 788 ; N a132 ; B 35 -13 754 706 ; +C 185 ; WX 788 ; N a133 ; B 35 -13 754 706 ; +C 186 ; WX 788 ; N a134 ; B 35 -13 754 706 ; +C 187 ; WX 788 ; N a135 ; B 35 -13 754 706 ; +C 188 ; WX 788 ; N a136 ; B 35 -13 754 706 ; +C 189 ; WX 788 ; N a137 ; B 35 -13 754 706 ; +C 190 ; WX 788 ; N a138 ; B 35 -13 754 706 ; +C 191 ; WX 788 ; N a139 ; B 35 -13 754 706 ; +C 192 ; WX 788 ; N a140 ; B 35 -13 754 706 ; +C 193 ; WX 788 ; N a141 ; B 35 -13 754 706 ; +C 194 ; WX 788 ; N a142 ; B 35 -13 754 706 ; +C 195 ; WX 788 ; N a143 ; B 35 -13 754 706 ; +C 196 ; WX 788 ; N a144 ; B 35 -13 754 706 ; +C 197 ; WX 788 ; N a145 ; B 35 -13 754 706 ; +C 198 ; WX 788 ; N a146 ; B 35 -13 754 706 ; +C 199 ; WX 788 ; N a147 ; B 35 -13 754 706 ; +C 200 ; WX 788 ; N a148 ; B 35 -13 754 706 ; +C 201 ; WX 788 ; N a149 ; B 35 -13 754 706 ; +C 202 ; WX 788 ; N a150 ; B 35 -13 755 706 ; +C 203 ; WX 788 ; N a151 ; B 34 -13 754 706 ; +C 204 ; WX 788 ; N a152 ; B 34 -13 754 706 ; +C 205 ; WX 788 ; N a153 ; B 35 -13 754 706 ; +C 206 ; WX 788 ; N a154 ; B 35 -13 754 706 ; +C 207 ; WX 788 ; N a155 ; B 35 -13 754 706 ; +C 208 ; WX 788 ; N a156 ; B 35 -13 754 706 ; +C 209 ; WX 788 ; N a157 ; B 35 -13 754 706 ; +C 210 ; WX 788 ; N a158 ; B 35 -13 754 706 ; +C 211 ; WX 788 ; N a159 ; B 35 -13 754 706 ; +C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ; +C 213 ; WX 838 ; N a161 ; B 35 151 803 537 ; +C 214 ; WX 1016 ; N a163 ; B 34 151 981 537 ; +C 215 ; WX 458 ; N a164 ; B 35 -128 422 819 ; +C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ; +C 217 ; WX 924 ; N a165 ; B 35 140 890 551 ; +C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ; +C 219 ; WX 918 ; N a166 ; B 35 167 884 526 ; +C 220 ; WX 927 ; N a167 ; B 35 28 892 664 ; +C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ; +C 222 ; WX 928 ; N a169 ; B 35 129 893 561 ; +C 223 ; WX 834 ; N a170 ; B 35 154 799 537 ; +C 224 ; WX 873 ; N a171 ; B 35 97 838 594 ; +C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ; +C 226 ; WX 924 ; N a173 ; B 35 82 889 610 ; +C 227 ; WX 924 ; N a162 ; B 35 82 889 610 ; +C 228 ; WX 917 ; N a174 ; B 35 4 882 688 ; +C 229 ; WX 930 ; N a175 ; B 35 83 896 608 ; +C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ; +C 231 ; WX 463 ; N a177 ; B 35 -100 429 790 ; +C 232 ; WX 883 ; N a178 ; B 35 70 848 621 ; +C 233 ; WX 836 ; N a179 ; B 35 43 802 648 ; +C 234 ; WX 836 ; N a193 ; B 35 43 802 648 ; +C 235 ; WX 867 ; N a180 ; B 35 101 832 589 ; +C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ; +C 237 ; WX 696 ; N a181 ; B 35 44 661 651 ; +C 238 ; WX 696 ; N a200 ; B 35 44 661 646 ; +C 239 ; WX 874 ; N a182 ; B 35 75 840 613 ; +C 241 ; WX 874 ; N a201 ; B 35 75 840 613 ; +C 242 ; WX 760 ; N a183 ; B 35 1 725 690 ; +C 243 ; WX 946 ; N a184 ; B 35 159 911 532 ; +C 244 ; WX 771 ; N a197 ; B 34 36 736 655 ; +C 245 ; WX 865 ; N a185 ; B 35 209 830 483 ; +C 246 ; WX 771 ; N a194 ; B 34 36 736 655 ; +C 247 ; WX 888 ; N a198 ; B 34 -18 853 711 ; +C 248 ; WX 967 ; N a186 ; B 35 123 932 568 ; +C 249 ; WX 888 ; N a195 ; B 34 -20 853 710 ; +C 250 ; WX 831 ; N a187 ; B 35 113 796 578 ; +C 251 ; WX 873 ; N a188 ; B 36 116 838 576 ; +C 252 ; WX 927 ; N a189 ; B 35 149 891 542 ; +C 253 ; WX 970 ; N a190 ; B 35 75 931 615 ; +C 254 ; WX 918 ; N a191 ; B 34 99 884 592 ; +C -1 ; WX 334 ; N a95 ; B 35 0 299 691 ; +C -1 ; WX 234 ; N a88 ; B 35 -14 199 705 ; +C -1 ; WX 234 ; N a87 ; B 35 -14 199 705 ; +C -1 ; WX 410 ; N a86 ; B 35 0 375 691 ; +C -1 ; WX 410 ; N a206 ; B 35 0 375 691 ; +C -1 ; WX 509 ; N a85 ; B 35 0 475 691 ; +C -1 ; WX 334 ; N a96 ; B 35 0 299 691 ; +C -1 ; WX 276 ; N a91 ; B 35 0 242 691 ; +C -1 ; WX 317 ; N a94 ; B 35 0 283 691 ; +C -1 ; WX 317 ; N a93 ; B 35 0 283 691 ; +C -1 ; WX 390 ; N a90 ; B 35 -14 355 705 ; +C -1 ; WX 390 ; N a89 ; B 35 -14 356 705 ; +C -1 ; WX 276 ; N a92 ; B 35 0 242 691 ; +C -1 ; WX 509 ; N a205 ; B 35 0 475 691 ; +C -1 ; WX 278 ; N .notdef ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/pdf2swf/fonts/d050000l.pfb b/pdf2swf/fonts/d050000l.pfb new file mode 100644 index 00000000..4a3c386d Binary files /dev/null and b/pdf2swf/fonts/d050000l.pfb differ diff --git a/pdf2swf/fonts/n019003l.afm b/pdf2swf/fonts/n019003l.afm new file mode 100644 index 00000000..36133a42 --- /dev/null +++ b/pdf2swf/fonts/n019003l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusSanL-Regu +FullName Nimbus Sans L Regular +FamilyName Nimbus Sans L +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -151 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -174 -285 1001 953 +CapHeight 729 +XHeight 524 +Descender -218 +Ascender 729 +StartCharMetrics 316 +C 32 ; WX 278 ; N space ; B 191 0 191 0 ; +C 33 ; WX 278 ; N exclam ; B 124 0 208 729 ; +C 34 ; WX 355 ; N quotedbl ; B 52 464 305 709 ; +C 35 ; WX 556 ; N numbersign ; B 14 -20 542 697 ; +C 36 ; WX 556 ; N dollar ; B 26 -126 518 770 ; +C 37 ; WX 889 ; N percent ; B 29 -20 859 709 ; +C 38 ; WX 667 ; N ampersand ; B 52 -23 637 709 ; +C 39 ; WX 221 ; N quoteright ; B 64 497 157 729 ; +C 40 ; WX 333 ; N parenleft ; B 73 -212 291 729 ; +C 41 ; WX 333 ; N parenright ; B 38 -212 256 729 ; +C 42 ; WX 389 ; N asterisk ; B 40 441 343 729 ; +C 43 ; WX 584 ; N plus ; B 50 -10 534 474 ; +C 44 ; WX 278 ; N comma ; B 87 -147 192 104 ; +C 45 ; WX 333 ; N hyphen ; B 46 240 284 312 ; +C 46 ; WX 278 ; N period ; B 87 0 191 104 ; +C 47 ; WX 278 ; N slash ; B -8 -20 284 729 ; +C 48 ; WX 556 ; N zero ; B 43 -23 507 709 ; +C 49 ; WX 556 ; N one ; B 102 0 347 709 ; +C 50 ; WX 556 ; N two ; B 34 0 511 709 ; +C 51 ; WX 556 ; N three ; B 32 -23 506 709 ; +C 52 ; WX 556 ; N four ; B 28 0 520 709 ; +C 53 ; WX 556 ; N five ; B 35 -23 513 709 ; +C 54 ; WX 556 ; N six ; B 43 -23 513 709 ; +C 55 ; WX 556 ; N seven ; B 46 0 520 709 ; +C 56 ; WX 556 ; N eight ; B 37 -23 513 709 ; +C 57 ; WX 556 ; N nine ; B 38 -23 509 709 ; +C 58 ; WX 278 ; N colon ; B 110 0 214 524 ; +C 59 ; WX 278 ; N semicolon ; B 110 -147 215 524 ; +C 60 ; WX 584 ; N less ; B 45 -9 534 474 ; +C 61 ; WX 584 ; N equal ; B 50 111 534 353 ; +C 62 ; WX 584 ; N greater ; B 50 -9 539 474 ; +C 63 ; WX 556 ; N question ; B 77 0 509 741 ; +C 64 ; WX 1015 ; N at ; B 34 -142 951 741 ; +C 65 ; WX 667 ; N A ; B 17 0 653 729 ; +C 66 ; WX 667 ; N B ; B 79 0 623 729 ; +C 67 ; WX 722 ; N C ; B 48 -23 677 741 ; +C 68 ; WX 722 ; N D ; B 89 0 667 729 ; +C 69 ; WX 667 ; N E ; B 90 0 613 729 ; +C 70 ; WX 611 ; N F ; B 90 0 579 729 ; +C 71 ; WX 778 ; N G ; B 44 -23 709 741 ; +C 72 ; WX 722 ; N H ; B 83 0 644 729 ; +C 73 ; WX 278 ; N I ; B 100 0 194 729 ; +C 74 ; WX 500 ; N J ; B 17 -23 426 729 ; +C 75 ; WX 667 ; N K ; B 79 0 658 729 ; +C 76 ; WX 556 ; N L ; B 80 0 533 729 ; +C 77 ; WX 833 ; N M ; B 75 0 761 729 ; +C 78 ; WX 722 ; N N ; B 76 0 646 729 ; +C 79 ; WX 778 ; N O ; B 38 -23 742 741 ; +C 80 ; WX 667 ; N P ; B 91 0 617 729 ; +C 81 ; WX 778 ; N Q ; B 38 -59 742 741 ; +C 82 ; WX 722 ; N R ; B 93 0 679 729 ; +C 83 ; WX 667 ; N S ; B 48 -23 621 741 ; +C 84 ; WX 611 ; N T ; B 21 0 593 729 ; +C 85 ; WX 722 ; N U ; B 85 -23 645 729 ; +C 86 ; WX 667 ; N V ; B 30 0 645 729 ; +C 87 ; WX 944 ; N W ; B 22 0 929 729 ; +C 88 ; WX 667 ; N X ; B 22 0 649 729 ; +C 89 ; WX 667 ; N Y ; B 13 0 661 729 ; +C 90 ; WX 611 ; N Z ; B 28 0 583 729 ; +C 91 ; WX 278 ; N bracketleft ; B 64 -212 250 729 ; +C 92 ; WX 278 ; N backslash ; B -8 -20 284 729 ; +C 93 ; WX 278 ; N bracketright ; B 23 -212 209 729 ; +C 94 ; WX 469 ; N asciicircum ; B 44 329 425 709 ; +C 95 ; WX 556 ; N underscore ; B -22 -176 578 -126 ; +C 96 ; WX 222 ; N quoteleft ; B 65 477 158 709 ; +C 97 ; WX 556 ; N a ; B 42 -23 535 539 ; +C 98 ; WX 556 ; N b ; B 54 -23 523 729 ; +C 99 ; WX 500 ; N c ; B 31 -23 477 539 ; +C 100 ; WX 556 ; N d ; B 26 -23 495 729 ; +C 101 ; WX 556 ; N e ; B 40 -23 513 539 ; +C 102 ; WX 278 ; N f ; B 18 0 258 732 ; +C 103 ; WX 556 ; N g ; B 29 -218 489 539 ; +C 104 ; WX 556 ; N h ; B 70 0 486 729 ; +C 105 ; WX 222 ; N i ; B 66 0 150 729 ; +C 106 ; WX 222 ; N j ; B -18 -218 153 729 ; +C 107 ; WX 500 ; N k ; B 58 0 502 729 ; +C 108 ; WX 222 ; N l ; B 68 0 152 729 ; +C 109 ; WX 833 ; N m ; B 70 0 762 539 ; +C 110 ; WX 556 ; N n ; B 70 0 487 539 ; +C 111 ; WX 556 ; N o ; B 36 -23 510 539 ; +C 112 ; WX 556 ; N p ; B 54 -218 523 539 ; +C 113 ; WX 556 ; N q ; B 26 -218 495 539 ; +C 114 ; WX 333 ; N r ; B 69 0 321 539 ; +C 115 ; WX 500 ; N s ; B 34 -23 459 539 ; +C 116 ; WX 278 ; N t ; B 14 -23 254 668 ; +C 117 ; WX 556 ; N u ; B 65 -23 482 524 ; +C 118 ; WX 500 ; N v ; B 10 0 486 524 ; +C 119 ; WX 722 ; N w ; B 6 0 708 524 ; +C 120 ; WX 500 ; N x ; B 17 0 473 524 ; +C 121 ; WX 500 ; N y ; B 20 -218 478 524 ; +C 122 ; WX 500 ; N z ; B 31 0 457 524 ; +C 123 ; WX 334 ; N braceleft ; B 43 -212 276 729 ; +C 124 ; WX 260 ; N bar ; B 100 -212 160 729 ; +C 125 ; WX 334 ; N braceright ; B 29 -212 262 729 ; +C 126 ; WX 584 ; N asciitilde ; B 75 268 508 438 ; +C 161 ; WX 333 ; N exclamdown ; B 121 -205 205 524 ; +C 162 ; WX 556 ; N cent ; B 52 -120 510 628 ; +C 163 ; WX 556 ; N sterling ; B 26 -23 535 729 ; +C 164 ; WX 167 ; N fraction ; B -174 -20 336 709 ; +C 165 ; WX 556 ; N yen ; B 11 0 545 709 ; +C 166 ; WX 556 ; N florin ; B 11 -212 542 738 ; +C 167 ; WX 556 ; N section ; B 43 -213 506 729 ; +C 168 ; WX 556 ; N currency ; B 67 133 489 551 ; +C 169 ; WX 191 ; N quotesingle ; B 48 464 142 709 ; +C 170 ; WX 333 ; N quotedblleft ; B 48 477 299 709 ; +C 171 ; WX 556 ; N guillemotleft ; B 98 106 455 438 ; +C 172 ; WX 333 ; N guilsinglleft ; B 91 106 243 438 ; +C 173 ; WX 333 ; N guilsinglright ; B 85 106 239 438 ; +C 174 ; WX 500 ; N fi ; B 12 0 436 732 ; +C 175 ; WX 500 ; N fl ; B 17 0 430 732 ; +C 177 ; WX 556 ; N endash ; B -5 240 561 312 ; +C 178 ; WX 556 ; N dagger ; B 38 -177 513 709 ; +C 179 ; WX 556 ; N daggerdbl ; B 38 -177 513 709 ; +C 180 ; WX 278 ; N periodcentered ; B 87 302 211 427 ; +C 182 ; WX 537 ; N paragraph ; B 48 -177 522 729 ; +C 183 ; WX 350 ; N bullet ; B 50 220 300 470 ; +C 184 ; WX 222 ; N quotesinglbase ; B 64 -128 158 104 ; +C 185 ; WX 333 ; N quotedblbase ; B 47 -128 300 104 ; +C 186 ; WX 333 ; N quotedblright ; B 49 477 302 709 ; +C 187 ; WX 556 ; N guillemotright ; B 98 106 451 438 ; +C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 104 ; +C 189 ; WX 1000 ; N perthousand ; B 9 -22 993 738 ; +C 191 ; WX 611 ; N questiondown ; B 95 -217 528 524 ; +C 193 ; WX 333 ; N grave ; B 22 592 231 740 ; +C 194 ; WX 333 ; N acute ; B 92 592 301 740 ; +C 195 ; WX 333 ; N circumflex ; B 20 591 307 741 ; +C 196 ; WX 333 ; N tilde ; B 5 613 319 717 ; +C 197 ; WX 333 ; N macron ; B 28 631 302 701 ; +C 198 ; WX 333 ; N breve ; B 15 597 316 732 ; +C 199 ; WX 333 ; N dotaccent ; B 115 612 219 716 ; +C 200 ; WX 333 ; N dieresis ; B 30 612 296 715 ; +C 202 ; WX 333 ; N ring ; B 79 579 255 754 ; +C 203 ; WX 333 ; N cedilla ; B 39 -214 287 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B -35 590 348 740 ; +C 206 ; WX 333 ; N ogonek ; B 57 -205 265 0 ; +C 207 ; WX 333 ; N caron ; B 19 591 306 741 ; +C 208 ; WX 1000 ; N emdash ; B -9 240 1001 312 ; +C 225 ; WX 1000 ; N AE ; B 11 0 950 729 ; +C 227 ; WX 370 ; N ordfeminine ; B 37 303 333 742 ; +C 232 ; WX 556 ; N Lslash ; B 0 0 552 729 ; +C 233 ; WX 778 ; N Oslash ; B 30 -23 744 755 ; +C 234 ; WX 1000 ; N OE ; B 43 -20 959 741 ; +C 235 ; WX 365 ; N ordmasculine ; B 40 303 324 742 ; +C 241 ; WX 889 ; N ae ; B 34 -23 845 539 ; +C 245 ; WX 278 ; N dotlessi ; B 94 0 178 524 ; +C 248 ; WX 222 ; N lslash ; B 0 0 212 729 ; +C 249 ; WX 611 ; N oslash ; B 18 -30 529 539 ; +C 250 ; WX 944 ; N oe ; B 40 -23 899 539 ; +C 251 ; WX 611 ; N germandbls ; B 126 -20 566 729 ; +C -1 ; WX 722 ; N Udieresis ; B 85 -23 645 914 ; +C -1 ; WX 722 ; N Uacute ; B 85 -23 645 939 ; +C -1 ; WX 667 ; N Scedilla ; B 45 -214 621 741 ; +C -1 ; WX 611 ; N Tcaron ; B 21 0 593 940 ; +C -1 ; WX 667 ; N Scaron ; B 48 -23 621 940 ; +C -1 ; WX 722 ; N Rcaron ; B 93 0 679 940 ; +C -1 ; WX 722 ; N Racute ; B 93 0 679 939 ; +C -1 ; WX 667 ; N Sacute ; B 48 -23 621 939 ; +C -1 ; WX 778 ; N Otilde ; B 38 -23 742 916 ; +C -1 ; WX 556 ; N ucircumflex ; B 65 -23 482 741 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 38 -23 742 939 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 85 -23 645 939 ; +C -1 ; WX 666 ; N Yacute ; B 13 0 661 939 ; +C -1 ; WX 722 ; N Eth ; B 20 0 667 729 ; +C -1 ; WX 722 ; N Dcroat ; B 20 0 667 729 ; +C -1 ; WX 611 ; N Zacute ; B 28 0 583 939 ; +C -1 ; WX 722 ; N Uring ; B 85 -23 645 953 ; +C -1 ; WX 556 ; N gbreve ; B 29 -218 489 732 ; +C -1 ; WX 556 ; N eogonek ; B 40 -204 514 539 ; +C -1 ; WX 556 ; N edotaccent ; B 40 -23 513 716 ; +C -1 ; WX 556 ; N ecaron ; B 40 -23 513 741 ; +C -1 ; WX 722 ; N Ugrave ; B 85 -23 645 939 ; +C -1 ; WX 666 ; N Thorn ; B 91 0 616 729 ; +C -1 ; WX 556 ; N eacute ; B 40 -23 513 740 ; +C -1 ; WX 556 ; N edieresis ; B 40 -23 513 715 ; +C -1 ; WX 635 ; N dcaron ; B 26 -23 648 729 ; +C -1 ; WX 500 ; N ccedilla ; B 31 -214 477 539 ; +C -1 ; WX 500 ; N ccaron ; B 31 -23 477 741 ; +C -1 ; WX 500 ; N cacute ; B 31 -23 477 740 ; +C -1 ; WX 556 ; N aogonek ; B 43 -205 596 539 ; +C -1 ; WX 556 ; N aring ; B 42 -23 535 754 ; +C -1 ; WX 556 ; N atilde ; B 42 -23 535 717 ; +C -1 ; WX 556 ; N abreve ; B 42 -23 535 732 ; +C -1 ; WX 556 ; N egrave ; B 40 -23 513 740 ; +C -1 ; WX 556 ; N agrave ; B 42 -23 535 740 ; +C -1 ; WX 556 ; N aacute ; B 42 -23 535 740 ; +C -1 ; WX 556 ; N adieresis ; B 42 -23 535 715 ; +C -1 ; WX 722 ; N Uogonek ; B 85 -205 645 729 ; +C -1 ; WX 556 ; N ugrave ; B 65 -23 482 740 ; +C -1 ; WX 556 ; N uacute ; B 65 -23 482 740 ; +C -1 ; WX 556 ; N udieresis ; B 65 -23 482 715 ; +C -1 ; WX 308 ; N tcaron ; B 14 -23 321 800 ; +C -1 ; WX 500 ; N scommaaccent ; B 34 -285 459 539 ; +C -1 ; WX 611 ; N Zcaron ; B 28 0 583 940 ; +C -1 ; WX 556 ; N ecircumflex ; B 40 -23 513 741 ; +C -1 ; WX 722 ; N Ucircumflex ; B 85 -23 645 940 ; +C -1 ; WX 556 ; N acircumflex ; B 42 -23 535 741 ; +C -1 ; WX 611 ; N Zdotaccent ; B 28 0 583 915 ; +C -1 ; WX 500 ; N scaron ; B 34 -23 459 741 ; +C -1 ; WX 667 ; N Amacron ; B 17 0 653 900 ; +C -1 ; WX 500 ; N sacute ; B 34 -23 459 740 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 21 -285 593 729 ; +C -1 ; WX 667 ; N Ydieresis ; B 13 0 661 914 ; +C -1 ; WX 555 ; N thorn ; B 54 -218 522 714 ; +C -1 ; WX 667 ; N Emacron ; B 90 0 613 900 ; +C -1 ; WX 778 ; N Ograve ; B 38 -23 742 939 ; +C -1 ; WX 778 ; N Oacute ; B 38 -23 742 939 ; +C -1 ; WX 778 ; N Odieresis ; B 38 -23 742 914 ; +C -1 ; WX 722 ; N Ntilde ; B 76 0 646 916 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 646 940 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 646 939 ; +C -1 ; WX 556 ; N Lcaron ; B 80 0 533 729 ; +C -1 ; WX 556 ; N Lacute ; B 70 0 533 939 ; +C -1 ; WX 278 ; N Idotaccent ; B 92 0 196 915 ; +C -1 ; WX 333 ; N racute ; B 69 0 331 740 ; +C -1 ; WX 278 ; N Icircumflex ; B -1 0 286 940 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 36 -23 526 740 ; +C -1 ; WX 556 ; N otilde ; B 36 -23 510 717 ; +C -1 ; WX 556 ; N Euro ; B 2 -23 543 709 ; +C -1 ; WX 556 ; N ocircumflex ; B 36 -23 510 741 ; +C -1 ; WX 351 ; N onesuperior ; B 61 284 222 709 ; +C -1 ; WX 351 ; N twosuperior ; B 19 284 326 709 ; +C -1 ; WX 351 ; N threesuperior ; B 16 270 322 709 ; +C -1 ; WX 278 ; N Igrave ; B 1 0 210 939 ; +C -1 ; WX 278 ; N Iacute ; B 71 0 280 939 ; +C -1 ; WX 278 ; N Imacron ; B 20 0 274 900 ; +C -1 ; WX 278 ; N Iogonek ; B 66 -204 234 729 ; +C -1 ; WX 278 ; N Idieresis ; B 9 0 275 907 ; +C -1 ; WX 778 ; N Gbreve ; B 44 -23 709 931 ; +C -1 ; WX 722 ; N Umacron ; B 85 -23 645 900 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 79 -285 658 729 ; +C -1 ; WX 556 ; N ograve ; B 36 -23 510 740 ; +C -1 ; WX 667 ; N Scommaaccent ; B 48 -285 621 741 ; +C -1 ; WX 667 ; N Eogonek ; B 90 -205 652 729 ; +C -1 ; WX 556 ; N oacute ; B 36 -23 510 740 ; +C -1 ; WX 667 ; N Edotaccent ; B 90 0 613 915 ; +C -1 ; WX 222 ; N iogonek ; B 25 -204 190 729 ; +C -1 ; WX 556 ; N gcommaaccent ; B 29 -218 489 817 ; +C -1 ; WX 556 ; N odieresis ; B 36 -23 510 715 ; +C -1 ; WX 556 ; N ntilde ; B 70 0 487 717 ; +C -1 ; WX 556 ; N ncaron ; B 70 0 487 741 ; +C -1 ; WX 667 ; N Ecaron ; B 90 0 613 940 ; +C -1 ; WX 667 ; N Ecircumflex ; B 90 0 613 940 ; +C -1 ; WX 500 ; N scedilla ; B 34 -214 459 539 ; +C -1 ; WX 333 ; N rcaron ; B 48 0 335 741 ; +C -1 ; WX 667 ; N Egrave ; B 90 0 613 939 ; +C -1 ; WX 667 ; N Eacute ; B 90 0 613 939 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 44 -285 709 741 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 93 -285 679 729 ; +C -1 ; WX 667 ; N Edieresis ; B 90 0 613 914 ; +C -1 ; WX 556 ; N nacute ; B 70 0 487 740 ; +C -1 ; WX 556 ; N uogonek ; B 65 -204 521 524 ; +C -1 ; WX 556 ; N umacron ; B 65 -23 482 701 ; +C -1 ; WX 722 ; N Dcaron ; B 89 0 667 940 ; +C -1 ; WX 292 ; N lcaron ; B 68 0 305 729 ; +C -1 ; WX 722 ; N Ccaron ; B 48 -23 677 940 ; +C -1 ; WX 722 ; N Cacute ; B 48 -23 677 939 ; +C -1 ; WX 722 ; N Ccedilla ; B 48 -214 677 741 ; +C -1 ; WX 606 ; N degree ; B 151 383 454 686 ; +C -1 ; WX 667 ; N Aogonek ; B 17 -205 692 729 ; +C -1 ; WX 584 ; N minus ; B 40 197 544 267 ; +C -1 ; WX 584 ; N multiply ; B 95 34 488 427 ; +C -1 ; WX 584 ; N divide ; B 50 0 534 472 ; +C -1 ; WX 667 ; N Aring ; B 17 0 653 953 ; +C -1 ; WX 1000 ; N trademark ; B 63 292 938 729 ; +C -1 ; WX 333 ; N rcommaaccent ; B 65 -285 321 539 ; +C -1 ; WX 222 ; N lacute ; B 63 0 272 939 ; +C -1 ; WX 556 ; N omacron ; B 36 -23 510 701 ; +C -1 ; WX 667 ; N Atilde ; B 17 0 653 916 ; +C -1 ; WX 278 ; N icircumflex ; B -7 0 280 741 ; +C -1 ; WX 278 ; N igrave ; B -5 0 204 740 ; +C -1 ; WX 556 ; N ncommaaccent ; B 70 -285 487 539 ; +C -1 ; WX 222 ; N lcommaaccent ; B 63 -285 163 729 ; +C -1 ; WX 584 ; N plusminus ; B 50 -11 534 623 ; +C -1 ; WX 869 ; N onehalf ; B 61 -20 844 709 ; +C -1 ; WX 869 ; N onequarter ; B 61 -20 849 709 ; +C -1 ; WX 869 ; N threequarters ; B 16 -20 849 709 ; +C -1 ; WX 278 ; N iacute ; B 65 0 274 740 ; +C -1 ; WX 667 ; N Abreve ; B 17 0 653 931 ; +C -1 ; WX 500 ; N kcommaaccent ; B 58 -285 502 729 ; +C -1 ; WX 778 ; N Omacron ; B 38 -23 742 900 ; +C -1 ; WX 222 ; N imacron ; B -16 0 231 701 ; +C -1 ; WX 556 ; N emacron ; B 40 -23 513 701 ; +C -1 ; WX 556 ; N amacron ; B 42 -23 535 701 ; +C -1 ; WX 278 ; N tcommaaccent ; B 14 -285 254 668 ; +C -1 ; WX 500 ; N ydieresis ; B 20 -218 478 715 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 457 716 ; +C -1 ; WX 500 ; N zcaron ; B 31 0 457 741 ; +C -1 ; WX 500 ; N zacute ; B 31 0 457 740 ; +C -1 ; WX 500 ; N yacute ; B 20 -218 478 740 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 65 -23 530 740 ; +C -1 ; WX 556 ; N eth ; B 36 -23 510 743 ; +C -1 ; WX 556 ; N uring ; B 65 -23 482 754 ; +C -1 ; WX 778 ; N Ocircumflex ; B 38 -23 742 940 ; +C -1 ; WX 333 ; N commaaccent ; B 116 -285 216 -60 ; +C -1 ; WX 737 ; N copyright ; B -13 -22 751 742 ; +C -1 ; WX 737 ; N registered ; B -13 -22 751 742 ; +C -1 ; WX 667 ; N Acircumflex ; B 17 0 653 940 ; +C -1 ; WX 278 ; N idieresis ; B 3 0 269 708 ; +C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; +C -1 ; WX 711 ; N Delta ; B 10 0 701 729 ; +C -1 ; WX 548 ; N notequal ; B 32 -25 516 486 ; +C -1 ; WX 542 ; N radical ; B 7 -36 512 913 ; +C -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ; +C -1 ; WX 667 ; N Aacute ; B 17 0 653 939 ; +C -1 ; WX 584 ; N lessequal ; B 45 -11 534 639 ; +C -1 ; WX 584 ; N greaterequal ; B 45 -11 534 639 ; +C -1 ; WX 584 ; N logicalnot ; B 40 86 544 375 ; +C -1 ; WX 711 ; N summation ; B 17 -97 694 760 ; +C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -285 646 729 ; +C -1 ; WX 556 ; N dcroat ; B 26 -23 557 729 ; +C -1 ; WX 260 ; N brokenbar ; B 100 -212 160 729 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 80 -285 533 729 ; +C -1 ; WX 667 ; N Adieresis ; B 17 0 653 914 ; +C -1 ; WX 556 ; N mu ; B 65 -220 544 524 ; +C -1 ; WX 278 ; N .notdef ; B 191 0 191 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -36 +KPX A Ccedilla -36 +KPX A G -35 +KPX A O -33 +KPX A Odieresis -33 +KPX A Q -32 +KPX A T -93 +KPX A U -37 +KPX A Uacute -37 +KPX A Ucircumflex -37 +KPX A Udieresis -37 +KPX A Ugrave -37 +KPX A V -75 +KPX A W -51 +KPX A Y -99 +KPX A a -4 +KPX A b 4 +KPX A c -11 +KPX A ccedilla -10 +KPX A comma 5 +KPX A d -8 +KPX A e -16 +KPX A g -10 +KPX A guillemotleft -44 +KPX A guilsinglleft -40 +KPX A hyphen -3 +KPX A o -13 +KPX A period 5 +KPX A q -8 +KPX A quotedblright -56 +KPX A quoteright -65 +KPX A t -16 +KPX A u -12 +KPX A v -31 +KPX A w -21 +KPX A y -34 +KPX Aacute C -36 +KPX Aacute G -35 +KPX Aacute O -33 +KPX Aacute Q -32 +KPX Aacute T -93 +KPX Aacute U -37 +KPX Aacute V -75 +KPX Aacute W -51 +KPX Aacute Y -99 +KPX Aacute a -4 +KPX Aacute b 4 +KPX Aacute c -11 +KPX Aacute comma 5 +KPX Aacute d -8 +KPX Aacute e -16 +KPX Aacute g -10 +KPX Aacute guillemotleft -44 +KPX Aacute guilsinglleft -40 +KPX Aacute hyphen -3 +KPX Aacute o -13 +KPX Aacute period 5 +KPX Aacute q -8 +KPX Aacute quoteright -65 +KPX Aacute t -16 +KPX Aacute u -12 +KPX Aacute v -31 +KPX Aacute w -21 +KPX Aacute y -34 +KPX Acircumflex C -36 +KPX Acircumflex G -35 +KPX Acircumflex O -33 +KPX Acircumflex Q -32 +KPX Acircumflex T -93 +KPX Acircumflex U -37 +KPX Acircumflex V -75 +KPX Acircumflex W -51 +KPX Acircumflex Y -99 +KPX Acircumflex comma 5 +KPX Acircumflex period 5 +KPX Adieresis C -36 +KPX Adieresis G -35 +KPX Adieresis O -33 +KPX Adieresis Q -32 +KPX Adieresis T -93 +KPX Adieresis U -37 +KPX Adieresis V -75 +KPX Adieresis W -51 +KPX Adieresis Y -99 +KPX Adieresis a -4 +KPX Adieresis b 4 +KPX Adieresis c -11 +KPX Adieresis comma 5 +KPX Adieresis d -8 +KPX Adieresis g -10 +KPX Adieresis guillemotleft -44 +KPX Adieresis guilsinglleft -40 +KPX Adieresis hyphen -3 +KPX Adieresis o -13 +KPX Adieresis period 5 +KPX Adieresis q -8 +KPX Adieresis quotedblright -56 +KPX Adieresis quoteright -65 +KPX Adieresis t -16 +KPX Adieresis u -12 +KPX Adieresis v -31 +KPX Adieresis w -21 +KPX Adieresis y -34 +KPX Agrave C -36 +KPX Agrave G -35 +KPX Agrave O -33 +KPX Agrave Q -32 +KPX Agrave T -93 +KPX Agrave U -37 +KPX Agrave V -75 +KPX Agrave W -51 +KPX Agrave Y -99 +KPX Agrave comma 5 +KPX Agrave period 5 +KPX Aring C -36 +KPX Aring G -35 +KPX Aring O -33 +KPX Aring Q -32 +KPX Aring T -93 +KPX Aring U -37 +KPX Aring V -75 +KPX Aring W -51 +KPX Aring Y -99 +KPX Aring a -4 +KPX Aring b 4 +KPX Aring c -11 +KPX Aring comma 5 +KPX Aring d -8 +KPX Aring e -16 +KPX Aring g -10 +KPX Aring guillemotleft -44 +KPX Aring guilsinglleft -40 +KPX Aring hyphen -3 +KPX Aring o -13 +KPX Aring period 5 +KPX Aring q -8 +KPX Aring quotedblright -56 +KPX Aring quoteright -65 +KPX Aring t -16 +KPX Aring u -12 +KPX Aring v -31 +KPX Aring w -21 +KPX Aring y -34 +KPX Atilde C -36 +KPX Atilde G -35 +KPX Atilde O -33 +KPX Atilde Q -32 +KPX Atilde T -93 +KPX Atilde U -37 +KPX Atilde V -75 +KPX Atilde W -51 +KPX Atilde Y -99 +KPX Atilde comma 5 +KPX Atilde period 5 +KPX B A -21 +KPX B AE -21 +KPX B Aacute -21 +KPX B Acircumflex -21 +KPX B Adieresis -21 +KPX B Aring -21 +KPX B Atilde -21 +KPX B O -7 +KPX B OE -5 +KPX B Oacute -7 +KPX B Ocircumflex -7 +KPX B Odieresis -7 +KPX B Ograve -7 +KPX B Oslash -1 +KPX B V -41 +KPX B W -25 +KPX B Y -44 +KPX C A -32 +KPX C AE -33 +KPX C Aacute -32 +KPX C Adieresis -32 +KPX C Aring -32 +KPX C H -12 +KPX C K -10 +KPX C O -8 +KPX C Oacute -8 +KPX C Odieresis -8 +KPX Ccedilla A -31 +KPX D A -42 +KPX D Aacute -42 +KPX D Acircumflex -42 +KPX D Adieresis -42 +KPX D Agrave -42 +KPX D Aring -42 +KPX D Atilde -42 +KPX D J -5 +KPX D T -45 +KPX D V -51 +KPX D W -29 +KPX D X -53 +KPX D Y -63 +KPX F A -69 +KPX F Aacute -69 +KPX F Acircumflex -69 +KPX F Adieresis -69 +KPX F Agrave -69 +KPX F Aring -69 +KPX F Atilde -69 +KPX F J -51 +KPX F O -22 +KPX F Odieresis -22 +KPX F a -33 +KPX F aacute -33 +KPX F adieresis -33 +KPX F ae -29 +KPX F aring -33 +KPX F comma -108 +KPX F e -24 +KPX F eacute -24 +KPX F hyphen -14 +KPX F i -10 +KPX F j -12 +KPX F o -21 +KPX F oacute -21 +KPX F odieresis -21 +KPX F oe -23 +KPX F oslash -21 +KPX F period -108 +KPX F r -35 +KPX F u -33 +KPX G A -6 +KPX G AE -3 +KPX G Aacute -6 +KPX G Acircumflex -6 +KPX G Adieresis -6 +KPX G Agrave -6 +KPX G Aring -6 +KPX G Atilde -6 +KPX G T -44 +KPX G V -50 +KPX G W -28 +KPX G Y -62 +KPX J A -32 +KPX J AE -31 +KPX J Adieresis -32 +KPX J Aring -32 +KPX K C -51 +KPX K G -51 +KPX K O -48 +KPX K OE -45 +KPX K Oacute -48 +KPX K Odieresis -48 +KPX K S -38 +KPX K T 20 +KPX K a -11 +KPX K adieresis -11 +KPX K ae -7 +KPX K aring -11 +KPX K e -32 +KPX K hyphen -47 +KPX K o -29 +KPX K oacute -29 +KPX K odieresis -29 +KPX K u -19 +KPX K udieresis -19 +KPX K y -62 +KPX L A 17 +KPX L AE 20 +KPX L Aacute 17 +KPX L Adieresis 17 +KPX L Aring 17 +KPX L C -41 +KPX L Ccedilla -37 +KPX L G -42 +KPX L O -41 +KPX L Oacute -41 +KPX L Ocircumflex -41 +KPX L Odieresis -41 +KPX L Ograve -41 +KPX L Otilde -41 +KPX L S -19 +KPX L T -105 +KPX L U -35 +KPX L Udieresis -35 +KPX L V -105 +KPX L W -68 +KPX L Y -121 +KPX L hyphen -125 +KPX L quotedblright -141 +KPX L quoteright -149 +KPX L u -7 +KPX L udieresis -7 +KPX L y -56 +KPX N A -9 +KPX N AE -6 +KPX N Aacute -9 +KPX N Adieresis -9 +KPX N Aring -9 +KPX N C -3 +KPX N Ccedilla -3 +KPX N G -2 +KPX N O 0 +KPX N Oacute 0 +KPX N Odieresis 0 +KPX N a -5 +KPX N aacute -5 +KPX N adieresis -5 +KPX N ae -2 +KPX N aring -5 +KPX N comma -7 +KPX N e 0 +KPX N eacute 0 +KPX N o 2 +KPX N oacute 2 +KPX N odieresis 2 +KPX N oslash 4 +KPX N period -7 +KPX N u 0 +KPX N udieresis 0 +KPX O A -35 +KPX O AE -39 +KPX O Aacute -35 +KPX O Adieresis -35 +KPX O Aring -35 +KPX O T -42 +KPX O V -45 +KPX O W -23 +KPX O X -46 +KPX O Y -59 +KPX Oacute A -35 +KPX Oacute T -42 +KPX Oacute V -45 +KPX Oacute W -23 +KPX Oacute Y -59 +KPX Ocircumflex T -42 +KPX Ocircumflex V -45 +KPX Ocircumflex Y -59 +KPX Odieresis A -35 +KPX Odieresis T -42 +KPX Odieresis V -45 +KPX Odieresis W -23 +KPX Odieresis X -46 +KPX Odieresis Y -59 +KPX Ograve T -42 +KPX Ograve V -45 +KPX Ograve Y -59 +KPX Oslash A -33 +KPX Otilde T -42 +KPX Otilde V -45 +KPX Otilde Y -59 +KPX P A -78 +KPX P AE -86 +KPX P Aacute -78 +KPX P Adieresis -78 +KPX P Aring -78 +KPX P J -78 +KPX P a -28 +KPX P aacute -28 +KPX P adieresis -28 +KPX P ae -24 +KPX P aring -28 +KPX P comma -135 +KPX P e -31 +KPX P eacute -31 +KPX P hyphen -40 +KPX P o -27 +KPX P oacute -27 +KPX P odieresis -27 +KPX P oe -28 +KPX P oslash -27 +KPX P period -135 +KPX R C -16 +KPX R Ccedilla -16 +KPX R G -15 +KPX R O -13 +KPX R OE -11 +KPX R Oacute -13 +KPX R Odieresis -13 +KPX R T -23 +KPX R U -17 +KPX R Udieresis -17 +KPX R V -39 +KPX R W -27 +KPX R Y -43 +KPX R a -15 +KPX R aacute -15 +KPX R adieresis -15 +KPX R ae -12 +KPX R aring -15 +KPX R e -12 +KPX R eacute -12 +KPX R hyphen -2 +KPX R o -9 +KPX R oacute -9 +KPX R odieresis -9 +KPX R oe -11 +KPX R u -9 +KPX R uacute -9 +KPX R udieresis -9 +KPX R y -8 +KPX S A -22 +KPX S AE -22 +KPX S Aacute -22 +KPX S Adieresis -22 +KPX S Aring -22 +KPX S T -28 +KPX S V -42 +KPX S W -28 +KPX S Y -48 +KPX S t -3 +KPX T A -95 +KPX T AE -97 +KPX T Aacute -95 +KPX T Acircumflex -95 +KPX T Adieresis -95 +KPX T Agrave -95 +KPX T Aring -95 +KPX T Atilde -95 +KPX T C -44 +KPX T G -45 +KPX T J -100 +KPX T O -42 +KPX T OE -35 +KPX T Oacute -42 +KPX T Ocircumflex -42 +KPX T Odieresis -42 +KPX T Ograve -42 +KPX T Oslash -41 +KPX T Otilde -42 +KPX T S -24 +KPX T V 12 +KPX T W 16 +KPX T Y 20 +KPX T a -100 +KPX T ae -97 +KPX T c -90 +KPX T colon -133 +KPX T comma -100 +KPX T e -95 +KPX T g -89 +KPX T guillemotleft -121 +KPX T guilsinglleft -117 +KPX T hyphen -77 +KPX T i -3 +KPX T j -5 +KPX T o -92 +KPX T oslash -87 +KPX T period -100 +KPX T r -92 +KPX T s -92 +KPX T semicolon -129 +KPX T u -91 +KPX T v -95 +KPX T w -93 +KPX T y -100 +KPX U A -36 +KPX U AE -39 +KPX U Aacute -36 +KPX U Acircumflex -36 +KPX U Adieresis -36 +KPX U Aring -36 +KPX U Atilde -36 +KPX U comma -27 +KPX U m -4 +KPX U n -4 +KPX U p 3 +KPX U period -25 +KPX U r -4 +KPX Uacute A -36 +KPX Uacute comma -27 +KPX Uacute m -4 +KPX Uacute n -4 +KPX Uacute p 3 +KPX Uacute period -25 +KPX Uacute r -4 +KPX Ucircumflex A -36 +KPX Udieresis A -36 +KPX Udieresis b 3 +KPX Udieresis comma -27 +KPX Udieresis m -4 +KPX Udieresis n -4 +KPX Udieresis p 3 +KPX Udieresis period -25 +KPX Udieresis r -4 +KPX Ugrave A -36 +KPX V A -71 +KPX V AE -78 +KPX V Aacute -71 +KPX V Acircumflex -71 +KPX V Adieresis -71 +KPX V Agrave -71 +KPX V Aring -71 +KPX V Atilde -71 +KPX V C -43 +KPX V G -42 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Oslash -33 +KPX V Otilde -40 +KPX V S -35 +KPX V T 15 +KPX V a -59 +KPX V ae -55 +KPX V colon -66 +KPX V comma -89 +KPX V e -57 +KPX V g -50 +KPX V guillemotleft -83 +KPX V guilsinglleft -80 +KPX V hyphen -38 +KPX V i -5 +KPX V o -54 +KPX V oslash -50 +KPX V period -89 +KPX V r -42 +KPX V semicolon -66 +KPX V u -41 +KPX V y -20 +KPX W A -50 +KPX W AE -56 +KPX W Aacute -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W C -23 +KPX W G -22 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Oslash -13 +KPX W Otilde -20 +KPX W S -24 +KPX W T 19 +KPX W a -38 +KPX W ae -34 +KPX W colon -52 +KPX W comma -56 +KPX W e -32 +KPX W g -25 +KPX W guillemotleft -58 +KPX W guilsinglleft -54 +KPX W hyphen -13 +KPX W i -1 +KPX W o -29 +KPX W oslash -25 +KPX W period -56 +KPX W r -28 +KPX W semicolon -53 +KPX W u -28 +KPX W y -6 +KPX X C -48 +KPX X O -45 +KPX X Odieresis -45 +KPX X Q -44 +KPX X a -15 +KPX X e -36 +KPX X hyphen -51 +KPX X o -33 +KPX X u -24 +KPX X y -61 +KPX Y A -96 +KPX Y AE -103 +KPX Y Aacute -96 +KPX Y Acircumflex -96 +KPX Y Adieresis -96 +KPX Y Agrave -96 +KPX Y Aring -96 +KPX Y Atilde -96 +KPX Y C -58 +KPX Y G -58 +KPX Y O -56 +KPX Y Oacute -56 +KPX Y Ocircumflex -56 +KPX Y Odieresis -56 +KPX Y Ograve -56 +KPX Y Oslash -54 +KPX Y Otilde -56 +KPX Y S -41 +KPX Y T 23 +KPX Y a -88 +KPX Y ae -84 +KPX Y colon -87 +KPX Y comma -111 +KPX Y e -89 +KPX Y g -83 +KPX Y guillemotleft -123 +KPX Y guilsinglleft -119 +KPX Y hyphen -84 +KPX Y i 3 +KPX Y o -86 +KPX Y oslash -82 +KPX Y p -54 +KPX Y period -111 +KPX Y semicolon -88 +KPX Y u -63 +KPX Y v -36 +KPX Z v -33 +KPX Z y -38 +KPX a j -4 +KPX a quoteright -23 +KPX a v -21 +KPX a w -13 +KPX a y -26 +KPX aacute v -21 +KPX aacute w -13 +KPX aacute y -26 +KPX adieresis v -21 +KPX adieresis w -13 +KPX adieresis y -26 +KPX ae v -16 +KPX ae w -10 +KPX ae y -20 +KPX agrave v -21 +KPX agrave w -13 +KPX agrave y -26 +KPX aring v -21 +KPX aring w -13 +KPX aring y -26 +KPX b v -11 +KPX b w -3 +KPX b y -15 +KPX c h 1 +KPX c k 7 +KPX comma one -100 +KPX comma quotedblright -41 +KPX comma quoteright -50 +KPX e quoteright -18 +KPX e t -10 +KPX e v -15 +KPX e w -9 +KPX e x -27 +KPX e y -19 +KPX eacute v -15 +KPX eacute w -9 +KPX eacute y -19 +KPX ecircumflex v -15 +KPX ecircumflex w -9 +KPX ecircumflex y -19 +KPX eight four 1 +KPX eight one -48 +KPX eight seven -33 +KPX f a -9 +KPX f aacute -9 +KPX f adieresis -9 +KPX f ae -5 +KPX f aring -9 +KPX f e -15 +KPX f eacute -15 +KPX f f 22 +KPX f i -2 +KPX f j -4 +KPX f l -3 +KPX f o -10 +KPX f oacute -10 +KPX f odieresis -10 +KPX f oe -12 +KPX f oslash -9 +KPX f quoteright 0 +KPX f s 0 +KPX f t 24 +KPX five four 1 +KPX five one -76 +KPX five seven -26 +KPX four four 5 +KPX four one -84 +KPX four seven -56 +KPX g a -5 +KPX g adieresis -5 +KPX g ae -1 +KPX g aring -5 +KPX g e 0 +KPX g eacute 0 +KPX g l 0 +KPX g oacute 3 +KPX g odieresis 3 +KPX g r 0 +KPX guillemotright A -50 +KPX guillemotright AE -54 +KPX guillemotright Aacute -50 +KPX guillemotright Adieresis -50 +KPX guillemotright Aring -50 +KPX guillemotright T -126 +KPX guillemotright V -93 +KPX guillemotright W -66 +KPX guillemotright Y -133 +KPX guilsinglright A -44 +KPX guilsinglright AE -48 +KPX guilsinglright Aacute -44 +KPX guilsinglright Adieresis -44 +KPX guilsinglright Aring -44 +KPX guilsinglright T -121 +KPX guilsinglright V -88 +KPX guilsinglright W -60 +KPX guilsinglright Y -128 +KPX h quoteright -15 +KPX h y -18 +KPX hyphen A -7 +KPX hyphen AE -11 +KPX hyphen Aacute -7 +KPX hyphen Adieresis -7 +KPX hyphen Aring -7 +KPX hyphen T -80 +KPX hyphen V -46 +KPX hyphen W -19 +KPX hyphen Y -92 +KPX i T -7 +KPX i j -3 +KPX k a -2 +KPX k aacute -2 +KPX k adieresis -2 +KPX k ae 2 +KPX k aring -2 +KPX k comma 0 +KPX k e -21 +KPX k eacute -21 +KPX k g -16 +KPX k hyphen -41 +KPX k o -19 +KPX k oacute -19 +KPX k odieresis -19 +KPX k period 0 +KPX k s -3 +KPX k u -11 +KPX k udieresis -6 +KPX l v 0 +KPX l y -5 +KPX m p 5 +KPX m v -13 +KPX m w -7 +KPX m y -18 +KPX n T -96 +KPX n p 5 +KPX n quoteright -14 +KPX n v -13 +KPX n w -7 +KPX n y -18 +KPX nine four -3 +KPX nine one -43 +KPX nine seven -37 +KPX o T -99 +KPX o quoteright -21 +KPX o t -10 +KPX o v -18 +KPX o w -10 +KPX o x -27 +KPX o y -22 +KPX oacute v -18 +KPX oacute w -10 +KPX oacute y -22 +KPX ocircumflex t -10 +KPX odieresis t -10 +KPX odieresis v -18 +KPX odieresis w -10 +KPX odieresis x -27 +KPX odieresis y -22 +KPX ograve v -18 +KPX ograve w -10 +KPX ograve y -22 +KPX one comma -74 +KPX one eight -65 +KPX one five -67 +KPX one four -81 +KPX one nine -65 +KPX one one -118 +KPX one period -74 +KPX one seven -90 +KPX one six -62 +KPX one three -67 +KPX one two -69 +KPX one zero -62 +KPX p t -4 +KPX p y -16 +KPX period one -101 +KPX period quotedblright -41 +KPX period quoteright -51 +KPX q c 8 +KPX q u 4 +KPX quotedblbase A 30 +KPX quotedblbase AE 30 +KPX quotedblbase T -75 +KPX quotedblbase V -69 +KPX quotedblbase W -34 +KPX quotedblbase Y -91 +KPX quotedblleft A -52 +KPX quotedblleft AE -64 +KPX quotedblleft Aacute -52 +KPX quotedblleft Adieresis -52 +KPX quotedblleft Aring -52 +KPX quotedblleft T 9 +KPX quotedblleft V 15 +KPX quotedblleft W 27 +KPX quotedblleft Y 5 +KPX quotedblright A -53 +KPX quotedblright AE -66 +KPX quotedblright Aacute -53 +KPX quotedblright Adieresis -53 +KPX quotedblright Aring -53 +KPX quotedblright T 11 +KPX quotedblright V 15 +KPX quotedblright W 26 +KPX quotedblright Y 7 +KPX quoteleft A -67 +KPX quoteleft AE -79 +KPX quoteleft Aacute -67 +KPX quoteleft Adieresis -67 +KPX quoteleft Aring -67 +KPX quoteleft T -5 +KPX quoteleft V 0 +KPX quoteleft W 12 +KPX quoteleft Y -9 +KPX quoteright A -72 +KPX quoteright AE -85 +KPX quoteright Aacute -72 +KPX quoteright Adieresis -72 +KPX quoteright Aring -72 +KPX quoteright comma -60 +KPX quoteright d -20 +KPX quoteright o -26 +KPX quoteright period -60 +KPX quoteright r -18 +KPX quoteright s -18 +KPX quoteright t -7 +KPX quoteright v -2 +KPX quoteright w 2 +KPX quoteright y -6 +KPX r a -5 +KPX r aacute -5 +KPX r acircumflex -5 +KPX r adieresis -5 +KPX r ae -1 +KPX r agrave -5 +KPX r aring -5 +KPX r c -6 +KPX r ccedilla -9 +KPX r colon -22 +KPX r comma -69 +KPX r d -1 +KPX r e -11 +KPX r eacute -11 +KPX r ecircumflex -11 +KPX r egrave -11 +KPX r f 26 +KPX r g -4 +KPX r h 0 +KPX r hyphen -47 +KPX r i 1 +KPX r j 0 +KPX r k 6 +KPX r l 1 +KPX r m 0 +KPX r n 0 +KPX r o -6 +KPX r oacute -6 +KPX r ocircumflex -6 +KPX r odieresis -6 +KPX r oe -8 +KPX r ograve -6 +KPX r oslash -6 +KPX r p 8 +KPX r period -69 +KPX r q -3 +KPX r quoteright 1 +KPX r r 0 +KPX r s 4 +KPX r semicolon -22 +KPX r t 28 +KPX r u 2 +KPX r v 29 +KPX r w 31 +KPX r x 20 +KPX r y 24 +KPX r z 9 +KPX s quoteright -22 +KPX s t -3 +KPX seven colon -77 +KPX seven comma -119 +KPX seven eight -28 +KPX seven five -30 +KPX seven four -93 +KPX seven one -53 +KPX seven period -119 +KPX seven seven -4 +KPX seven six -40 +KPX seven three -23 +KPX seven two -28 +KPX six four 1 +KPX six one -43 +KPX six seven -30 +KPX t S -8 +KPX t a -1 +KPX t aacute -1 +KPX t adieresis -1 +KPX t ae 2 +KPX t aring -1 +KPX t colon -28 +KPX t e -14 +KPX t eacute -14 +KPX t h -3 +KPX t o -12 +KPX t oacute -12 +KPX t odieresis -12 +KPX t quoteright -1 +KPX t semicolon -28 +KPX three four -2 +KPX three one -49 +KPX three seven -33 +KPX two four -37 +KPX two one -36 +KPX two seven -25 +KPX u quoteright -8 +KPX v a -18 +KPX v aacute -18 +KPX v acircumflex -18 +KPX v adieresis -18 +KPX v ae -14 +KPX v agrave -18 +KPX v aring -18 +KPX v atilde -18 +KPX v c -16 +KPX v colon -23 +KPX v comma -69 +KPX v e -21 +KPX v eacute -21 +KPX v ecircumflex -21 +KPX v egrave -21 +KPX v g -14 +KPX v hyphen -12 +KPX v l 0 +KPX v o -17 +KPX v oacute -17 +KPX v odieresis -17 +KPX v ograve -17 +KPX v oslash -17 +KPX v period -69 +KPX v s -9 +KPX v semicolon -23 +KPX w a -15 +KPX w aacute -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w ae -11 +KPX w agrave -15 +KPX w aring -15 +KPX w atilde -15 +KPX w c -7 +KPX w colon -23 +KPX w comma -50 +KPX w e -12 +KPX w eacute -12 +KPX w ecircumflex -12 +KPX w egrave -12 +KPX w g -6 +KPX w hyphen -1 +KPX w l 0 +KPX w o -9 +KPX w oacute -9 +KPX w odieresis -9 +KPX w ograve -9 +KPX w oslash -6 +KPX w period -50 +KPX w s -5 +KPX w semicolon -23 +KPX x a -17 +KPX x c -23 +KPX x e -28 +KPX x eacute -28 +KPX x o -25 +KPX x q -20 +KPX y a -22 +KPX y aacute -22 +KPX y acircumflex -22 +KPX y adieresis -22 +KPX y ae -18 +KPX y agrave -22 +KPX y aring -22 +KPX y atilde -22 +KPX y c -19 +KPX y colon -27 +KPX y comma -70 +KPX y e -24 +KPX y eacute -24 +KPX y ecircumflex -24 +KPX y egrave -24 +KPX y g -17 +KPX y hyphen -14 +KPX y l -4 +KPX y o -20 +KPX y oacute -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y oslash -19 +KPX y period -70 +KPX y s -12 +KPX y semicolon -27 +KPX zero four -2 +KPX zero one -46 +KPX zero seven -39 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n019003l.pfb b/pdf2swf/fonts/n019003l.pfb new file mode 100644 index 00000000..ff605552 Binary files /dev/null and b/pdf2swf/fonts/n019003l.pfb differ diff --git a/pdf2swf/fonts/n019004l.afm b/pdf2swf/fonts/n019004l.afm new file mode 100644 index 00000000..fe41636b --- /dev/null +++ b/pdf2swf/fonts/n019004l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusSanL-Bold +FullName Nimbus Sans L Bold +FamilyName Nimbus Sans L +Weight Bold +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -155 +UnderlineThickness 69 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -173 -307 1003 949 +CapHeight 729 +XHeight 540 +Descender -217 +Ascender 729 +StartCharMetrics 316 +C 32 ; WX 278 ; N space ; B 214 0 214 0 ; +C 33 ; WX 333 ; N exclam ; B 112 0 262 726 ; +C 34 ; WX 474 ; N quotedbl ; B 50 470 424 729 ; +C 35 ; WX 556 ; N numbersign ; B 3 -32 553 697 ; +C 36 ; WX 556 ; N dollar ; B 22 -126 527 763 ; +C 37 ; WX 889 ; N percent ; B 22 -20 863 709 ; +C 38 ; WX 722 ; N ampersand ; B 55 -23 694 723 ; +C 39 ; WX 278 ; N quoteright ; B 66 469 201 729 ; +C 40 ; WX 333 ; N parenleft ; B 40 -200 303 729 ; +C 41 ; WX 333 ; N parenright ; B 22 -200 285 729 ; +C 42 ; WX 389 ; N asterisk ; B 23 407 357 729 ; +C 43 ; WX 584 ; N plus ; B 50 -10 533 473 ; +C 44 ; WX 278 ; N comma ; B 64 -174 214 146 ; +C 45 ; WX 333 ; N hyphen ; B 26 207 298 342 ; +C 46 ; WX 278 ; N period ; B 64 0 214 146 ; +C 47 ; WX 278 ; N slash ; B 2 -14 275 714 ; +C 48 ; WX 556 ; N zero ; B 29 -23 517 724 ; +C 49 ; WX 556 ; N one ; B 68 0 378 709 ; +C 50 ; WX 556 ; N two ; B 30 0 515 724 ; +C 51 ; WX 556 ; N three ; B 29 -23 516 724 ; +C 52 ; WX 556 ; N four ; B 24 0 522 709 ; +C 53 ; WX 556 ; N five ; B 27 -23 517 709 ; +C 54 ; WX 556 ; N six ; B 32 -23 519 724 ; +C 55 ; WX 556 ; N seven ; B 29 0 528 709 ; +C 56 ; WX 556 ; N eight ; B 22 -23 525 724 ; +C 57 ; WX 556 ; N nine ; B 28 -24 516 724 ; +C 58 ; WX 333 ; N colon ; B 113 0 263 520 ; +C 59 ; WX 333 ; N semicolon ; B 113 -174 263 520 ; +C 60 ; WX 584 ; N less ; B 40 -10 529 474 ; +C 61 ; WX 584 ; N equal ; B 50 52 534 411 ; +C 62 ; WX 584 ; N greater ; B 40 -10 529 474 ; +C 63 ; WX 611 ; N question ; B 64 0 556 744 ; +C 64 ; WX 975 ; N at ; B 27 -138 947 745 ; +C 65 ; WX 722 ; N A ; B 26 0 703 729 ; +C 66 ; WX 722 ; N B ; B 82 0 666 729 ; +C 67 ; WX 722 ; N C ; B 44 -23 685 741 ; +C 68 ; WX 722 ; N D ; B 77 0 681 729 ; +C 69 ; WX 667 ; N E ; B 79 0 624 729 ; +C 70 ; WX 611 ; N F ; B 74 0 586 729 ; +C 71 ; WX 778 ; N G ; B 42 -23 711 741 ; +C 72 ; WX 722 ; N H ; B 68 0 657 729 ; +C 73 ; WX 278 ; N I ; B 63 0 213 729 ; +C 74 ; WX 556 ; N J ; B 24 -23 486 729 ; +C 75 ; WX 722 ; N K ; B 74 0 717 729 ; +C 76 ; WX 611 ; N L ; B 80 0 579 729 ; +C 77 ; WX 833 ; N M ; B 66 0 776 729 ; +C 78 ; WX 722 ; N N ; B 68 0 661 729 ; +C 79 ; WX 778 ; N O ; B 40 -23 742 741 ; +C 80 ; WX 667 ; N P ; B 76 0 633 729 ; +C 81 ; WX 778 ; N Q ; B 43 -54 745 741 ; +C 82 ; WX 722 ; N R ; B 80 0 677 729 ; +C 83 ; WX 667 ; N S ; B 32 -23 633 741 ; +C 84 ; WX 611 ; N T ; B 14 0 598 729 ; +C 85 ; WX 722 ; N U ; B 76 -23 654 729 ; +C 86 ; WX 667 ; N V ; B 24 0 647 729 ; +C 87 ; WX 944 ; N W ; B 13 0 932 729 ; +C 88 ; WX 667 ; N X ; B 22 0 653 729 ; +C 89 ; WX 667 ; N Y ; B 27 0 650 729 ; +C 90 ; WX 611 ; N Z ; B 30 0 578 729 ; +C 91 ; WX 333 ; N bracketleft ; B 66 -200 308 729 ; +C 92 ; WX 278 ; N backslash ; B -12 -14 289 714 ; +C 93 ; WX 333 ; N bracketright ; B 18 -200 260 729 ; +C 94 ; WX 584 ; N asciicircum ; B 61 270 522 695 ; +C 95 ; WX 556 ; N underscore ; B -22 -189 578 -120 ; +C 96 ; WX 278 ; N quoteleft ; B 67 469 202 729 ; +C 97 ; WX 556 ; N a ; B 28 -23 524 549 ; +C 98 ; WX 611 ; N b ; B 59 -23 575 729 ; +C 99 ; WX 556 ; N c ; B 34 -23 522 549 ; +C 100 ; WX 611 ; N d ; B 29 -23 545 729 ; +C 101 ; WX 556 ; N e ; B 22 -23 525 549 ; +C 102 ; WX 333 ; N f ; B 14 0 313 729 ; +C 103 ; WX 611 ; N g ; B 34 -218 541 549 ; +C 104 ; WX 611 ; N h ; B 67 0 541 729 ; +C 105 ; WX 278 ; N i ; B 67 0 207 729 ; +C 106 ; WX 278 ; N j ; B 4 -218 210 729 ; +C 107 ; WX 556 ; N k ; B 59 0 548 729 ; +C 108 ; WX 278 ; N l ; B 67 0 207 729 ; +C 109 ; WX 889 ; N m ; B 60 0 824 549 ; +C 110 ; WX 611 ; N n ; B 63 0 546 549 ; +C 111 ; WX 611 ; N o ; B 35 -23 569 549 ; +C 112 ; WX 611 ; N p ; B 58 -218 574 549 ; +C 113 ; WX 611 ; N q ; B 28 -218 544 549 ; +C 114 ; WX 389 ; N r ; B 63 0 370 549 ; +C 115 ; WX 556 ; N s ; B 29 -23 520 549 ; +C 116 ; WX 333 ; N t ; B 14 -23 301 674 ; +C 117 ; WX 611 ; N u ; B 58 -23 541 540 ; +C 118 ; WX 556 ; N v ; B 14 0 536 540 ; +C 119 ; WX 778 ; N w ; B 5 0 766 540 ; +C 120 ; WX 556 ; N x ; B 16 0 535 540 ; +C 121 ; WX 556 ; N y ; B 9 -219 538 540 ; +C 122 ; WX 500 ; N z ; B 21 0 468 540 ; +C 123 ; WX 389 ; N braceleft ; B 37 -200 317 729 ; +C 124 ; WX 280 ; N bar ; B 100 -200 180 729 ; +C 125 ; WX 389 ; N braceright ; B 72 -200 352 729 ; +C 126 ; WX 584 ; N asciitilde ; B 60 142 519 314 ; +C 161 ; WX 333 ; N exclamdown ; B 66 -186 216 540 ; +C 162 ; WX 556 ; N cent ; B 36 -124 522 634 ; +C 163 ; WX 556 ; N sterling ; B 31 -23 537 715 ; +C 164 ; WX 167 ; N fraction ; B -173 -20 337 715 ; +C 165 ; WX 556 ; N yen ; B 5 0 552 704 ; +C 166 ; WX 556 ; N florin ; B 21 -220 535 744 ; +C 167 ; WX 556 ; N section ; B 33 -201 518 723 ; +C 168 ; WX 556 ; N currency ; B 26 100 530 604 ; +C 169 ; WX 238 ; N quotesingle ; B 50 470 188 729 ; +C 170 ; WX 500 ; N quotedblleft ; B 71 469 433 729 ; +C 171 ; WX 556 ; N guillemotleft ; B 88 72 468 481 ; +C 172 ; WX 333 ; N guilsinglleft ; B 83 72 250 481 ; +C 173 ; WX 333 ; N guilsinglright ; B 80 72 247 481 ; +C 174 ; WX 611 ; N fi ; B 9 0 548 729 ; +C 175 ; WX 611 ; N fl ; B 12 0 546 729 ; +C 177 ; WX 556 ; N endash ; B -9 207 557 311 ; +C 178 ; WX 556 ; N dagger ; B 31 -194 523 709 ; +C 179 ; WX 556 ; N daggerdbl ; B 28 -194 520 709 ; +C 180 ; WX 278 ; N periodcentered ; B 64 169 188 292 ; +C 182 ; WX 556 ; N paragraph ; B 19 -191 529 729 ; +C 183 ; WX 350 ; N bullet ; B 50 175 300 425 ; +C 184 ; WX 278 ; N quotesinglbase ; B 66 -135 201 125 ; +C 185 ; WX 500 ; N quotedblbase ; B 72 -135 432 125 ; +C 186 ; WX 500 ; N quotedblright ; B 73 469 440 729 ; +C 187 ; WX 556 ; N guillemotright ; B 88 72 462 481 ; +C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; +C 189 ; WX 1000 ; N perthousand ; B 11 -22 990 739 ; +C 191 ; WX 611 ; N questiondown ; B 51 -204 544 540 ; +C 193 ; WX 333 ; N grave ; B 17 607 213 757 ; +C 194 ; WX 333 ; N acute ; B 121 607 317 757 ; +C 195 ; WX 333 ; N circumflex ; B 8 607 326 757 ; +C 196 ; WX 333 ; N tilde ; B -9 621 345 749 ; +C 197 ; WX 333 ; N macron ; B 16 640 315 719 ; +C 198 ; WX 333 ; N breve ; B 35 605 299 748 ; +C 199 ; WX 333 ; N dotaccent ; B 112 621 222 743 ; +C 200 ; WX 333 ; N dieresis ; B 18 621 314 743 ; +C 202 ; WX 333 ; N ring ; B 77 590 257 770 ; +C 203 ; WX 333 ; N cedilla ; B 27 -220 294 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B -44 610 340 757 ; +C 206 ; WX 333 ; N ogonek ; B 45 -234 268 0 ; +C 207 ; WX 333 ; N caron ; B 9 607 327 757 ; +C 208 ; WX 1000 ; N emdash ; B -7 207 1003 311 ; +C 225 ; WX 1000 ; N AE ; B 1 0 966 729 ; +C 227 ; WX 370 ; N ordfeminine ; B 31 262 329 729 ; +C 232 ; WX 611 ; N Lslash ; B 0 0 597 729 ; +C 233 ; WX 778 ; N Oslash ; B 31 -39 755 749 ; +C 234 ; WX 1000 ; N OE ; B 28 -23 970 741 ; +C 235 ; WX 365 ; N ordmasculine ; B 23 262 343 729 ; +C 241 ; WX 889 ; N ae ; B 27 -24 857 549 ; +C 245 ; WX 278 ; N dotlessi ; B 67 0 207 540 ; +C 248 ; WX 278 ; N lslash ; B 0 0 252 729 ; +C 249 ; WX 611 ; N oslash ; B 11 -38 598 557 ; +C 250 ; WX 944 ; N oe ; B 23 -23 920 549 ; +C 251 ; WX 611 ; N germandbls ; B 67 -17 575 729 ; +C -1 ; WX 722 ; N Udieresis ; B 76 -23 654 922 ; +C -1 ; WX 722 ; N Uacute ; B 76 -23 654 936 ; +C -1 ; WX 667 ; N Scedilla ; B 32 -220 633 741 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; +C -1 ; WX 667 ; N Scaron ; B 32 -23 633 936 ; +C -1 ; WX 722 ; N Rcaron ; B 80 0 677 936 ; +C -1 ; WX 722 ; N Racute ; B 80 0 677 936 ; +C -1 ; WX 667 ; N Sacute ; B 32 -23 633 936 ; +C -1 ; WX 778 ; N Otilde ; B 40 -23 742 928 ; +C -1 ; WX 611 ; N ucircumflex ; B 58 -23 541 757 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 40 -23 742 936 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 76 -23 654 936 ; +C -1 ; WX 667 ; N Yacute ; B 27 0 650 936 ; +C -1 ; WX 722 ; N Eth ; B 0 0 681 729 ; +C -1 ; WX 722 ; N Dcroat ; B 0 0 681 729 ; +C -1 ; WX 611 ; N Zacute ; B 30 0 578 936 ; +C -1 ; WX 722 ; N Uring ; B 76 -23 654 949 ; +C -1 ; WX 611 ; N gbreve ; B 34 -218 541 748 ; +C -1 ; WX 556 ; N eogonek ; B 21 -234 525 549 ; +C -1 ; WX 556 ; N edotaccent ; B 22 -23 525 743 ; +C -1 ; WX 556 ; N ecaron ; B 22 -23 525 757 ; +C -1 ; WX 722 ; N Ugrave ; B 76 -23 654 936 ; +C -1 ; WX 667 ; N Thorn ; B 76 0 633 729 ; +C -1 ; WX 556 ; N eacute ; B 22 -23 525 757 ; +C -1 ; WX 556 ; N edieresis ; B 22 -23 525 743 ; +C -1 ; WX 707 ; N dcaron ; B 29 -23 720 729 ; +C -1 ; WX 556 ; N ccedilla ; B 34 -220 522 549 ; +C -1 ; WX 556 ; N ccaron ; B 34 -23 522 757 ; +C -1 ; WX 556 ; N cacute ; B 34 -23 522 757 ; +C -1 ; WX 556 ; N aogonek ; B 28 -233 548 549 ; +C -1 ; WX 556 ; N aring ; B 28 -23 524 770 ; +C -1 ; WX 556 ; N atilde ; B 28 -23 524 749 ; +C -1 ; WX 556 ; N abreve ; B 28 -23 524 748 ; +C -1 ; WX 556 ; N egrave ; B 22 -23 525 757 ; +C -1 ; WX 556 ; N agrave ; B 28 -23 524 757 ; +C -1 ; WX 556 ; N aacute ; B 28 -23 524 757 ; +C -1 ; WX 556 ; N adieresis ; B 28 -23 524 743 ; +C -1 ; WX 722 ; N Uogonek ; B 76 -234 654 729 ; +C -1 ; WX 611 ; N ugrave ; B 58 -23 541 757 ; +C -1 ; WX 611 ; N uacute ; B 58 -23 541 757 ; +C -1 ; WX 611 ; N udieresis ; B 58 -23 541 743 ; +C -1 ; WX 385 ; N tcaron ; B 14 -23 398 829 ; +C -1 ; WX 556 ; N scommaaccent ; B 29 -307 520 549 ; +C -1 ; WX 611 ; N Zcaron ; B 30 0 578 936 ; +C -1 ; WX 556 ; N ecircumflex ; B 22 -23 525 757 ; +C -1 ; WX 722 ; N Ucircumflex ; B 76 -23 654 936 ; +C -1 ; WX 556 ; N acircumflex ; B 28 -23 524 757 ; +C -1 ; WX 611 ; N Zdotaccent ; B 30 0 578 922 ; +C -1 ; WX 556 ; N scaron ; B 29 -23 520 757 ; +C -1 ; WX 722 ; N Amacron ; B 26 0 703 898 ; +C -1 ; WX 556 ; N sacute ; B 29 -23 520 757 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -307 598 729 ; +C -1 ; WX 667 ; N Ydieresis ; B 27 0 650 922 ; +C -1 ; WX 611 ; N thorn ; B 58 -218 574 729 ; +C -1 ; WX 667 ; N Emacron ; B 79 0 624 898 ; +C -1 ; WX 778 ; N Ograve ; B 40 -23 742 936 ; +C -1 ; WX 778 ; N Oacute ; B 40 -23 742 936 ; +C -1 ; WX 778 ; N Odieresis ; B 40 -23 742 922 ; +C -1 ; WX 722 ; N Ntilde ; B 68 0 661 928 ; +C -1 ; WX 722 ; N Ncaron ; B 68 0 661 936 ; +C -1 ; WX 722 ; N Nacute ; B 68 0 661 936 ; +C -1 ; WX 611 ; N Lcaron ; B 80 0 579 729 ; +C -1 ; WX 611 ; N Lacute ; B 80 0 579 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 63 0 213 922 ; +C -1 ; WX 389 ; N racute ; B 63 0 370 757 ; +C -1 ; WX 278 ; N Icircumflex ; B -19 0 299 936 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 35 -23 569 757 ; +C -1 ; WX 611 ; N otilde ; B 35 -23 569 749 ; +C -1 ; WX 556 ; N Euro ; B 6 -23 546 724 ; +C -1 ; WX 611 ; N ocircumflex ; B 35 -23 569 757 ; +C -1 ; WX 351 ; N onesuperior ; B 40 284 242 709 ; +C -1 ; WX 351 ; N twosuperior ; B 16 284 328 718 ; +C -1 ; WX 351 ; N threesuperior ; B 15 271 329 718 ; +C -1 ; WX 278 ; N Igrave ; B -10 0 213 936 ; +C -1 ; WX 278 ; N Iacute ; B 63 0 290 936 ; +C -1 ; WX 278 ; N Imacron ; B 2 0 274 898 ; +C -1 ; WX 278 ; N Iogonek ; B 34 -233 237 729 ; +C -1 ; WX 278 ; N Idieresis ; B -9 0 287 922 ; +C -1 ; WX 778 ; N Gbreve ; B 42 -23 711 927 ; +C -1 ; WX 722 ; N Umacron ; B 76 -23 654 898 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 74 -307 717 729 ; +C -1 ; WX 611 ; N ograve ; B 35 -23 569 757 ; +C -1 ; WX 667 ; N Scommaaccent ; B 32 -307 633 741 ; +C -1 ; WX 667 ; N Eogonek ; B 79 -233 648 729 ; +C -1 ; WX 611 ; N oacute ; B 35 -23 569 757 ; +C -1 ; WX 667 ; N Edotaccent ; B 79 0 624 922 ; +C -1 ; WX 278 ; N iogonek ; B 34 -233 231 729 ; +C -1 ; WX 611 ; N gcommaaccent ; B 34 -218 541 853 ; +C -1 ; WX 611 ; N odieresis ; B 35 -23 569 743 ; +C -1 ; WX 611 ; N ntilde ; B 63 0 546 749 ; +C -1 ; WX 611 ; N ncaron ; B 63 0 546 757 ; +C -1 ; WX 667 ; N Ecaron ; B 79 0 624 936 ; +C -1 ; WX 667 ; N Ecircumflex ; B 79 0 624 936 ; +C -1 ; WX 556 ; N scedilla ; B 29 -220 520 549 ; +C -1 ; WX 389 ; N rcaron ; B 54 0 372 757 ; +C -1 ; WX 667 ; N Egrave ; B 79 0 624 936 ; +C -1 ; WX 667 ; N Eacute ; B 79 0 624 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 42 -307 711 741 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 80 -307 677 729 ; +C -1 ; WX 667 ; N Edieresis ; B 79 0 624 922 ; +C -1 ; WX 611 ; N nacute ; B 63 0 546 757 ; +C -1 ; WX 611 ; N uogonek ; B 58 -233 564 540 ; +C -1 ; WX 611 ; N umacron ; B 58 -23 541 719 ; +C -1 ; WX 722 ; N Dcaron ; B 77 0 681 936 ; +C -1 ; WX 369 ; N lcaron ; B 67 0 382 729 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -23 685 936 ; +C -1 ; WX 722 ; N Cacute ; B 44 -23 685 936 ; +C -1 ; WX 722 ; N Ccedilla ; B 44 -220 685 741 ; +C -1 ; WX 606 ; N degree ; B 151 383 454 686 ; +C -1 ; WX 722 ; N Aogonek ; B 26 -233 723 729 ; +C -1 ; WX 584 ; N minus ; B 40 172 544 291 ; +C -1 ; WX 584 ; N multiply ; B 79 18 505 444 ; +C -1 ; WX 584 ; N divide ; B 50 -11 534 474 ; +C -1 ; WX 722 ; N Aring ; B 26 0 703 949 ; +C -1 ; WX 1000 ; N trademark ; B 71 273 929 729 ; +C -1 ; WX 389 ; N rcommaaccent ; B 63 -307 370 549 ; +C -1 ; WX 278 ; N lacute ; B 67 0 278 936 ; +C -1 ; WX 611 ; N omacron ; B 35 -23 569 719 ; +C -1 ; WX 722 ; N Atilde ; B 26 0 703 928 ; +C -1 ; WX 278 ; N icircumflex ; B -19 0 299 757 ; +C -1 ; WX 278 ; N igrave ; B -10 0 207 757 ; +C -1 ; WX 611 ; N ncommaaccent ; B 63 -307 546 549 ; +C -1 ; WX 278 ; N lcommaaccent ; B 67 -307 207 729 ; +C -1 ; WX 584 ; N plusminus ; B 56 -16 527 608 ; +C -1 ; WX 869 ; N onehalf ; B 40 -20 846 715 ; +C -1 ; WX 869 ; N onequarter ; B 40 -20 850 715 ; +C -1 ; WX 869 ; N threequarters ; B 15 -20 850 718 ; +C -1 ; WX 278 ; N iacute ; B 67 0 290 757 ; +C -1 ; WX 722 ; N Abreve ; B 26 0 703 927 ; +C -1 ; WX 556 ; N kcommaaccent ; B 59 -307 548 729 ; +C -1 ; WX 778 ; N Omacron ; B 40 -23 742 898 ; +C -1 ; WX 278 ; N imacron ; B 7 0 266 719 ; +C -1 ; WX 556 ; N emacron ; B 22 -23 525 719 ; +C -1 ; WX 556 ; N amacron ; B 28 -23 524 719 ; +C -1 ; WX 333 ; N tcommaaccent ; B 14 -307 301 674 ; +C -1 ; WX 556 ; N ydieresis ; B 9 -219 538 743 ; +C -1 ; WX 500 ; N zdotaccent ; B 21 0 468 743 ; +C -1 ; WX 500 ; N zcaron ; B 21 0 468 757 ; +C -1 ; WX 500 ; N zacute ; B 21 0 468 757 ; +C -1 ; WX 556 ; N yacute ; B 9 -219 538 757 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 58 -23 559 757 ; +C -1 ; WX 611 ; N eth ; B 35 -23 569 744 ; +C -1 ; WX 611 ; N uring ; B 58 -23 541 770 ; +C -1 ; WX 778 ; N Ocircumflex ; B 40 -23 742 936 ; +C -1 ; WX 333 ; N commaaccent ; B 112 -307 234 -60 ; +C -1 ; WX 737 ; N copyright ; B -14 -22 751 743 ; +C -1 ; WX 737 ; N registered ; B -14 -22 751 743 ; +C -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ; +C -1 ; WX 278 ; N idieresis ; B -9 0 287 743 ; +C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; +C -1 ; WX 729 ; N Delta ; B 8 0 721 729 ; +C -1 ; WX 548 ; N notequal ; B 50 -69 534 528 ; +C -1 ; WX 542 ; N radical ; B 7 -36 512 913 ; +C -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ; +C -1 ; WX 722 ; N Aacute ; B 26 0 703 936 ; +C -1 ; WX 584 ; N lessequal ; B 45 -10 534 639 ; +C -1 ; WX 584 ; N greaterequal ; B 45 -10 534 639 ; +C -1 ; WX 584 ; N logicalnot ; B 40 86 544 375 ; +C -1 ; WX 711 ; N summation ; B 17 -96 694 760 ; +C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 68 -307 661 729 ; +C -1 ; WX 611 ; N dcroat ; B 29 -23 605 729 ; +C -1 ; WX 280 ; N brokenbar ; B 100 -200 180 729 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 80 -307 579 729 ; +C -1 ; WX 722 ; N Adieresis ; B 26 0 703 922 ; +C -1 ; WX 611 ; N mu ; B 58 -220 573 540 ; +C -1 ; WX 278 ; N .notdef ; B 214 0 214 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -33 +KPX A Ccedilla -33 +KPX A G -35 +KPX A O -34 +KPX A Odieresis -34 +KPX A Q -35 +KPX A T -81 +KPX A U -32 +KPX A Uacute -32 +KPX A Ucircumflex -32 +KPX A Udieresis -32 +KPX A Ugrave -32 +KPX A V -66 +KPX A W -51 +KPX A Y -90 +KPX A a -1 +KPX A b -1 +KPX A c -14 +KPX A ccedilla -14 +KPX A comma 19 +KPX A d -13 +KPX A e -9 +KPX A g -14 +KPX A guillemotleft -43 +KPX A guilsinglleft -40 +KPX A hyphen 7 +KPX A o -16 +KPX A period 19 +KPX A q -12 +KPX A quotedblright -65 +KPX A quoteright -61 +KPX A t -18 +KPX A u -12 +KPX A v -37 +KPX A w -23 +KPX A y -35 +KPX Aacute C -33 +KPX Aacute G -35 +KPX Aacute O -34 +KPX Aacute Q -35 +KPX Aacute T -81 +KPX Aacute U -32 +KPX Aacute V -66 +KPX Aacute W -51 +KPX Aacute Y -90 +KPX Aacute a -1 +KPX Aacute b -1 +KPX Aacute c -14 +KPX Aacute comma 19 +KPX Aacute d -13 +KPX Aacute e -9 +KPX Aacute g -14 +KPX Aacute guillemotleft -43 +KPX Aacute guilsinglleft -40 +KPX Aacute hyphen 7 +KPX Aacute o -16 +KPX Aacute period 19 +KPX Aacute q -12 +KPX Aacute quoteright -61 +KPX Aacute t -18 +KPX Aacute u -12 +KPX Aacute v -37 +KPX Aacute w -23 +KPX Aacute y -35 +KPX Acircumflex C -33 +KPX Acircumflex G -35 +KPX Acircumflex O -34 +KPX Acircumflex Q -35 +KPX Acircumflex T -81 +KPX Acircumflex U -32 +KPX Acircumflex V -66 +KPX Acircumflex W -51 +KPX Acircumflex Y -90 +KPX Acircumflex comma 19 +KPX Acircumflex period 19 +KPX Adieresis C -33 +KPX Adieresis G -35 +KPX Adieresis O -34 +KPX Adieresis Q -35 +KPX Adieresis T -81 +KPX Adieresis U -32 +KPX Adieresis V -66 +KPX Adieresis W -51 +KPX Adieresis Y -90 +KPX Adieresis a -1 +KPX Adieresis b -1 +KPX Adieresis c -14 +KPX Adieresis comma 19 +KPX Adieresis d -13 +KPX Adieresis g -14 +KPX Adieresis guillemotleft -43 +KPX Adieresis guilsinglleft -40 +KPX Adieresis hyphen 7 +KPX Adieresis o -16 +KPX Adieresis period 19 +KPX Adieresis q -12 +KPX Adieresis quotedblright -65 +KPX Adieresis quoteright -61 +KPX Adieresis t -18 +KPX Adieresis u -12 +KPX Adieresis v -37 +KPX Adieresis w -23 +KPX Adieresis y -35 +KPX Agrave C -33 +KPX Agrave G -35 +KPX Agrave O -34 +KPX Agrave Q -35 +KPX Agrave T -81 +KPX Agrave U -32 +KPX Agrave V -66 +KPX Agrave W -51 +KPX Agrave Y -90 +KPX Agrave comma 19 +KPX Agrave period 19 +KPX Aring C -33 +KPX Aring G -35 +KPX Aring O -34 +KPX Aring Q -35 +KPX Aring T -81 +KPX Aring U -32 +KPX Aring V -66 +KPX Aring W -51 +KPX Aring Y -90 +KPX Aring a -1 +KPX Aring b -1 +KPX Aring c -14 +KPX Aring comma 19 +KPX Aring d -13 +KPX Aring e -9 +KPX Aring g -14 +KPX Aring guillemotleft -43 +KPX Aring guilsinglleft -40 +KPX Aring hyphen 7 +KPX Aring o -16 +KPX Aring period 19 +KPX Aring q -12 +KPX Aring quotedblright -65 +KPX Aring quoteright -61 +KPX Aring t -18 +KPX Aring u -12 +KPX Aring v -37 +KPX Aring w -23 +KPX Aring y -35 +KPX Atilde C -33 +KPX Atilde G -35 +KPX Atilde O -34 +KPX Atilde Q -35 +KPX Atilde T -81 +KPX Atilde U -32 +KPX Atilde V -66 +KPX Atilde W -51 +KPX Atilde Y -90 +KPX Atilde comma 19 +KPX Atilde period 19 +KPX B A -32 +KPX B AE -20 +KPX B Aacute -32 +KPX B Acircumflex -32 +KPX B Adieresis -32 +KPX B Aring -32 +KPX B Atilde -32 +KPX B O -11 +KPX B OE -2 +KPX B Oacute -11 +KPX B Ocircumflex -11 +KPX B Odieresis -11 +KPX B Ograve -11 +KPX B Oslash -5 +KPX B V -39 +KPX B W -27 +KPX B Y -51 +KPX C A -29 +KPX C AE -17 +KPX C Aacute -29 +KPX C Adieresis -29 +KPX C Aring -29 +KPX C H 5 +KPX C K 2 +KPX C O -6 +KPX C Oacute -6 +KPX C Odieresis -6 +KPX Ccedilla A -28 +KPX D A -37 +KPX D Aacute -37 +KPX D Acircumflex -37 +KPX D Adieresis -37 +KPX D Agrave -37 +KPX D Aring -37 +KPX D Atilde -37 +KPX D J 2 +KPX D T -17 +KPX D V -35 +KPX D W -20 +KPX D X -35 +KPX D Y -56 +KPX F A -63 +KPX F Aacute -63 +KPX F Acircumflex -63 +KPX F Adieresis -63 +KPX F Agrave -63 +KPX F Aring -63 +KPX F Atilde -63 +KPX F J -25 +KPX F O -16 +KPX F Odieresis -16 +KPX F a -15 +KPX F aacute -15 +KPX F adieresis -15 +KPX F ae -17 +KPX F aring -15 +KPX F comma -76 +KPX F e -7 +KPX F eacute -7 +KPX F hyphen 11 +KPX F i -7 +KPX F j -9 +KPX F o -14 +KPX F oacute -14 +KPX F odieresis -14 +KPX F oe -8 +KPX F oslash -15 +KPX F period -75 +KPX F r -27 +KPX F u -24 +KPX G A -8 +KPX G AE 4 +KPX G Aacute -8 +KPX G Acircumflex -8 +KPX G Adieresis -8 +KPX G Agrave -8 +KPX G Aring -8 +KPX G Atilde -8 +KPX G T -17 +KPX G V -36 +KPX G W -20 +KPX G Y -56 +KPX J A -32 +KPX J AE -20 +KPX J Adieresis -32 +KPX J Aring -32 +KPX K C -53 +KPX K G -55 +KPX K O -54 +KPX K OE -44 +KPX K Oacute -54 +KPX K Odieresis -54 +KPX K S -30 +KPX K T 13 +KPX K a -3 +KPX K adieresis -3 +KPX K ae 0 +KPX K aring -3 +KPX K e -25 +KPX K hyphen -44 +KPX K o -33 +KPX K oacute -33 +KPX K odieresis -33 +KPX K u -23 +KPX K udieresis -23 +KPX K y -65 +KPX L A 9 +KPX L AE 21 +KPX L Aacute 9 +KPX L Adieresis 9 +KPX L Aring 9 +KPX L C -26 +KPX L Ccedilla -26 +KPX L G -30 +KPX L O -29 +KPX L Oacute -29 +KPX L Ocircumflex -29 +KPX L Odieresis -29 +KPX L Ograve -29 +KPX L Otilde -29 +KPX L S -2 +KPX L T -95 +KPX L U -24 +KPX L Udieresis -24 +KPX L V -90 +KPX L W -68 +KPX L Y -112 +KPX L hyphen -12 +KPX L quotedblright -141 +KPX L quoteright -138 +KPX L u -7 +KPX L udieresis -7 +KPX L y -55 +KPX N A -5 +KPX N AE 7 +KPX N Aacute -5 +KPX N Adieresis -5 +KPX N Aring -5 +KPX N C 9 +KPX N Ccedilla 9 +KPX N G 8 +KPX N O 8 +KPX N Oacute 8 +KPX N Odieresis 8 +KPX N a 13 +KPX N aacute 13 +KPX N adieresis 13 +KPX N ae 13 +KPX N aring 13 +KPX N comma 15 +KPX N e 18 +KPX N eacute 18 +KPX N o 11 +KPX N oacute 11 +KPX N odieresis 11 +KPX N oslash 11 +KPX N period 16 +KPX N u 12 +KPX N udieresis 12 +KPX O A -37 +KPX O AE -26 +KPX O Aacute -37 +KPX O Adieresis -37 +KPX O Aring -37 +KPX O T -20 +KPX O V -36 +KPX O W -21 +KPX O X -36 +KPX O Y -59 +KPX Oacute A -37 +KPX Oacute T -20 +KPX Oacute V -36 +KPX Oacute W -21 +KPX Oacute Y -59 +KPX Ocircumflex T -20 +KPX Ocircumflex V -36 +KPX Ocircumflex Y -59 +KPX Odieresis A -37 +KPX Odieresis T -20 +KPX Odieresis V -36 +KPX Odieresis W -21 +KPX Odieresis X -36 +KPX Odieresis Y -59 +KPX Ograve T -20 +KPX Ograve V -36 +KPX Ograve Y -59 +KPX Oslash A -32 +KPX Otilde T -20 +KPX Otilde V -36 +KPX Otilde Y -59 +KPX P A -65 +KPX P AE -54 +KPX P Aacute -65 +KPX P Adieresis -65 +KPX P Aring -65 +KPX P J -44 +KPX P a -7 +KPX P aacute -7 +KPX P adieresis -7 +KPX P ae -8 +KPX P aring -7 +KPX P comma -94 +KPX P e -8 +KPX P eacute -8 +KPX P hyphen 0 +KPX P o -14 +KPX P oacute -14 +KPX P odieresis -14 +KPX P oe -8 +KPX P oslash -17 +KPX P period -94 +KPX R C -5 +KPX R Ccedilla -5 +KPX R G -6 +KPX R O -6 +KPX R OE 3 +KPX R Oacute -6 +KPX R Odieresis -6 +KPX R T 0 +KPX R U -4 +KPX R Udieresis -4 +KPX R V -26 +KPX R W -17 +KPX R Y -37 +KPX R a 0 +KPX R aacute 0 +KPX R adieresis 0 +KPX R ae 0 +KPX R aring 0 +KPX R e 2 +KPX R eacute 2 +KPX R hyphen 15 +KPX R o -4 +KPX R oacute -4 +KPX R odieresis -4 +KPX R oe 1 +KPX R u 0 +KPX R uacute 0 +KPX R udieresis 0 +KPX R y 5 +KPX S A -20 +KPX S AE -8 +KPX S Aacute -20 +KPX S Adieresis -20 +KPX S Aring -20 +KPX S T -5 +KPX S V -31 +KPX S W -17 +KPX S Y -43 +KPX S t 1 +KPX T A -87 +KPX T AE -75 +KPX T Aacute -87 +KPX T Acircumflex -87 +KPX T Adieresis -87 +KPX T Agrave -87 +KPX T Aring -87 +KPX T Atilde -87 +KPX T C -20 +KPX T G -22 +KPX T J -87 +KPX T O -22 +KPX T OE -11 +KPX T Oacute -22 +KPX T Ocircumflex -22 +KPX T Odieresis -22 +KPX T Ograve -22 +KPX T Oslash -23 +KPX T Otilde -22 +KPX T S 3 +KPX T V 18 +KPX T W 24 +KPX T Y 16 +KPX T a -73 +KPX T ae -73 +KPX T c -74 +KPX T colon -97 +KPX T comma -67 +KPX T e -69 +KPX T g -75 +KPX T guillemotleft -101 +KPX T guilsinglleft -98 +KPX T hyphen -48 +KPX T i -1 +KPX T j -3 +KPX T o -76 +KPX T oslash -73 +KPX T period -67 +KPX T r -71 +KPX T s -74 +KPX T semicolon -98 +KPX T u -72 +KPX T v -82 +KPX T w -77 +KPX T y -80 +KPX U A -34 +KPX U AE -22 +KPX U Aacute -34 +KPX U Acircumflex -34 +KPX U Adieresis -34 +KPX U Aring -34 +KPX U Atilde -34 +KPX U comma -7 +KPX U m 6 +KPX U n 5 +KPX U p 7 +KPX U period -4 +KPX U r 5 +KPX Uacute A -34 +KPX Uacute comma -7 +KPX Uacute m 6 +KPX Uacute n 5 +KPX Uacute p 7 +KPX Uacute period -4 +KPX Uacute r 5 +KPX Ucircumflex A -34 +KPX Udieresis A -34 +KPX Udieresis b 6 +KPX Udieresis comma -7 +KPX Udieresis m 6 +KPX Udieresis n 5 +KPX Udieresis p 7 +KPX Udieresis period -4 +KPX Udieresis r 5 +KPX Ugrave A -34 +KPX V A -71 +KPX V AE -59 +KPX V Aacute -71 +KPX V Acircumflex -71 +KPX V Adieresis -71 +KPX V Agrave -71 +KPX V Aring -71 +KPX V Atilde -71 +KPX V C -36 +KPX V G -38 +KPX V O -37 +KPX V Oacute -37 +KPX V Ocircumflex -37 +KPX V Odieresis -37 +KPX V Ograve -37 +KPX V Oslash -31 +KPX V Otilde -37 +KPX V S -21 +KPX V T 21 +KPX V a -47 +KPX V ae -48 +KPX V colon -65 +KPX V comma -69 +KPX V e -43 +KPX V g -49 +KPX V guillemotleft -74 +KPX V guilsinglleft -72 +KPX V hyphen -21 +KPX V i -5 +KPX V o -50 +KPX V oslash -48 +KPX V period -69 +KPX V r -34 +KPX V semicolon -67 +KPX V u -34 +KPX V y -10 +KPX W A -54 +KPX W AE -43 +KPX W Aacute -54 +KPX W Acircumflex -54 +KPX W Adieresis -54 +KPX W Agrave -54 +KPX W Aring -54 +KPX W Atilde -54 +KPX W C -20 +KPX W G -22 +KPX W O -21 +KPX W Oacute -21 +KPX W Ocircumflex -21 +KPX W Odieresis -21 +KPX W Ograve -21 +KPX W Oslash -15 +KPX W Otilde -21 +KPX W S -12 +KPX W T 25 +KPX W a -29 +KPX W ae -29 +KPX W colon -53 +KPX W comma -45 +KPX W e -24 +KPX W g -30 +KPX W guillemotleft -55 +KPX W guilsinglleft -53 +KPX W hyphen -3 +KPX W i -1 +KPX W o -31 +KPX W oslash -29 +KPX W period -45 +KPX W r -24 +KPX W semicolon -54 +KPX W u -23 +KPX W y 0 +KPX X C -34 +KPX X O -35 +KPX X Odieresis -35 +KPX X Q -37 +KPX X a -5 +KPX X e -25 +KPX X hyphen -27 +KPX X o -32 +KPX X u -25 +KPX X y -40 +KPX Y A -86 +KPX Y AE -74 +KPX Y Aacute -86 +KPX Y Acircumflex -86 +KPX Y Adieresis -86 +KPX Y Agrave -86 +KPX Y Aring -86 +KPX Y Atilde -86 +KPX Y C -52 +KPX Y G -54 +KPX Y O -54 +KPX Y Oacute -54 +KPX Y Ocircumflex -54 +KPX Y Odieresis -54 +KPX Y Ograve -54 +KPX Y Oslash -47 +KPX Y Otilde -54 +KPX Y S -29 +KPX Y T 22 +KPX Y a -66 +KPX Y ae -67 +KPX Y colon -81 +KPX Y comma -78 +KPX Y e -63 +KPX Y g -68 +KPX Y guillemotleft -98 +KPX Y guilsinglleft -96 +KPX Y hyphen -50 +KPX Y i -3 +KPX Y o -70 +KPX Y oslash -67 +KPX Y p -45 +KPX Y period -78 +KPX Y semicolon -83 +KPX Y u -48 +KPX Y v -27 +KPX Z v -11 +KPX Z y -9 +KPX a j -1 +KPX a quoteright -11 +KPX a v -19 +KPX a w -5 +KPX a y -17 +KPX aacute v -19 +KPX aacute w -5 +KPX aacute y -17 +KPX adieresis v -19 +KPX adieresis w -5 +KPX adieresis y -17 +KPX ae v -21 +KPX ae w -7 +KPX ae y -19 +KPX agrave v -19 +KPX agrave w -5 +KPX agrave y -17 +KPX aring v -19 +KPX aring w -5 +KPX aring y -17 +KPX b v -20 +KPX b w -7 +KPX b y -20 +KPX c h 0 +KPX c k 3 +KPX comma one -73 +KPX comma quotedblright -33 +KPX comma quoteright -30 +KPX e quoteright -12 +KPX e t -4 +KPX e v -19 +KPX e w -6 +KPX e x -21 +KPX e y -17 +KPX eacute v -19 +KPX eacute w -6 +KPX eacute y -17 +KPX ecircumflex v -19 +KPX ecircumflex w -6 +KPX ecircumflex y -17 +KPX eight four 10 +KPX eight one -23 +KPX eight seven -6 +KPX f a 1 +KPX f aacute 1 +KPX f adieresis 1 +KPX f ae 0 +KPX f aring 1 +KPX f e -3 +KPX f eacute -3 +KPX f f 21 +KPX f i -3 +KPX f j -6 +KPX f l -3 +KPX f o -9 +KPX f oacute -9 +KPX f odieresis -9 +KPX f oe -3 +KPX f oslash -9 +KPX f quoteright 10 +KPX f s -1 +KPX f t 21 +KPX five four 6 +KPX five one -29 +KPX five seven -10 +KPX four four 9 +KPX four one -50 +KPX four seven -28 +KPX g a 3 +KPX g adieresis 3 +KPX g ae 3 +KPX g aring 3 +KPX g e 8 +KPX g eacute 8 +KPX g l 0 +KPX g oacute 1 +KPX g odieresis 1 +KPX g r 1 +KPX guillemotright A -51 +KPX guillemotright AE -39 +KPX guillemotright Aacute -51 +KPX guillemotright Adieresis -51 +KPX guillemotright Aring -51 +KPX guillemotright T -108 +KPX guillemotright V -78 +KPX guillemotright W -60 +KPX guillemotright Y -111 +KPX guilsinglright A -46 +KPX guilsinglright AE -35 +KPX guilsinglright Aacute -46 +KPX guilsinglright Adieresis -46 +KPX guilsinglright Aring -46 +KPX guilsinglright T -104 +KPX guilsinglright V -74 +KPX guilsinglright W -56 +KPX guilsinglright Y -107 +KPX h quoteright -14 +KPX h y -21 +KPX hyphen A -1 +KPX hyphen AE 10 +KPX hyphen Aacute -1 +KPX hyphen Adieresis -1 +KPX hyphen Aring -1 +KPX hyphen T -57 +KPX hyphen V -27 +KPX hyphen W -9 +KPX hyphen Y -64 +KPX i T -4 +KPX i j -2 +KPX k a -2 +KPX k aacute -2 +KPX k adieresis -2 +KPX k ae 1 +KPX k aring -2 +KPX k comma 7 +KPX k e -15 +KPX k eacute -15 +KPX k g -21 +KPX k hyphen -25 +KPX k o -22 +KPX k oacute -22 +KPX k odieresis -22 +KPX k period 6 +KPX k s -10 +KPX k u -1 +KPX k udieresis -1 +KPX l v -5 +KPX l y -2 +KPX m p 6 +KPX m v -19 +KPX m w -6 +KPX m y -18 +KPX n T -80 +KPX n p 5 +KPX n quoteright -12 +KPX n v -20 +KPX n w -7 +KPX n y -19 +KPX nine four 4 +KPX nine one -21 +KPX nine seven -17 +KPX o T -84 +KPX o quoteright -17 +KPX o t -8 +KPX o v -23 +KPX o w -10 +KPX o x -25 +KPX o y -22 +KPX oacute v -23 +KPX oacute w -10 +KPX oacute y -22 +KPX ocircumflex t -8 +KPX odieresis t -8 +KPX odieresis v -23 +KPX odieresis w -10 +KPX odieresis x -25 +KPX odieresis y -22 +KPX ograve v -23 +KPX ograve w -10 +KPX ograve y -22 +KPX one comma -42 +KPX one eight -37 +KPX one five -43 +KPX one four -56 +KPX one nine -39 +KPX one one -85 +KPX one period -42 +KPX one seven -65 +KPX one six -37 +KPX one three -44 +KPX one two -47 +KPX one zero -34 +KPX p t -5 +KPX p y -20 +KPX period one -73 +KPX period quotedblright -32 +KPX period quoteright -29 +KPX q c 4 +KPX q u 4 +KPX quotedblbase A 12 +KPX quotedblbase AE 24 +KPX quotedblbase T -75 +KPX quotedblbase V -73 +KPX quotedblbase W -51 +KPX quotedblbase Y -92 +KPX quotedblleft A -68 +KPX quotedblleft AE -57 +KPX quotedblleft Aacute -68 +KPX quotedblleft Adieresis -68 +KPX quotedblleft Aring -68 +KPX quotedblleft T -2 +KPX quotedblleft V 6 +KPX quotedblleft W 16 +KPX quotedblleft Y -9 +KPX quotedblright A -69 +KPX quotedblright AE -57 +KPX quotedblright Aacute -69 +KPX quotedblright Adieresis -69 +KPX quotedblright Aring -69 +KPX quotedblright T 1 +KPX quotedblright V 7 +KPX quotedblright W 17 +KPX quotedblright Y -7 +KPX quoteleft A -73 +KPX quoteleft AE -62 +KPX quoteleft Aacute -73 +KPX quoteleft Adieresis -73 +KPX quoteleft Aring -73 +KPX quoteleft T -7 +KPX quoteleft V 2 +KPX quoteleft W 11 +KPX quoteleft Y -13 +KPX quoteright A -77 +KPX quoteright AE -66 +KPX quoteright Aacute -77 +KPX quoteright Adieresis -77 +KPX quoteright Aring -77 +KPX quoteright comma -46 +KPX quoteright d -27 +KPX quoteright o -30 +KPX quoteright period -45 +KPX quoteright r -15 +KPX quoteright s -22 +KPX quoteright t -4 +KPX quoteright v -5 +KPX quoteright w 1 +KPX quoteright y -3 +KPX r a 6 +KPX r aacute 6 +KPX r acircumflex 6 +KPX r adieresis 6 +KPX r ae 4 +KPX r agrave 6 +KPX r aring 6 +KPX r c 0 +KPX r ccedilla 0 +KPX r colon -27 +KPX r comma -57 +KPX r d 0 +KPX r e 4 +KPX r eacute 4 +KPX r ecircumflex 4 +KPX r egrave 4 +KPX r f 22 +KPX r g -2 +KPX r h -4 +KPX r hyphen -35 +KPX r i -4 +KPX r j -6 +KPX r k 0 +KPX r l -4 +KPX r m -1 +KPX r n -2 +KPX r o -1 +KPX r oacute -1 +KPX r ocircumflex -1 +KPX r odieresis -1 +KPX r oe 5 +KPX r ograve -1 +KPX r oslash -4 +KPX r p 0 +KPX r period -57 +KPX r q 1 +KPX r quoteright 14 +KPX r r -2 +KPX r s 3 +KPX r semicolon -27 +KPX r t 22 +KPX r u 0 +KPX r v 21 +KPX r w 26 +KPX r x 17 +KPX r y 23 +KPX r z 9 +KPX s quoteright -12 +KPX s t -1 +KPX seven colon -63 +KPX seven comma -88 +KPX seven eight -3 +KPX seven five -21 +KPX seven four -62 +KPX seven one -14 +KPX seven period -87 +KPX seven seven 9 +KPX seven six -13 +KPX seven three 0 +KPX seven two -4 +KPX six four 7 +KPX six one -21 +KPX six seven -3 +KPX t S 0 +KPX t a 6 +KPX t aacute 6 +KPX t adieresis 6 +KPX t ae 7 +KPX t aring 6 +KPX t colon -25 +KPX t e -3 +KPX t eacute -3 +KPX t h 2 +KPX t o -10 +KPX t oacute -10 +KPX t odieresis -10 +KPX t quoteright 4 +KPX t semicolon -25 +KPX three four 6 +KPX three one -27 +KPX three seven -10 +KPX two four -9 +KPX two one -16 +KPX two seven -3 +KPX u quoteright -2 +KPX v a -15 +KPX v aacute -15 +KPX v acircumflex -15 +KPX v adieresis -15 +KPX v ae -16 +KPX v agrave -15 +KPX v aring -15 +KPX v atilde -15 +KPX v c -20 +KPX v colon -32 +KPX v comma -51 +KPX v e -15 +KPX v eacute -15 +KPX v ecircumflex -15 +KPX v egrave -15 +KPX v g -21 +KPX v hyphen 0 +KPX v l -5 +KPX v o -22 +KPX v oacute -22 +KPX v odieresis -22 +KPX v ograve -22 +KPX v oslash -20 +KPX v period -50 +KPX v s -17 +KPX v semicolon -34 +KPX w a -7 +KPX w aacute -7 +KPX w acircumflex -7 +KPX w adieresis -7 +KPX w ae -8 +KPX w agrave -7 +KPX w aring -7 +KPX w atilde -7 +KPX w c -8 +KPX w colon -27 +KPX w comma -33 +KPX w e -3 +KPX w eacute -3 +KPX w ecircumflex -3 +KPX w egrave -3 +KPX w g -9 +KPX w hyphen 11 +KPX w l -1 +KPX w o -10 +KPX w oacute -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w oslash -8 +KPX w period -32 +KPX w s -9 +KPX w semicolon -29 +KPX x a -9 +KPX x c -22 +KPX x e -17 +KPX x eacute -17 +KPX x o -24 +KPX x q -20 +KPX y a -14 +KPX y aacute -14 +KPX y acircumflex -14 +KPX y adieresis -14 +KPX y ae -15 +KPX y agrave -14 +KPX y aring -14 +KPX y atilde -14 +KPX y c -21 +KPX y colon -31 +KPX y comma -51 +KPX y e -16 +KPX y eacute -16 +KPX y ecircumflex -16 +KPX y egrave -16 +KPX y g -21 +KPX y hyphen 0 +KPX y l -4 +KPX y o -22 +KPX y oacute -22 +KPX y odieresis -22 +KPX y ograve -22 +KPX y oslash -20 +KPX y period -50 +KPX y s -16 +KPX y semicolon -33 +KPX zero four 5 +KPX zero one -19 +KPX zero seven -10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n019004l.pfb b/pdf2swf/fonts/n019004l.pfb new file mode 100644 index 00000000..aec380a3 Binary files /dev/null and b/pdf2swf/fonts/n019004l.pfb differ diff --git a/pdf2swf/fonts/n019023l.afm b/pdf2swf/fonts/n019023l.afm new file mode 100644 index 00000000..0172d808 --- /dev/null +++ b/pdf2swf/fonts/n019023l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusSanL-ReguItal +FullName Nimbus Sans L Regular Italic +FamilyName Nimbus Sans L +Weight Regular +ItalicAngle -12.0 +IsFixedPitch false +UnderlinePosition -151 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -178 -284 1108 953 +CapHeight 729 +XHeight 524 +Descender -213 +Ascender 729 +StartCharMetrics 316 +C 32 ; WX 278 ; N space ; B 213 0 213 0 ; +C 33 ; WX 278 ; N exclam ; B 124 0 363 729 ; +C 34 ; WX 355 ; N quotedbl ; B 177 464 455 709 ; +C 35 ; WX 556 ; N numbersign ; B 54 -20 649 697 ; +C 36 ; WX 556 ; N dollar ; B 69 -126 613 770 ; +C 37 ; WX 889 ; N percent ; B 134 -20 895 709 ; +C 38 ; WX 667 ; N ampersand ; B 83 -23 644 709 ; +C 39 ; WX 222 ; N quoteright ; B 166 477 309 708 ; +C 40 ; WX 333 ; N parenleft ; B 113 -213 446 729 ; +C 41 ; WX 333 ; N parenright ; B -7 -213 325 729 ; +C 42 ; WX 389 ; N asterisk ; B 169 438 471 729 ; +C 43 ; WX 584 ; N plus ; B 92 -11 591 473 ; +C 44 ; WX 278 ; N comma ; B 55 -150 214 103 ; +C 45 ; WX 333 ; N hyphen ; B 97 240 351 312 ; +C 46 ; WX 278 ; N period ; B 87 0 213 103 ; +C 47 ; WX 278 ; N slash ; B -12 -20 434 729 ; +C 48 ; WX 556 ; N zero ; B 98 -23 598 709 ; +C 49 ; WX 556 ; N one ; B 208 0 498 709 ; +C 50 ; WX 556 ; N two ; B 34 0 620 709 ; +C 51 ; WX 556 ; N three ; B 71 -23 599 709 ; +C 52 ; WX 556 ; N four ; B 63 0 573 709 ; +C 53 ; WX 556 ; N five ; B 70 -23 629 709 ; +C 54 ; WX 556 ; N six ; B 93 -23 611 709 ; +C 55 ; WX 556 ; N seven ; B 137 0 671 709 ; +C 56 ; WX 556 ; N eight ; B 74 -23 604 709 ; +C 57 ; WX 556 ; N nine ; B 83 -23 599 709 ; +C 58 ; WX 278 ; N colon ; B 110 0 326 524 ; +C 59 ; WX 278 ; N semicolon ; B 78 -150 325 524 ; +C 60 ; WX 584 ; N less ; B 87 -9 635 474 ; +C 61 ; WX 584 ; N equal ; B 74 111 609 355 ; +C 62 ; WX 584 ; N greater ; B 48 -9 596 474 ; +C 63 ; WX 556 ; N question ; B 184 0 630 741 ; +C 64 ; WX 1015 ; N at ; B 80 -142 1036 741 ; +C 65 ; WX 667 ; N A ; B 17 0 653 729 ; +C 66 ; WX 667 ; N B ; B 79 0 711 729 ; +C 67 ; WX 722 ; N C ; B 112 -23 770 741 ; +C 68 ; WX 722 ; N D ; B 89 0 759 729 ; +C 69 ; WX 667 ; N E ; B 90 0 751 729 ; +C 70 ; WX 611 ; N F ; B 90 0 734 729 ; +C 71 ; WX 778 ; N G ; B 109 -23 809 741 ; +C 72 ; WX 722 ; N H ; B 83 0 799 729 ; +C 73 ; WX 278 ; N I ; B 100 0 349 729 ; +C 74 ; WX 500 ; N J ; B 47 -23 581 729 ; +C 75 ; WX 667 ; N K ; B 79 0 813 729 ; +C 76 ; WX 556 ; N L ; B 80 0 551 729 ; +C 77 ; WX 833 ; N M ; B 75 0 916 729 ; +C 78 ; WX 722 ; N N ; B 76 0 801 729 ; +C 79 ; WX 778 ; N O ; B 104 -23 828 741 ; +C 80 ; WX 667 ; N P ; B 91 0 733 729 ; +C 81 ; WX 778 ; N Q ; B 104 -59 828 741 ; +C 82 ; WX 722 ; N R ; B 93 0 770 729 ; +C 83 ; WX 667 ; N S ; B 89 -23 714 741 ; +C 84 ; WX 611 ; N T ; B 158 0 748 729 ; +C 85 ; WX 722 ; N U ; B 124 -23 800 729 ; +C 86 ; WX 667 ; N V ; B 185 0 800 729 ; +C 87 ; WX 944 ; N W ; B 177 0 1084 729 ; +C 88 ; WX 667 ; N X ; B 22 0 794 729 ; +C 89 ; WX 667 ; N Y ; B 168 0 816 729 ; +C 90 ; WX 611 ; N Z ; B 28 0 737 729 ; +C 91 ; WX 278 ; N bracketleft ; B 19 -213 405 729 ; +C 92 ; WX 278 ; N backslash ; B 147 -20 280 729 ; +C 93 ; WX 278 ; N bracketright ; B -23 -213 364 729 ; +C 94 ; WX 469 ; N asciicircum ; B 115 329 496 709 ; +C 95 ; WX 556 ; N underscore ; B -59 -176 551 -126 ; +C 96 ; WX 222 ; N quoteleft ; B 163 477 308 709 ; +C 97 ; WX 556 ; N a ; B 65 -23 568 539 ; +C 98 ; WX 556 ; N b ; B 54 -23 588 729 ; +C 99 ; WX 500 ; N c ; B 76 -23 554 539 ; +C 100 ; WX 556 ; N d ; B 73 -23 650 729 ; +C 101 ; WX 556 ; N e ; B 84 -23 580 539 ; +C 102 ; WX 278 ; N f ; B 89 0 413 732 ; +C 103 ; WX 556 ; N g ; B 32 -218 601 539 ; +C 104 ; WX 556 ; N h ; B 70 0 574 729 ; +C 105 ; WX 222 ; N i ; B 66 0 305 729 ; +C 106 ; WX 222 ; N j ; B -65 -218 308 729 ; +C 107 ; WX 500 ; N k ; B 58 0 584 729 ; +C 108 ; WX 222 ; N l ; B 68 0 307 729 ; +C 109 ; WX 833 ; N m ; B 71 0 852 539 ; +C 110 ; WX 556 ; N n ; B 70 0 574 539 ; +C 111 ; WX 556 ; N o ; B 80 -23 576 539 ; +C 112 ; WX 556 ; N p ; B 7 -213 586 539 ; +C 113 ; WX 556 ; N q ; B 71 -213 607 539 ; +C 114 ; WX 333 ; N r ; B 69 0 436 539 ; +C 115 ; WX 500 ; N s ; B 61 -23 520 539 ; +C 116 ; WX 278 ; N t ; B 97 -23 366 668 ; +C 117 ; WX 556 ; N u ; B 88 -23 594 524 ; +C 118 ; WX 500 ; N v ; B 122 0 598 524 ; +C 119 ; WX 722 ; N w ; B 118 0 820 524 ; +C 120 ; WX 500 ; N x ; B 17 0 583 524 ; +C 121 ; WX 500 ; N y ; B 8 -218 590 524 ; +C 122 ; WX 500 ; N z ; B 31 0 557 524 ; +C 123 ; WX 334 ; N braceleft ; B 91 -213 431 729 ; +C 124 ; WX 260 ; N bar ; B 54 -212 315 729 ; +C 125 ; WX 334 ; N braceright ; B -16 -213 324 729 ; +C 126 ; WX 584 ; N asciitilde ; B 137 268 594 438 ; +C 161 ; WX 333 ; N exclamdown ; B 76 -205 317 524 ; +C 162 ; WX 556 ; N cent ; B 96 -120 585 628 ; +C 163 ; WX 556 ; N sterling ; B 44 -23 628 729 ; +C 164 ; WX 167 ; N fraction ; B -178 -20 486 709 ; +C 165 ; WX 556 ; N yen ; B 100 0 696 709 ; +C 166 ; WX 556 ; N florin ; B -32 -212 696 738 ; +C 167 ; WX 556 ; N section ; B 63 -213 589 729 ; +C 168 ; WX 556 ; N currency ; B 110 133 593 556 ; +C 169 ; WX 191 ; N quotesingle ; B 173 464 292 709 ; +C 170 ; WX 333 ; N quotedblleft ; B 146 477 449 709 ; +C 171 ; WX 556 ; N guillemotleft ; B 147 106 548 438 ; +C 172 ; WX 333 ; N guilsinglleft ; B 140 106 336 438 ; +C 173 ; WX 333 ; N guilsinglright ; B 109 106 307 438 ; +C 174 ; WX 500 ; N fi ; B 83 0 591 732 ; +C 175 ; WX 500 ; N fl ; B 88 0 585 732 ; +C 177 ; WX 556 ; N endash ; B 46 240 628 312 ; +C 178 ; WX 556 ; N dagger ; B 127 -177 620 709 ; +C 179 ; WX 556 ; N daggerdbl ; B 51 -177 620 709 ; +C 180 ; WX 278 ; N periodcentered ; B 166 192 293 295 ; +C 182 ; WX 537 ; N paragraph ; B 145 -178 677 729 ; +C 183 ; WX 350 ; N bullet ; B 120 220 376 470 ; +C 184 ; WX 222 ; N quotesinglbase ; B 37 -128 180 103 ; +C 185 ; WX 333 ; N quotedblbase ; B 20 -128 322 103 ; +C 186 ; WX 333 ; N quotedblright ; B 150 477 452 708 ; +C 187 ; WX 556 ; N guillemotright ; B 121 106 518 438 ; +C 188 ; WX 1000 ; N ellipsis ; B 115 0 907 103 ; +C 189 ; WX 1000 ; N perthousand ; B 93 -20 1024 738 ; +C 191 ; WX 611 ; N questiondown ; B 86 -217 531 524 ; +C 193 ; WX 333 ; N grave ; B 179 592 357 740 ; +C 194 ; WX 333 ; N acute ; B 218 592 458 740 ; +C 195 ; WX 333 ; N circumflex ; B 146 591 433 741 ; +C 196 ; WX 333 ; N tilde ; B 130 611 471 719 ; +C 197 ; WX 333 ; N macron ; B 160 627 450 696 ; +C 198 ; WX 333 ; N breve ; B 165 594 471 729 ; +C 199 ; WX 333 ; N dotaccent ; B 244 612 370 715 ; +C 200 ; WX 333 ; N dieresis ; B 159 612 446 715 ; +C 202 ; WX 333 ; N ring ; B 216 579 396 754 ; +C 203 ; WX 333 ; N cedilla ; B 1 -214 264 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 91 590 505 740 ; +C 206 ; WX 333 ; N ogonek ; B 35 -205 246 0 ; +C 207 ; WX 333 ; N caron ; B 176 592 463 740 ; +C 208 ; WX 1000 ; N emdash ; B 42 240 1068 312 ; +C 225 ; WX 1000 ; N AE ; B 11 0 1087 729 ; +C 227 ; WX 370 ; N ordfeminine ; B 107 303 441 742 ; +C 232 ; WX 556 ; N Lslash ; B 75 0 570 729 ; +C 233 ; WX 778 ; N Oslash ; B 32 -24 867 741 ; +C 234 ; WX 1000 ; N OE ; B 101 -23 1108 741 ; +C 235 ; WX 365 ; N ordmasculine ; B 114 303 452 742 ; +C 241 ; WX 889 ; N ae ; B 59 -23 915 539 ; +C 245 ; WX 278 ; N dotlessi ; B 94 0 290 527 ; +C 248 ; WX 222 ; N lslash ; B 62 0 312 729 ; +C 249 ; WX 611 ; N oslash ; B 19 -30 639 541 ; +C 250 ; WX 944 ; N oe ; B 85 -23 966 539 ; +C 251 ; WX 611 ; N germandbls ; B 126 -23 655 729 ; +C -1 ; WX 722 ; N Udieresis ; B 124 -23 800 914 ; +C -1 ; WX 722 ; N Uacute ; B 124 -23 800 939 ; +C -1 ; WX 667 ; N Scedilla ; B 89 -214 714 741 ; +C -1 ; WX 611 ; N Tcaron ; B 158 0 748 939 ; +C -1 ; WX 667 ; N Scaron ; B 89 -23 714 939 ; +C -1 ; WX 722 ; N Rcaron ; B 93 0 770 939 ; +C -1 ; WX 722 ; N Racute ; B 93 0 770 939 ; +C -1 ; WX 667 ; N Sacute ; B 89 -23 714 939 ; +C -1 ; WX 778 ; N Otilde ; B 104 -23 828 918 ; +C -1 ; WX 556 ; N ucircumflex ; B 88 -23 594 741 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 104 -23 841 939 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 124 -23 806 939 ; +C -1 ; WX 667 ; N Yacute ; B 168 0 816 939 ; +C -1 ; WX 722 ; N Eth ; B 89 0 759 729 ; +C -1 ; WX 722 ; N Dcroat ; B 89 0 759 729 ; +C -1 ; WX 611 ; N Zacute ; B 28 0 737 939 ; +C -1 ; WX 722 ; N Uring ; B 124 -23 800 953 ; +C -1 ; WX 556 ; N gbreve ; B 32 -218 601 729 ; +C -1 ; WX 556 ; N eogonek ; B 84 -205 580 539 ; +C -1 ; WX 556 ; N edotaccent ; B 84 -23 580 715 ; +C -1 ; WX 556 ; N ecaron ; B 84 -23 580 740 ; +C -1 ; WX 722 ; N Ugrave ; B 124 -23 800 939 ; +C -1 ; WX 667 ; N Thorn ; B 91 0 708 729 ; +C -1 ; WX 556 ; N eacute ; B 84 -23 580 740 ; +C -1 ; WX 556 ; N edieresis ; B 84 -23 580 715 ; +C -1 ; WX 650 ; N dcaron ; B 73 -23 810 729 ; +C -1 ; WX 500 ; N ccedilla ; B 76 -214 554 539 ; +C -1 ; WX 500 ; N ccaron ; B 76 -23 563 740 ; +C -1 ; WX 500 ; N cacute ; B 76 -23 575 740 ; +C -1 ; WX 556 ; N aogonek ; B 65 -205 571 539 ; +C -1 ; WX 556 ; N aring ; B 65 -23 568 754 ; +C -1 ; WX 556 ; N atilde ; B 65 -23 583 719 ; +C -1 ; WX 556 ; N abreve ; B 65 -23 582 729 ; +C -1 ; WX 556 ; N egrave ; B 84 -23 580 740 ; +C -1 ; WX 556 ; N agrave ; B 65 -23 568 740 ; +C -1 ; WX 556 ; N aacute ; B 65 -23 570 740 ; +C -1 ; WX 556 ; N adieresis ; B 65 -23 568 715 ; +C -1 ; WX 722 ; N Uogonek ; B 124 -205 800 729 ; +C -1 ; WX 556 ; N ugrave ; B 88 -23 594 740 ; +C -1 ; WX 556 ; N uacute ; B 88 -23 594 740 ; +C -1 ; WX 556 ; N udieresis ; B 88 -23 594 715 ; +C -1 ; WX 319 ; N tcaron ; B 97 -23 492 801 ; +C -1 ; WX 500 ; N scommaaccent ; B 61 -284 520 539 ; +C -1 ; WX 611 ; N Zcaron ; B 28 0 737 939 ; +C -1 ; WX 556 ; N ecircumflex ; B 84 -23 580 741 ; +C -1 ; WX 722 ; N Ucircumflex ; B 124 -23 800 940 ; +C -1 ; WX 556 ; N acircumflex ; B 65 -23 568 741 ; +C -1 ; WX 611 ; N Zdotaccent ; B 28 0 737 914 ; +C -1 ; WX 500 ; N scaron ; B 61 -23 547 740 ; +C -1 ; WX 667 ; N Amacron ; B 17 0 663 895 ; +C -1 ; WX 500 ; N sacute ; B 61 -23 545 740 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 158 -284 748 729 ; +C -1 ; WX 667 ; N Ydieresis ; B 168 0 816 914 ; +C -1 ; WX 556 ; N thorn ; B 7 -213 586 729 ; +C -1 ; WX 667 ; N Emacron ; B 90 0 751 895 ; +C -1 ; WX 778 ; N Ograve ; B 104 -23 828 939 ; +C -1 ; WX 778 ; N Oacute ; B 104 -23 828 939 ; +C -1 ; WX 778 ; N Odieresis ; B 104 -23 828 914 ; +C -1 ; WX 722 ; N Ntilde ; B 76 0 801 918 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 801 939 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 801 939 ; +C -1 ; WX 556 ; N Lcaron ; B 80 0 551 729 ; +C -1 ; WX 556 ; N Lacute ; B 80 0 551 939 ; +C -1 ; WX 278 ; N Idotaccent ; B 100 0 389 914 ; +C -1 ; WX 333 ; N racute ; B 69 0 498 740 ; +C -1 ; WX 278 ; N Icircumflex ; B 100 0 454 940 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 80 -23 683 740 ; +C -1 ; WX 556 ; N otilde ; B 80 -23 583 719 ; +C -1 ; WX 556 ; N Euro ; B 12 -22 636 709 ; +C -1 ; WX 556 ; N ocircumflex ; B 80 -23 576 741 ; +C -1 ; WX 390 ; N onesuperior ; B 205 284 393 709 ; +C -1 ; WX 390 ; N twosuperior ; B 100 284 468 709 ; +C -1 ; WX 390 ; N threesuperior ; B 123 270 455 709 ; +C -1 ; WX 278 ; N Igrave ; B 100 0 378 939 ; +C -1 ; WX 278 ; N Iacute ; B 100 0 479 939 ; +C -1 ; WX 278 ; N Imacron ; B 100 0 458 895 ; +C -1 ; WX 278 ; N Iogonek ; B 28 -205 349 729 ; +C -1 ; WX 278 ; N Idieresis ; B 100 0 467 907 ; +C -1 ; WX 778 ; N Gbreve ; B 109 -23 809 928 ; +C -1 ; WX 722 ; N Umacron ; B 124 -23 800 895 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 79 -284 813 729 ; +C -1 ; WX 556 ; N ograve ; B 80 -23 576 740 ; +C -1 ; WX 667 ; N Scommaaccent ; B 89 -284 714 741 ; +C -1 ; WX 667 ; N Eogonek ; B 90 -205 751 729 ; +C -1 ; WX 556 ; N oacute ; B 80 -23 576 740 ; +C -1 ; WX 667 ; N Edotaccent ; B 90 0 751 914 ; +C -1 ; WX 222 ; N iogonek ; B 0 -205 305 729 ; +C -1 ; WX 527 ; N gcommaaccent ; B 3 -218 572 813 ; +C -1 ; WX 556 ; N odieresis ; B 80 -23 576 715 ; +C -1 ; WX 556 ; N ntilde ; B 70 0 589 719 ; +C -1 ; WX 556 ; N ncaron ; B 70 0 578 740 ; +C -1 ; WX 667 ; N Ecaron ; B 90 0 751 939 ; +C -1 ; WX 667 ; N Ecircumflex ; B 90 0 751 940 ; +C -1 ; WX 500 ; N scedilla ; B 61 -214 521 539 ; +C -1 ; WX 333 ; N rcaron ; B 69 0 486 740 ; +C -1 ; WX 667 ; N Egrave ; B 90 0 751 939 ; +C -1 ; WX 667 ; N Eacute ; B 90 0 751 939 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 109 -284 809 741 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 93 -284 770 729 ; +C -1 ; WX 667 ; N Edieresis ; B 90 0 751 914 ; +C -1 ; WX 556 ; N nacute ; B 70 0 580 740 ; +C -1 ; WX 556 ; N uogonek ; B 88 -205 594 524 ; +C -1 ; WX 556 ; N umacron ; B 88 -23 594 696 ; +C -1 ; WX 722 ; N Dcaron ; B 89 0 759 939 ; +C -1 ; WX 307 ; N lcaron ; B 68 0 467 729 ; +C -1 ; WX 722 ; N Ccaron ; B 112 -23 770 939 ; +C -1 ; WX 722 ; N Cacute ; B 112 -23 770 939 ; +C -1 ; WX 722 ; N Ccedilla ; B 112 -214 770 741 ; +C -1 ; WX 606 ; N degree ; B 291 383 594 686 ; +C -1 ; WX 667 ; N Aogonek ; B 17 -205 663 729 ; +C -1 ; WX 584 ; N minus ; B 81 197 601 269 ; +C -1 ; WX 584 ; N multiply ; B 113 34 568 427 ; +C -1 ; WX 584 ; N divide ; B 92 0 591 462 ; +C -1 ; WX 667 ; N Aring ; B 17 0 653 953 ; +C -1 ; WX 1000 ; N trademark ; B 208 292 1096 729 ; +C -1 ; WX 333 ; N rcommaaccent ; B 5 -284 436 539 ; +C -1 ; WX 222 ; N lacute ; B 68 0 463 939 ; +C -1 ; WX 556 ; N omacron ; B 80 -23 576 696 ; +C -1 ; WX 667 ; N Atilde ; B 17 0 680 918 ; +C -1 ; WX 278 ; N icircumflex ; B 94 0 406 741 ; +C -1 ; WX 278 ; N igrave ; B 94 0 330 740 ; +C -1 ; WX 556 ; N ncommaaccent ; B 70 -284 574 539 ; +C -1 ; WX 222 ; N lcommaaccent ; B -1 -284 307 729 ; +C -1 ; WX 584 ; N plusminus ; B 50 0 625 633 ; +C -1 ; WX 947 ; N onehalf ; B 202 -20 965 709 ; +C -1 ; WX 947 ; N onequarter ; B 205 -20 938 709 ; +C -1 ; WX 947 ; N threequarters ; B 123 -20 938 709 ; +C -1 ; WX 278 ; N iacute ; B 94 0 431 740 ; +C -1 ; WX 667 ; N Abreve ; B 17 0 683 928 ; +C -1 ; WX 500 ; N kcommaaccent ; B 58 -284 584 729 ; +C -1 ; WX 778 ; N Omacron ; B 104 -23 828 895 ; +C -1 ; WX 222 ; N imacron ; B 66 0 373 696 ; +C -1 ; WX 556 ; N emacron ; B 84 -23 580 696 ; +C -1 ; WX 556 ; N amacron ; B 65 -23 568 696 ; +C -1 ; WX 278 ; N tcommaaccent ; B 55 -284 366 668 ; +C -1 ; WX 500 ; N ydieresis ; B 8 -218 590 715 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 557 715 ; +C -1 ; WX 500 ; N zcaron ; B 31 0 557 740 ; +C -1 ; WX 500 ; N zacute ; B 31 0 557 740 ; +C -1 ; WX 500 ; N yacute ; B 8 -218 590 740 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 88 -23 683 740 ; +C -1 ; WX 556 ; N eth ; B 80 -23 576 743 ; +C -1 ; WX 556 ; N uring ; B 88 -23 594 754 ; +C -1 ; WX 778 ; N Ocircumflex ; B 104 -23 828 940 ; +C -1 ; WX 333 ; N commaaccent ; B 57 -284 205 -60 ; +C -1 ; WX 737 ; N copyright ; B 55 -22 836 742 ; +C -1 ; WX 737 ; N registered ; B 55 -22 836 742 ; +C -1 ; WX 667 ; N Acircumflex ; B 17 0 653 940 ; +C -1 ; WX 278 ; N idieresis ; B 94 0 419 708 ; +C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; +C -1 ; WX 712 ; N Delta ; B 10 0 701 729 ; +C -1 ; WX 584 ; N notequal ; B 74 2 609 480 ; +C -1 ; WX 542 ; N radical ; B 102 -36 705 913 ; +C -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ; +C -1 ; WX 667 ; N Aacute ; B 17 0 667 939 ; +C -1 ; WX 584 ; N lessequal ; B 45 0 659 584 ; +C -1 ; WX 584 ; N greaterequal ; B 56 0 626 584 ; +C -1 ; WX 584 ; N logicalnot ; B 99 86 619 377 ; +C -1 ; WX 711 ; N summation ; B -18 -97 760 762 ; +C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -284 801 729 ; +C -1 ; WX 556 ; N dcroat ; B 73 -23 695 729 ; +C -1 ; WX 260 ; N brokenbar ; B 54 -212 315 729 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 80 -284 551 729 ; +C -1 ; WX 667 ; N Adieresis ; B 17 0 662 914 ; +C -1 ; WX 556 ; N mu ; B 18 -220 593 524 ; +C -1 ; WX 278 ; N .notdef ; B 213 0 213 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -41 +KPX A Ccedilla -41 +KPX A G -41 +KPX A O -37 +KPX A Odieresis -37 +KPX A Q -38 +KPX A T -103 +KPX A U -42 +KPX A Uacute -42 +KPX A Ucircumflex -42 +KPX A Udieresis -42 +KPX A Ugrave -42 +KPX A V -81 +KPX A W -57 +KPX A Y -104 +KPX A a -16 +KPX A b -5 +KPX A c -16 +KPX A ccedilla -16 +KPX A comma -4 +KPX A d -14 +KPX A e -22 +KPX A g -17 +KPX A guillemotleft -51 +KPX A guilsinglleft -47 +KPX A hyphen -8 +KPX A o -19 +KPX A period -2 +KPX A q -15 +KPX A quotedblright -60 +KPX A quoteright -68 +KPX A t -22 +KPX A u -18 +KPX A v -40 +KPX A w -29 +KPX A y -44 +KPX Aacute C -42 +KPX Aacute G -42 +KPX Aacute O -38 +KPX Aacute Q -39 +KPX Aacute T -103 +KPX Aacute U -43 +KPX Aacute V -81 +KPX Aacute W -57 +KPX Aacute Y -104 +KPX Aacute a -16 +KPX Aacute b -6 +KPX Aacute c -17 +KPX Aacute comma -4 +KPX Aacute d -15 +KPX Aacute e -23 +KPX Aacute g -17 +KPX Aacute guillemotleft -51 +KPX Aacute guilsinglleft -48 +KPX Aacute hyphen -9 +KPX Aacute o -20 +KPX Aacute period -3 +KPX Aacute q -16 +KPX Aacute quoteright -68 +KPX Aacute t -23 +KPX Aacute u -20 +KPX Aacute v -40 +KPX Aacute w -29 +KPX Aacute y -44 +KPX Acircumflex C -41 +KPX Acircumflex G -41 +KPX Acircumflex O -37 +KPX Acircumflex Q -38 +KPX Acircumflex T -103 +KPX Acircumflex U -42 +KPX Acircumflex V -81 +KPX Acircumflex W -57 +KPX Acircumflex Y -104 +KPX Acircumflex comma -4 +KPX Acircumflex period -2 +KPX Adieresis C -42 +KPX Adieresis G -41 +KPX Adieresis O -38 +KPX Adieresis Q -39 +KPX Adieresis T -103 +KPX Adieresis U -43 +KPX Adieresis V -81 +KPX Adieresis W -57 +KPX Adieresis Y -104 +KPX Adieresis a -16 +KPX Adieresis b -5 +KPX Adieresis c -17 +KPX Adieresis comma -4 +KPX Adieresis d -14 +KPX Adieresis g -17 +KPX Adieresis guillemotleft -51 +KPX Adieresis guilsinglleft -48 +KPX Adieresis hyphen -8 +KPX Adieresis o -19 +KPX Adieresis period -3 +KPX Adieresis q -15 +KPX Adieresis quotedblright -60 +KPX Adieresis quoteright -68 +KPX Adieresis t -22 +KPX Adieresis u -19 +KPX Adieresis v -40 +KPX Adieresis w -29 +KPX Adieresis y -44 +KPX Agrave C -41 +KPX Agrave G -41 +KPX Agrave O -37 +KPX Agrave Q -38 +KPX Agrave T -103 +KPX Agrave U -42 +KPX Agrave V -81 +KPX Agrave W -57 +KPX Agrave Y -104 +KPX Agrave comma -4 +KPX Agrave period -2 +KPX Aring C -41 +KPX Aring G -41 +KPX Aring O -37 +KPX Aring Q -38 +KPX Aring T -103 +KPX Aring U -42 +KPX Aring V -81 +KPX Aring W -57 +KPX Aring Y -104 +KPX Aring a -16 +KPX Aring b -5 +KPX Aring c -16 +KPX Aring comma -4 +KPX Aring d -14 +KPX Aring e -22 +KPX Aring g -17 +KPX Aring guillemotleft -51 +KPX Aring guilsinglleft -47 +KPX Aring hyphen -8 +KPX Aring o -19 +KPX Aring period -2 +KPX Aring q -15 +KPX Aring quotedblright -60 +KPX Aring quoteright -68 +KPX Aring t -22 +KPX Aring u -18 +KPX Aring v -40 +KPX Aring w -29 +KPX Aring y -44 +KPX Atilde C -43 +KPX Atilde G -42 +KPX Atilde O -39 +KPX Atilde Q -40 +KPX Atilde T -103 +KPX Atilde U -44 +KPX Atilde V -81 +KPX Atilde W -57 +KPX Atilde Y -104 +KPX Atilde comma -4 +KPX Atilde period -4 +KPX B A -28 +KPX B AE -29 +KPX B Aacute -28 +KPX B Acircumflex -28 +KPX B Adieresis -28 +KPX B Aring -28 +KPX B Atilde -28 +KPX B O -14 +KPX B OE -11 +KPX B Oacute -14 +KPX B Ocircumflex -14 +KPX B Odieresis -14 +KPX B Ograve -14 +KPX B Oslash -2 +KPX B V -49 +KPX B W -27 +KPX B Y -56 +KPX C A -43 +KPX C AE -44 +KPX C Aacute -43 +KPX C Adieresis -43 +KPX C Aring -43 +KPX C H -22 +KPX C K -20 +KPX C O -18 +KPX C Oacute -18 +KPX C Odieresis -18 +KPX Ccedilla A -44 +KPX D A -50 +KPX D Aacute -50 +KPX D Acircumflex -50 +KPX D Adieresis -50 +KPX D Agrave -50 +KPX D Aring -50 +KPX D Atilde -50 +KPX D J -13 +KPX D T -56 +KPX D V -54 +KPX D W -31 +KPX D X -58 +KPX D Y -74 +KPX F A -78 +KPX F Aacute -78 +KPX F Acircumflex -78 +KPX F Adieresis -78 +KPX F Agrave -78 +KPX F Aring -78 +KPX F Atilde -78 +KPX F J -59 +KPX F O -30 +KPX F Odieresis -30 +KPX F a -45 +KPX F aacute -45 +KPX F adieresis -45 +KPX F ae -41 +KPX F aring -45 +KPX F comma -113 +KPX F e -33 +KPX F eacute -33 +KPX F hyphen -20 +KPX F i -19 +KPX F j -19 +KPX F o -30 +KPX F oacute -30 +KPX F odieresis -30 +KPX F oe -33 +KPX F oslash -30 +KPX F period -113 +KPX F r -44 +KPX F u -42 +KPX G A -14 +KPX G AE -11 +KPX G Aacute -14 +KPX G Acircumflex -14 +KPX G Adieresis -14 +KPX G Agrave -14 +KPX G Aring -14 +KPX G Atilde -14 +KPX G T -53 +KPX G V -53 +KPX G W -31 +KPX G Y -72 +KPX J A -39 +KPX J AE -39 +KPX J Adieresis -39 +KPX J Aring -39 +KPX K C -56 +KPX K G -57 +KPX K O -53 +KPX K OE -49 +KPX K Oacute -53 +KPX K Odieresis -53 +KPX K S -48 +KPX K T 14 +KPX K a -23 +KPX K adieresis -23 +KPX K ae -20 +KPX K aring -23 +KPX K e -46 +KPX K hyphen -53 +KPX K o -42 +KPX K oacute -42 +KPX K odieresis -42 +KPX K u -32 +KPX K udieresis -32 +KPX K y -76 +KPX L A 8 +KPX L AE 11 +KPX L Aacute 8 +KPX L Adieresis 8 +KPX L Aring 8 +KPX L C -52 +KPX L Ccedilla -51 +KPX L G -53 +KPX L O -51 +KPX L Oacute -51 +KPX L Ocircumflex -51 +KPX L Odieresis -51 +KPX L Ograve -51 +KPX L Otilde -51 +KPX L S -28 +KPX L T -112 +KPX L U -46 +KPX L Udieresis -46 +KPX L V -115 +KPX L W -77 +KPX L Y -128 +KPX L hyphen -140 +KPX L quotedblright -145 +KPX L quoteright -153 +KPX L u -17 +KPX L udieresis -17 +KPX L y -68 +KPX N A -19 +KPX N AE -16 +KPX N Aacute -19 +KPX N Adieresis -19 +KPX N Aring -19 +KPX N C -15 +KPX N Ccedilla -14 +KPX N G -14 +KPX N O -11 +KPX N Oacute -11 +KPX N Odieresis -11 +KPX N a -17 +KPX N aacute -17 +KPX N adieresis -17 +KPX N ae -13 +KPX N aring -17 +KPX N comma -15 +KPX N e -11 +KPX N eacute -11 +KPX N o -8 +KPX N oacute -8 +KPX N odieresis -8 +KPX N oslash -4 +KPX N period -15 +KPX N u -8 +KPX N udieresis -9 +KPX O A -43 +KPX O AE -47 +KPX O Aacute -43 +KPX O Adieresis -43 +KPX O Aring -43 +KPX O T -54 +KPX O V -48 +KPX O W -25 +KPX O X -52 +KPX O Y -71 +KPX Oacute A -43 +KPX Oacute T -54 +KPX Oacute V -48 +KPX Oacute W -25 +KPX Oacute Y -71 +KPX Ocircumflex T -54 +KPX Ocircumflex V -48 +KPX Ocircumflex Y -71 +KPX Odieresis A -43 +KPX Odieresis T -54 +KPX Odieresis V -48 +KPX Odieresis W -25 +KPX Odieresis X -52 +KPX Odieresis Y -71 +KPX Ograve T -54 +KPX Ograve V -48 +KPX Ograve Y -71 +KPX Oslash A -47 +KPX Otilde T -54 +KPX Otilde V -48 +KPX Otilde Y -71 +KPX P A -86 +KPX P AE -93 +KPX P Aacute -86 +KPX P Adieresis -86 +KPX P Aring -86 +KPX P J -85 +KPX P a -39 +KPX P aacute -39 +KPX P adieresis -39 +KPX P ae -35 +KPX P aring -39 +KPX P comma -138 +KPX P e -38 +KPX P eacute -38 +KPX P hyphen -45 +KPX P o -34 +KPX P oacute -34 +KPX P odieresis -34 +KPX P oe -38 +KPX P oslash -35 +KPX P period -138 +KPX R C -21 +KPX R Ccedilla -21 +KPX R G -21 +KPX R O -17 +KPX R OE -14 +KPX R Oacute -17 +KPX R Odieresis -17 +KPX R T -33 +KPX R U -21 +KPX R Udieresis -21 +KPX R V -49 +KPX R W -27 +KPX R Y -54 +KPX R a -21 +KPX R aacute -21 +KPX R adieresis -21 +KPX R ae -17 +KPX R aring -21 +KPX R e -16 +KPX R eacute -16 +KPX R hyphen -4 +KPX R o -13 +KPX R oacute -13 +KPX R odieresis -13 +KPX R oe -16 +KPX R u -13 +KPX R uacute -14 +KPX R udieresis -14 +KPX R y -16 +KPX S A -31 +KPX S AE -31 +KPX S Aacute -31 +KPX S Adieresis -31 +KPX S Aring -31 +KPX S T -38 +KPX S V -52 +KPX S W -31 +KPX S Y -58 +KPX S t -11 +KPX T A -104 +KPX T AE -106 +KPX T Aacute -104 +KPX T Acircumflex -104 +KPX T Adieresis -104 +KPX T Agrave -104 +KPX T Aring -104 +KPX T Atilde -104 +KPX T C -53 +KPX T G -55 +KPX T J -108 +KPX T O -50 +KPX T OE -44 +KPX T Oacute -50 +KPX T Ocircumflex -50 +KPX T Odieresis -50 +KPX T Ograve -50 +KPX T Oslash -42 +KPX T Otilde -50 +KPX T S -32 +KPX T V 2 +KPX T W 7 +KPX T Y 10 +KPX T a -107 +KPX T ae -104 +KPX T c -96 +KPX T colon -152 +KPX T comma -105 +KPX T e -102 +KPX T g -94 +KPX T guillemotleft -126 +KPX T guilsinglleft -123 +KPX T hyphen -82 +KPX T i -12 +KPX T j -12 +KPX T o -99 +KPX T oslash -94 +KPX T period -105 +KPX T r -98 +KPX T s -98 +KPX T semicolon -140 +KPX T u -98 +KPX T v -106 +KPX T w -103 +KPX T y -110 +KPX U A -45 +KPX U AE -48 +KPX U Aacute -45 +KPX U Acircumflex -45 +KPX U Adieresis -45 +KPX U Aring -45 +KPX U Atilde -45 +KPX U comma -35 +KPX U m -17 +KPX U n -16 +KPX U p -8 +KPX U period -32 +KPX U r -16 +KPX Uacute A -45 +KPX Uacute comma -35 +KPX Uacute m -17 +KPX Uacute n -16 +KPX Uacute p -8 +KPX Uacute period -32 +KPX Uacute r -16 +KPX Ucircumflex A -45 +KPX Udieresis A -44 +KPX Udieresis b -8 +KPX Udieresis comma -35 +KPX Udieresis m -17 +KPX Udieresis n -16 +KPX Udieresis p -8 +KPX Udieresis period -32 +KPX Udieresis r -16 +KPX Ugrave A -45 +KPX V A -77 +KPX V AE -84 +KPX V Aacute -77 +KPX V Acircumflex -77 +KPX V Adieresis -77 +KPX V Agrave -77 +KPX V Aring -77 +KPX V Atilde -77 +KPX V C -50 +KPX V G -50 +KPX V O -46 +KPX V Oacute -46 +KPX V Ocircumflex -46 +KPX V Odieresis -46 +KPX V Ograve -46 +KPX V Oslash -34 +KPX V Otilde -46 +KPX V S -44 +KPX V T 7 +KPX V a -71 +KPX V ae -66 +KPX V colon -76 +KPX V comma -94 +KPX V e -64 +KPX V g -57 +KPX V guillemotleft -88 +KPX V guilsinglleft -84 +KPX V hyphen -44 +KPX V i -14 +KPX V o -61 +KPX V oslash -57 +KPX V period -94 +KPX V r -51 +KPX V semicolon -75 +KPX V u -52 +KPX V y -28 +KPX W A -56 +KPX W AE -62 +KPX W Aacute -56 +KPX W Acircumflex -56 +KPX W Adieresis -56 +KPX W Agrave -56 +KPX W Aring -56 +KPX W Atilde -56 +KPX W C -30 +KPX W G -30 +KPX W O -26 +KPX W Oacute -26 +KPX W Ocircumflex -26 +KPX W Odieresis -26 +KPX W Ograve -26 +KPX W Oslash -14 +KPX W Otilde -26 +KPX W S -31 +KPX W T 11 +KPX W a -46 +KPX W ae -42 +KPX W colon -62 +KPX W comma -62 +KPX W e -39 +KPX W g -32 +KPX W guillemotleft -63 +KPX W guilsinglleft -60 +KPX W hyphen -19 +KPX W i -10 +KPX W o -36 +KPX W oslash -32 +KPX W period -62 +KPX W r -36 +KPX W semicolon -62 +KPX W u -36 +KPX W y -15 +KPX X C -53 +KPX X O -50 +KPX X Odieresis -50 +KPX X Q -51 +KPX X a -27 +KPX X e -51 +KPX X hyphen -57 +KPX X o -46 +KPX X u -36 +KPX X y -67 +KPX Y A -102 +KPX Y AE -108 +KPX Y Aacute -102 +KPX Y Acircumflex -102 +KPX Y Adieresis -102 +KPX Y Agrave -102 +KPX Y Aring -102 +KPX Y Atilde -102 +KPX Y C -68 +KPX Y G -69 +KPX Y O -64 +KPX Y Oacute -64 +KPX Y Ocircumflex -64 +KPX Y Odieresis -64 +KPX Y Ograve -64 +KPX Y Oslash -55 +KPX Y Otilde -64 +KPX Y S -49 +KPX Y T 15 +KPX Y a -100 +KPX Y ae -95 +KPX Y colon -97 +KPX Y comma -117 +KPX Y e -97 +KPX Y g -89 +KPX Y guillemotleft -128 +KPX Y guilsinglleft -124 +KPX Y hyphen -89 +KPX Y i -6 +KPX Y o -93 +KPX Y oslash -89 +KPX Y p -63 +KPX Y period -117 +KPX Y semicolon -97 +KPX Y u -73 +KPX Y v -48 +KPX Z v -44 +KPX Z y -44 +KPX a j -10 +KPX a quoteright -23 +KPX a v -26 +KPX a w -16 +KPX a y -33 +KPX aacute v -26 +KPX aacute w -16 +KPX aacute y -33 +KPX adieresis v -26 +KPX adieresis w -16 +KPX adieresis y -33 +KPX ae v -26 +KPX ae w -15 +KPX ae y -32 +KPX agrave v -26 +KPX agrave w -16 +KPX agrave y -33 +KPX aring v -26 +KPX aring w -16 +KPX aring y -33 +KPX b v -21 +KPX b w -10 +KPX b y -28 +KPX c h -7 +KPX c k -1 +KPX comma one -105 +KPX comma quotedblright -47 +KPX comma quoteright -55 +KPX e quoteright -20 +KPX e t -16 +KPX e v -26 +KPX e w -16 +KPX e x -35 +KPX e y -33 +KPX eacute v -26 +KPX eacute w -16 +KPX eacute y -33 +KPX ecircumflex v -26 +KPX ecircumflex w -16 +KPX ecircumflex y -33 +KPX eight four -6 +KPX eight one -55 +KPX eight seven -43 +KPX f a -20 +KPX f aacute -20 +KPX f adieresis -20 +KPX f ae -15 +KPX f aring -20 +KPX f e -21 +KPX f eacute -21 +KPX f f 12 +KPX f i -10 +KPX f j -11 +KPX f l -12 +KPX f o -18 +KPX f oacute -18 +KPX f odieresis -18 +KPX f oe -20 +KPX f oslash -16 +KPX f quoteright -8 +KPX f s -8 +KPX f t 16 +KPX five four -7 +KPX five one -83 +KPX five seven -32 +KPX four four -3 +KPX four one -88 +KPX four seven -65 +KPX g a -17 +KPX g adieresis -17 +KPX g ae -13 +KPX g aring -17 +KPX g e -11 +KPX g eacute -11 +KPX g l -8 +KPX g oacute -8 +KPX g odieresis -8 +KPX g r -9 +KPX guillemotright A -58 +KPX guillemotright AE -62 +KPX guillemotright Aacute -58 +KPX guillemotright Adieresis -58 +KPX guillemotright Aring -58 +KPX guillemotright T -132 +KPX guillemotright V -96 +KPX guillemotright W -68 +KPX guillemotright Y -137 +KPX guilsinglright A -52 +KPX guilsinglright AE -56 +KPX guilsinglright Aacute -52 +KPX guilsinglright Adieresis -52 +KPX guilsinglright Aring -52 +KPX guilsinglright T -126 +KPX guilsinglright V -90 +KPX guilsinglright W -62 +KPX guilsinglright Y -131 +KPX h quoteright -19 +KPX h y -31 +KPX hyphen A -12 +KPX hyphen AE -17 +KPX hyphen Aacute -12 +KPX hyphen Adieresis -12 +KPX hyphen Aring -12 +KPX hyphen T -86 +KPX hyphen V -51 +KPX hyphen W -24 +KPX hyphen Y -97 +KPX i T -16 +KPX i j -10 +KPX k a -14 +KPX k aacute -14 +KPX k adieresis -14 +KPX k ae -12 +KPX k aring -14 +KPX k comma -13 +KPX k e -33 +KPX k eacute -33 +KPX k g -26 +KPX k hyphen -49 +KPX k o -30 +KPX k oacute -30 +KPX k odieresis -30 +KPX k period -13 +KPX k s -14 +KPX k u -22 +KPX k udieresis -16 +KPX l v -11 +KPX l y -15 +KPX m p -3 +KPX m v -24 +KPX m w -14 +KPX m y -30 +KPX n T -103 +KPX n p -3 +KPX n quoteright -19 +KPX n v -24 +KPX n w -14 +KPX n y -31 +KPX nine four -12 +KPX nine one -55 +KPX nine seven -50 +KPX o T -106 +KPX o quoteright -23 +KPX o t -17 +KPX o v -27 +KPX o w -16 +KPX o x -35 +KPX o y -34 +KPX oacute v -27 +KPX oacute w -16 +KPX oacute y -34 +KPX ocircumflex t -17 +KPX odieresis t -17 +KPX odieresis v -27 +KPX odieresis w -16 +KPX odieresis x -35 +KPX odieresis y -34 +KPX ograve v -27 +KPX ograve w -16 +KPX ograve y -34 +KPX one comma -82 +KPX one eight -73 +KPX one five -72 +KPX one four -88 +KPX one nine -71 +KPX one one -125 +KPX one period -82 +KPX one seven -98 +KPX one six -71 +KPX one three -75 +KPX one two -78 +KPX one zero -71 +KPX p t -10 +KPX p y -28 +KPX period one -106 +KPX period quotedblright -48 +KPX period quoteright -56 +KPX q c -2 +KPX q u -5 +KPX quotedblbase A 21 +KPX quotedblbase AE 21 +KPX quotedblbase T -80 +KPX quotedblbase V -74 +KPX quotedblbase W -39 +KPX quotedblbase Y -96 +KPX quotedblleft A -58 +KPX quotedblleft AE -70 +KPX quotedblleft Aacute -58 +KPX quotedblleft Adieresis -58 +KPX quotedblleft Aring -58 +KPX quotedblleft T 1 +KPX quotedblleft V 10 +KPX quotedblleft W 22 +KPX quotedblleft Y -1 +KPX quotedblright A -60 +KPX quotedblright AE -72 +KPX quotedblright Aacute -60 +KPX quotedblright Adieresis -60 +KPX quotedblright Aring -60 +KPX quotedblright T 2 +KPX quotedblright V 9 +KPX quotedblright W 21 +KPX quotedblright Y -2 +KPX quoteleft A -74 +KPX quoteleft AE -86 +KPX quoteleft Aacute -74 +KPX quoteleft Adieresis -74 +KPX quoteleft Aring -74 +KPX quoteleft T -14 +KPX quoteleft V -5 +KPX quoteleft W 6 +KPX quoteleft Y -17 +KPX quoteright A -76 +KPX quoteright AE -88 +KPX quoteright Aacute -76 +KPX quoteright Adieresis -76 +KPX quoteright Aring -76 +KPX quoteright comma -68 +KPX quoteright d -25 +KPX quoteright o -31 +KPX quoteright period -68 +KPX quoteright r -24 +KPX quoteright s -23 +KPX quoteright t -14 +KPX quoteright v -10 +KPX quoteright w -5 +KPX quoteright y -14 +KPX r a -16 +KPX r aacute -16 +KPX r acircumflex -16 +KPX r adieresis -16 +KPX r ae -11 +KPX r agrave -16 +KPX r aring -16 +KPX r c -11 +KPX r ccedilla -11 +KPX r colon -31 +KPX r comma -77 +KPX r d -8 +KPX r e -17 +KPX r eacute -17 +KPX r ecircumflex -17 +KPX r egrave -17 +KPX r f 17 +KPX r g -8 +KPX r h -8 +KPX r hyphen -54 +KPX r i -6 +KPX r j -6 +KPX r k -2 +KPX r l -7 +KPX r m -9 +KPX r n -8 +KPX r o -14 +KPX r oacute -14 +KPX r ocircumflex -14 +KPX r odieresis -14 +KPX r oe -16 +KPX r ograve -14 +KPX r oslash -14 +KPX r p 0 +KPX r period -77 +KPX r q -10 +KPX r quoteright -6 +KPX r r -8 +KPX r s -4 +KPX r semicolon -30 +KPX r t 21 +KPX r u -7 +KPX r v 18 +KPX r w 21 +KPX r x 9 +KPX r y 15 +KPX r z 0 +KPX s quoteright -24 +KPX s t -15 +KPX seven colon -84 +KPX seven comma -123 +KPX seven eight -34 +KPX seven five -37 +KPX seven four -95 +KPX seven one -58 +KPX seven period -123 +KPX seven seven -11 +KPX seven six -44 +KPX seven three -29 +KPX seven two -31 +KPX six four -7 +KPX six one -52 +KPX six seven -40 +KPX t S -17 +KPX t a -10 +KPX t aacute -10 +KPX t adieresis -10 +KPX t ae -7 +KPX t aring -10 +KPX t colon -37 +KPX t e -22 +KPX t eacute -22 +KPX t h -14 +KPX t o -19 +KPX t oacute -19 +KPX t odieresis -19 +KPX t quoteright -7 +KPX t semicolon -36 +KPX three four -9 +KPX three one -57 +KPX three seven -45 +KPX two four -43 +KPX two one -45 +KPX two seven -38 +KPX u quoteright -14 +KPX v a -30 +KPX v aacute -30 +KPX v acircumflex -30 +KPX v adieresis -30 +KPX v ae -25 +KPX v agrave -30 +KPX v aring -30 +KPX v atilde -30 +KPX v c -22 +KPX v colon -32 +KPX v comma -76 +KPX v e -29 +KPX v eacute -29 +KPX v ecircumflex -29 +KPX v egrave -29 +KPX v g -20 +KPX v hyphen -19 +KPX v l -8 +KPX v o -25 +KPX v oacute -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v oslash -25 +KPX v period -76 +KPX v s -17 +KPX v semicolon -31 +KPX w a -26 +KPX w aacute -26 +KPX w acircumflex -26 +KPX w adieresis -26 +KPX w ae -22 +KPX w agrave -26 +KPX w aring -26 +KPX w atilde -26 +KPX w c -14 +KPX w colon -32 +KPX w comma -57 +KPX w e -20 +KPX w eacute -20 +KPX w ecircumflex -20 +KPX w egrave -20 +KPX w g -13 +KPX w hyphen -8 +KPX w l -8 +KPX w o -17 +KPX w oacute -17 +KPX w odieresis -17 +KPX w ograve -17 +KPX w oslash -14 +KPX w period -57 +KPX w s -14 +KPX w semicolon -31 +KPX x a -30 +KPX x c -30 +KPX x e -36 +KPX x eacute -36 +KPX x o -33 +KPX x q -28 +KPX y a -36 +KPX y aacute -36 +KPX y acircumflex -36 +KPX y adieresis -36 +KPX y ae -31 +KPX y agrave -36 +KPX y aring -36 +KPX y atilde -36 +KPX y c -28 +KPX y colon -40 +KPX y comma -80 +KPX y e -35 +KPX y eacute -35 +KPX y ecircumflex -35 +KPX y egrave -35 +KPX y g -26 +KPX y hyphen -24 +KPX y l -14 +KPX y o -31 +KPX y oacute -31 +KPX y odieresis -31 +KPX y ograve -31 +KPX y oslash -30 +KPX y period -80 +KPX y s -23 +KPX y semicolon -40 +KPX zero four -11 +KPX zero one -56 +KPX zero seven -50 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n019023l.pfb b/pdf2swf/fonts/n019023l.pfb new file mode 100644 index 00000000..876cda87 Binary files /dev/null and b/pdf2swf/fonts/n019023l.pfb differ diff --git a/pdf2swf/fonts/n019024l.afm b/pdf2swf/fonts/n019024l.afm new file mode 100644 index 00000000..9433a322 --- /dev/null +++ b/pdf2swf/fonts/n019024l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusSanL-BoldItal +FullName Nimbus Sans L Bold Italic +FamilyName Nimbus Sans L +Weight Bold +ItalicAngle -12.0 +IsFixedPitch false +UnderlinePosition -111 +UnderlineThickness 69 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -177 -309 1107 953 +CapHeight 729 +XHeight 540 +Descender -217 +Ascender 729 +StartCharMetrics 316 +C 32 ; WX 278 ; N space ; B 245 0 245 0 ; +C 33 ; WX 333 ; N exclam ; B 112 0 417 726 ; +C 34 ; WX 474 ; N quotedbl ; B 177 470 579 729 ; +C 35 ; WX 556 ; N numbersign ; B 33 -32 660 697 ; +C 36 ; WX 556 ; N dollar ; B 59 -126 628 763 ; +C 37 ; WX 889 ; N percent ; B 129 -20 903 709 ; +C 38 ; WX 722 ; N ampersand ; B 89 -23 720 723 ; +C 39 ; WX 278 ; N quoteright ; B 165 469 356 729 ; +C 40 ; WX 333 ; N parenleft ; B 84 -200 458 729 ; +C 41 ; WX 333 ; N parenright ; B -21 -200 356 729 ; +C 42 ; WX 389 ; N asterisk ; B 145 407 478 729 ; +C 43 ; WX 584 ; N plus ; B 87 -10 596 473 ; +C 44 ; WX 278 ; N comma ; B 27 -174 245 146 ; +C 45 ; WX 333 ; N hyphen ; B 70 207 371 342 ; +C 46 ; WX 278 ; N period ; B 64 0 245 146 ; +C 47 ; WX 278 ; N slash ; B -1 -14 427 714 ; +C 48 ; WX 556 ; N zero ; B 81 -23 614 724 ; +C 49 ; WX 556 ; N one ; B 172 0 529 709 ; +C 50 ; WX 556 ; N two ; B 30 0 628 724 ; +C 51 ; WX 556 ; N three ; B 67 -23 613 724 ; +C 52 ; WX 556 ; N four ; B 57 0 599 709 ; +C 53 ; WX 556 ; N five ; B 59 -23 641 709 ; +C 54 ; WX 556 ; N six ; B 85 -23 625 724 ; +C 55 ; WX 556 ; N seven ; B 131 0 679 709 ; +C 56 ; WX 556 ; N eight ; B 60 -23 620 724 ; +C 57 ; WX 556 ; N nine ; B 68 -23 611 724 ; +C 58 ; WX 333 ; N colon ; B 113 0 374 520 ; +C 59 ; WX 333 ; N semicolon ; B 76 -174 374 520 ; +C 60 ; WX 584 ; N less ; B 77 -10 630 474 ; +C 61 ; WX 584 ; N equal ; B 61 52 622 412 ; +C 62 ; WX 584 ; N greater ; B 38 -10 591 474 ; +C 63 ; WX 611 ; N question ; B 168 0 672 744 ; +C 64 ; WX 975 ; N at ; B 73 -137 1032 745 ; +C 65 ; WX 722 ; N A ; B 26 0 703 729 ; +C 66 ; WX 722 ; N B ; B 82 0 762 729 ; +C 67 ; WX 722 ; N C ; B 107 -23 793 741 ; +C 68 ; WX 722 ; N D ; B 77 0 776 729 ; +C 69 ; WX 667 ; N E ; B 79 0 762 729 ; +C 70 ; WX 611 ; N F ; B 74 0 741 729 ; +C 71 ; WX 778 ; N G ; B 107 -23 819 741 ; +C 72 ; WX 722 ; N H ; B 68 0 812 729 ; +C 73 ; WX 278 ; N I ; B 63 0 368 729 ; +C 74 ; WX 556 ; N J ; B 59 -23 641 729 ; +C 75 ; WX 722 ; N K ; B 74 0 843 729 ; +C 76 ; WX 611 ; N L ; B 80 0 606 729 ; +C 77 ; WX 833 ; N M ; B 66 0 931 729 ; +C 78 ; WX 722 ; N N ; B 68 0 816 729 ; +C 79 ; WX 778 ; N O ; B 106 -23 828 741 ; +C 80 ; WX 667 ; N P ; B 76 0 747 729 ; +C 81 ; WX 778 ; N Q ; B 109 -54 831 741 ; +C 82 ; WX 722 ; N R ; B 80 0 785 729 ; +C 83 ; WX 667 ; N S ; B 76 -23 725 741 ; +C 84 ; WX 611 ; N T ; B 142 0 753 729 ; +C 85 ; WX 722 ; N U ; B 119 -23 809 729 ; +C 86 ; WX 667 ; N V ; B 179 0 802 729 ; +C 87 ; WX 944 ; N W ; B 168 0 1087 729 ; +C 88 ; WX 667 ; N X ; B 22 0 802 729 ; +C 89 ; WX 667 ; N Y ; B 182 0 805 729 ; +C 90 ; WX 611 ; N Z ; B 30 0 733 729 ; +C 91 ; WX 333 ; N bracketleft ; B 23 -200 463 729 ; +C 92 ; WX 278 ; N backslash ; B 138 -23 285 709 ; +C 93 ; WX 333 ; N bracketright ; B -25 -200 415 729 ; +C 94 ; WX 584 ; N asciicircum ; B 119 270 580 695 ; +C 95 ; WX 556 ; N underscore ; B -65 -145 550 -76 ; +C 96 ; WX 278 ; N quoteleft ; B 167 469 357 729 ; +C 97 ; WX 556 ; N a ; B 50 -23 578 549 ; +C 98 ; WX 611 ; N b ; B 59 -23 640 729 ; +C 99 ; WX 556 ; N c ; B 77 -23 597 549 ; +C 100 ; WX 611 ; N d ; B 79 -23 700 729 ; +C 101 ; WX 556 ; N e ; B 64 -23 591 549 ; +C 102 ; WX 333 ; N f ; B 90 0 464 729 ; +C 103 ; WX 611 ; N g ; B 26 -218 656 549 ; +C 104 ; WX 611 ; N h ; B 67 0 629 729 ; +C 105 ; WX 278 ; N i ; B 67 0 362 729 ; +C 106 ; WX 278 ; N j ; B -43 -218 365 729 ; +C 107 ; WX 556 ; N k ; B 59 0 651 729 ; +C 108 ; WX 278 ; N l ; B 67 0 362 729 ; +C 109 ; WX 889 ; N m ; B 60 0 911 549 ; +C 110 ; WX 611 ; N n ; B 63 0 629 549 ; +C 111 ; WX 611 ; N o ; B 82 -23 634 549 ; +C 112 ; WX 611 ; N p ; B 11 -218 637 549 ; +C 113 ; WX 611 ; N q ; B 72 -218 659 549 ; +C 114 ; WX 389 ; N r ; B 63 0 487 549 ; +C 115 ; WX 556 ; N s ; B 60 -23 589 549 ; +C 116 ; WX 333 ; N t ; B 101 -23 414 674 ; +C 117 ; WX 611 ; N u ; B 88 -23 656 540 ; +C 118 ; WX 556 ; N v ; B 129 0 651 540 ; +C 119 ; WX 778 ; N w ; B 120 0 881 540 ; +C 120 ; WX 556 ; N x ; B 16 0 648 540 ; +C 121 ; WX 556 ; N y ; B 37 -219 653 540 ; +C 122 ; WX 500 ; N z ; B 21 0 575 540 ; +C 123 ; WX 389 ; N braceleft ; B 84 -200 472 729 ; +C 124 ; WX 280 ; N bar ; B 57 -200 335 729 ; +C 125 ; WX 389 ; N braceright ; B 29 -200 419 729 ; +C 126 ; WX 584 ; N asciitilde ; B 97 142 581 314 ; +C 161 ; WX 333 ; N exclamdown ; B 26 -186 331 540 ; +C 162 ; WX 556 ; N cent ; B 79 -124 598 634 ; +C 163 ; WX 556 ; N sterling ; B 49 -23 629 715 ; +C 164 ; WX 167 ; N fraction ; B -177 -20 489 715 ; +C 165 ; WX 556 ; N yen ; B 107 0 702 704 ; +C 166 ; WX 556 ; N florin ; B -21 -220 690 744 ; +C 167 ; WX 556 ; N section ; B 56 -201 596 723 ; +C 168 ; WX 556 ; N currency ; B 66 100 644 604 ; +C 169 ; WX 238 ; N quotesingle ; B 177 470 343 729 ; +C 170 ; WX 500 ; N quotedblleft ; B 171 469 588 729 ; +C 171 ; WX 556 ; N guillemotleft ; B 135 72 571 481 ; +C 172 ; WX 333 ; N guilsinglleft ; B 128 72 351 481 ; +C 173 ; WX 333 ; N guilsinglright ; B 96 72 319 481 ; +C 174 ; WX 611 ; N fi ; B 85 0 703 729 ; +C 175 ; WX 611 ; N fl ; B 88 0 701 729 ; +C 177 ; WX 556 ; N endash ; B 35 207 624 311 ; +C 178 ; WX 556 ; N dagger ; B 109 -194 626 709 ; +C 179 ; WX 556 ; N daggerdbl ; B 35 -194 623 709 ; +C 180 ; WX 278 ; N periodcentered ; B 143 182 270 282 ; +C 182 ; WX 556 ; N paragraph ; B 121 -191 684 729 ; +C 183 ; WX 350 ; N bullet ; B 111 175 367 425 ; +C 184 ; WX 278 ; N quotesinglbase ; B 37 -135 228 125 ; +C 185 ; WX 500 ; N quotedblbase ; B 37 -135 462 125 ; +C 186 ; WX 500 ; N quotedblright ; B 173 469 595 729 ; +C 187 ; WX 556 ; N guillemotright ; B 103 72 533 481 ; +C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; +C 189 ; WX 1000 ; N perthousand ; B 72 -21 1021 739 ; +C 191 ; WX 611 ; N questiondown ; B 52 -204 556 540 ; +C 193 ; WX 333 ; N grave ; B 175 607 339 757 ; +C 194 ; WX 333 ; N acute ; B 247 607 475 757 ; +C 195 ; WX 333 ; N circumflex ; B 135 610 453 757 ; +C 196 ; WX 333 ; N tilde ; B 117 622 500 744 ; +C 197 ; WX 333 ; N macron ; B 150 642 467 722 ; +C 198 ; WX 333 ; N breve ; B 188 611 455 754 ; +C 199 ; WX 333 ; N dotaccent ; B 241 621 377 741 ; +C 200 ; WX 333 ; N dieresis ; B 147 621 469 741 ; +C 202 ; WX 333 ; N ring ; B 214 593 398 773 ; +C 203 ; WX 333 ; N cedilla ; B -13 -220 270 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 82 610 498 757 ; +C 206 ; WX 333 ; N ogonek ; B 23 -233 248 0 ; +C 207 ; WX 333 ; N caron ; B 167 610 485 757 ; +C 208 ; WX 1000 ; N emdash ; B 37 207 1070 311 ; +C 225 ; WX 1000 ; N AE ; B 1 0 1104 729 ; +C 227 ; WX 370 ; N ordfeminine ; B 96 262 451 729 ; +C 232 ; WX 611 ; N Lslash ; B 54 0 624 729 ; +C 233 ; WX 778 ; N Oslash ; B 34 -39 906 749 ; +C 234 ; WX 1000 ; N OE ; B 90 -23 1107 741 ; +C 235 ; WX 365 ; N ordmasculine ; B 92 262 471 729 ; +C 241 ; WX 889 ; N ae ; B 54 -23 927 549 ; +C 245 ; WX 278 ; N dotlessi ; B 67 0 322 540 ; +C 248 ; WX 278 ; N lslash ; B 50 0 372 729 ; +C 249 ; WX 611 ; N oslash ; B 12 -38 709 557 ; +C 250 ; WX 944 ; N oe ; B 71 -23 986 549 ; +C 251 ; WX 611 ; N germandbls ; B 67 -23 654 729 ; +C -1 ; WX 722 ; N Udieresis ; B 119 -23 809 920 ; +C -1 ; WX 722 ; N Uacute ; B 119 -23 809 936 ; +C -1 ; WX 667 ; N Scedilla ; B 76 -220 725 741 ; +C -1 ; WX 611 ; N Tcaron ; B 142 0 753 936 ; +C -1 ; WX 667 ; N Scaron ; B 76 -23 725 936 ; +C -1 ; WX 722 ; N Rcaron ; B 80 0 785 936 ; +C -1 ; WX 722 ; N Racute ; B 80 0 785 936 ; +C -1 ; WX 667 ; N Sacute ; B 76 -23 725 936 ; +C -1 ; WX 778 ; N Otilde ; B 106 -23 828 923 ; +C -1 ; WX 611 ; N ucircumflex ; B 88 -23 656 757 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 106 -23 841 936 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 119 -23 809 936 ; +C -1 ; WX 667 ; N Yacute ; B 182 0 805 936 ; +C -1 ; WX 722 ; N Eth ; B 73 0 776 729 ; +C -1 ; WX 722 ; N Dcroat ; B 73 0 776 729 ; +C -1 ; WX 611 ; N Zacute ; B 30 0 733 936 ; +C -1 ; WX 722 ; N Uring ; B 119 -23 809 953 ; +C -1 ; WX 611 ; N gbreve ; B 26 -218 656 754 ; +C -1 ; WX 556 ; N eogonek ; B 64 -233 591 549 ; +C -1 ; WX 556 ; N edotaccent ; B 64 -23 591 741 ; +C -1 ; WX 556 ; N ecaron ; B 64 -23 593 757 ; +C -1 ; WX 722 ; N Ugrave ; B 119 -23 809 936 ; +C -1 ; WX 667 ; N Thorn ; B 76 0 721 729 ; +C -1 ; WX 556 ; N eacute ; B 64 -23 591 757 ; +C -1 ; WX 556 ; N edieresis ; B 64 -23 591 741 ; +C -1 ; WX 722 ; N dcaron ; B 79 -23 882 729 ; +C -1 ; WX 556 ; N ccedilla ; B 77 -220 597 549 ; +C -1 ; WX 556 ; N ccaron ; B 77 -23 607 757 ; +C -1 ; WX 556 ; N cacute ; B 77 -23 597 757 ; +C -1 ; WX 556 ; N aogonek ; B 50 -233 578 549 ; +C -1 ; WX 556 ; N aring ; B 50 -23 578 773 ; +C -1 ; WX 556 ; N atilde ; B 50 -23 612 744 ; +C -1 ; WX 556 ; N abreve ; B 50 -23 578 754 ; +C -1 ; WX 556 ; N egrave ; B 64 -23 591 757 ; +C -1 ; WX 556 ; N agrave ; B 50 -23 578 757 ; +C -1 ; WX 556 ; N aacute ; B 50 -23 587 757 ; +C -1 ; WX 556 ; N adieresis ; B 50 -23 581 741 ; +C -1 ; WX 722 ; N Uogonek ; B 119 -233 809 729 ; +C -1 ; WX 611 ; N ugrave ; B 88 -23 656 757 ; +C -1 ; WX 611 ; N uacute ; B 88 -23 656 757 ; +C -1 ; WX 611 ; N udieresis ; B 88 -23 656 741 ; +C -1 ; WX 404 ; N tcaron ; B 101 -23 578 829 ; +C -1 ; WX 556 ; N scommaaccent ; B 60 -307 589 549 ; +C -1 ; WX 611 ; N Zcaron ; B 30 0 733 936 ; +C -1 ; WX 556 ; N ecircumflex ; B 64 -23 591 757 ; +C -1 ; WX 722 ; N Ucircumflex ; B 119 -23 809 936 ; +C -1 ; WX 556 ; N acircumflex ; B 50 -23 578 757 ; +C -1 ; WX 611 ; N Zdotaccent ; B 30 0 733 918 ; +C -1 ; WX 556 ; N scaron ; B 60 -23 597 757 ; +C -1 ; WX 722 ; N Amacron ; B 26 0 706 901 ; +C -1 ; WX 556 ; N sacute ; B 60 -23 589 757 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 142 -307 753 729 ; +C -1 ; WX 667 ; N Ydieresis ; B 182 0 805 920 ; +C -1 ; WX 611 ; N thorn ; B 11 -218 637 729 ; +C -1 ; WX 667 ; N Emacron ; B 79 0 762 901 ; +C -1 ; WX 778 ; N Ograve ; B 106 -23 828 936 ; +C -1 ; WX 778 ; N Oacute ; B 106 -23 828 936 ; +C -1 ; WX 778 ; N Odieresis ; B 106 -23 828 920 ; +C -1 ; WX 722 ; N Ntilde ; B 68 0 816 923 ; +C -1 ; WX 722 ; N Ncaron ; B 68 0 816 936 ; +C -1 ; WX 722 ; N Nacute ; B 68 0 816 936 ; +C -1 ; WX 611 ; N Lcaron ; B 80 0 607 729 ; +C -1 ; WX 611 ; N Lacute ; B 80 0 606 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 63 0 388 918 ; +C -1 ; WX 389 ; N racute ; B 63 0 500 757 ; +C -1 ; WX 278 ; N Icircumflex ; B 63 0 467 936 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 82 -23 710 757 ; +C -1 ; WX 611 ; N otilde ; B 82 -23 639 744 ; +C -1 ; WX 556 ; N Euro ; B 21 -23 648 724 ; +C -1 ; WX 611 ; N ocircumflex ; B 82 -23 634 757 ; +C -1 ; WX 444 ; N onesuperior ; B 210 284 438 709 ; +C -1 ; WX 444 ; N twosuperior ; B 124 284 499 718 ; +C -1 ; WX 444 ; N threesuperior ; B 147 271 490 718 ; +C -1 ; WX 278 ; N Igrave ; B 63 0 368 936 ; +C -1 ; WX 278 ; N Iacute ; B 63 0 489 936 ; +C -1 ; WX 278 ; N Imacron ; B 63 0 466 901 ; +C -1 ; WX 278 ; N Iogonek ; B 7 -233 368 729 ; +C -1 ; WX 278 ; N Idieresis ; B 63 0 483 920 ; +C -1 ; WX 778 ; N Gbreve ; B 107 -23 819 934 ; +C -1 ; WX 722 ; N Umacron ; B 119 -23 809 901 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 74 -307 843 729 ; +C -1 ; WX 611 ; N ograve ; B 82 -23 634 757 ; +C -1 ; WX 667 ; N Scommaaccent ; B 76 -307 725 741 ; +C -1 ; WX 667 ; N Eogonek ; B 79 -233 762 729 ; +C -1 ; WX 611 ; N oacute ; B 82 -23 634 757 ; +C -1 ; WX 667 ; N Edotaccent ; B 79 0 762 918 ; +C -1 ; WX 268 ; N iogonek ; B 0 -233 351 729 ; +C -1 ; WX 611 ; N gcommaaccent ; B 26 -218 656 854 ; +C -1 ; WX 611 ; N odieresis ; B 82 -23 634 741 ; +C -1 ; WX 611 ; N ntilde ; B 63 0 646 744 ; +C -1 ; WX 611 ; N ncaron ; B 63 0 629 757 ; +C -1 ; WX 667 ; N Ecaron ; B 79 0 762 936 ; +C -1 ; WX 667 ; N Ecircumflex ; B 79 0 762 936 ; +C -1 ; WX 556 ; N scedilla ; B 60 -220 589 549 ; +C -1 ; WX 389 ; N rcaron ; B 63 0 533 757 ; +C -1 ; WX 667 ; N Egrave ; B 79 0 762 936 ; +C -1 ; WX 667 ; N Eacute ; B 79 0 762 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 107 -307 819 741 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 80 -307 785 729 ; +C -1 ; WX 667 ; N Edieresis ; B 79 0 762 920 ; +C -1 ; WX 611 ; N nacute ; B 63 0 629 757 ; +C -1 ; WX 611 ; N uogonek ; B 88 -233 656 540 ; +C -1 ; WX 611 ; N umacron ; B 88 -23 656 722 ; +C -1 ; WX 722 ; N Dcaron ; B 77 0 776 936 ; +C -1 ; WX 384 ; N lcaron ; B 67 0 544 729 ; +C -1 ; WX 722 ; N Ccaron ; B 107 -23 793 936 ; +C -1 ; WX 722 ; N Cacute ; B 107 -23 793 936 ; +C -1 ; WX 722 ; N Ccedilla ; B 107 -220 793 741 ; +C -1 ; WX 606 ; N degree ; B 240 383 543 686 ; +C -1 ; WX 722 ; N Aogonek ; B 26 -233 703 729 ; +C -1 ; WX 584 ; N minus ; B 77 172 606 292 ; +C -1 ; WX 584 ; N multiply ; B 102 18 582 444 ; +C -1 ; WX 584 ; N divide ; B 77 0 606 462 ; +C -1 ; WX 722 ; N Aring ; B 26 0 703 953 ; +C -1 ; WX 1000 ; N trademark ; B 213 273 1087 729 ; +C -1 ; WX 389 ; N rcommaaccent ; B 8 -307 487 549 ; +C -1 ; WX 278 ; N lacute ; B 67 0 474 936 ; +C -1 ; WX 611 ; N omacron ; B 82 -23 634 722 ; +C -1 ; WX 722 ; N Atilde ; B 26 0 739 923 ; +C -1 ; WX 278 ; N icircumflex ; B 67 0 426 757 ; +C -1 ; WX 278 ; N igrave ; B 67 0 322 757 ; +C -1 ; WX 611 ; N ncommaaccent ; B 63 -307 629 549 ; +C -1 ; WX 278 ; N lcommaaccent ; B 11 -307 362 729 ; +C -1 ; WX 584 ; N plusminus ; B 50 0 630 633 ; +C -1 ; WX 1055 ; N onehalf ; B 210 -20 1050 715 ; +C -1 ; WX 1055 ; N onequarter ; B 210 -20 1032 715 ; +C -1 ; WX 1055 ; N threequarters ; B 147 -20 1032 718 ; +C -1 ; WX 278 ; N iacute ; B 67 0 448 757 ; +C -1 ; WX 722 ; N Abreve ; B 26 0 703 934 ; +C -1 ; WX 556 ; N kcommaaccent ; B 59 -307 651 729 ; +C -1 ; WX 778 ; N Omacron ; B 106 -23 828 901 ; +C -1 ; WX 278 ; N imacron ; B 67 0 424 722 ; +C -1 ; WX 556 ; N emacron ; B 64 -23 591 722 ; +C -1 ; WX 556 ; N amacron ; B 50 -23 579 722 ; +C -1 ; WX 333 ; N tcommaaccent ; B 62 -307 414 674 ; +C -1 ; WX 556 ; N ydieresis ; B 37 -219 653 741 ; +C -1 ; WX 500 ; N zdotaccent ; B 21 0 575 741 ; +C -1 ; WX 500 ; N zcaron ; B 21 0 575 757 ; +C -1 ; WX 500 ; N zacute ; B 21 0 575 757 ; +C -1 ; WX 556 ; N yacute ; B 37 -219 653 757 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 88 -23 697 757 ; +C -1 ; WX 611 ; N eth ; B 83 -23 633 744 ; +C -1 ; WX 611 ; N uring ; B 88 -23 656 773 ; +C -1 ; WX 778 ; N Ocircumflex ; B 106 -23 828 936 ; +C -1 ; WX 333 ; N commaaccent ; B 43 -307 217 -60 ; +C -1 ; WX 737 ; N copyright ; B 54 -22 837 743 ; +C -1 ; WX 737 ; N registered ; B 55 -22 837 743 ; +C -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ; +C -1 ; WX 278 ; N idieresis ; B 67 0 442 741 ; +C -1 ; WX 489 ; N lozenge ; B 95 0 541 744 ; +C -1 ; WX 729 ; N Delta ; B 8 0 721 729 ; +C -1 ; WX 584 ; N notequal ; B 61 -74 622 544 ; +C -1 ; WX 542 ; N radical ; B 102 -36 705 913 ; +C -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ; +C -1 ; WX 722 ; N Aacute ; B 26 0 714 936 ; +C -1 ; WX 584 ; N lessequal ; B 35 0 657 624 ; +C -1 ; WX 584 ; N greaterequal ; B 44 0 627 624 ; +C -1 ; WX 584 ; N logicalnot ; B 103 86 632 376 ; +C -1 ; WX 711 ; N summation ; B -18 -97 760 760 ; +C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 68 -307 816 729 ; +C -1 ; WX 611 ; N dcroat ; B 79 -23 746 729 ; +C -1 ; WX 280 ; N brokenbar ; B 57 -200 335 729 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 80 -309 606 729 ; +C -1 ; WX 722 ; N Adieresis ; B 26 0 708 920 ; +C -1 ; WX 611 ; N mu ; B 11 -220 655 540 ; +C -1 ; WX 278 ; N .notdef ; B 245 0 245 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -36 +KPX A Ccedilla -36 +KPX A G -38 +KPX A O -37 +KPX A Odieresis -37 +KPX A Q -39 +KPX A T -91 +KPX A U -37 +KPX A Uacute -37 +KPX A Ucircumflex -37 +KPX A Udieresis -37 +KPX A Ugrave -37 +KPX A V -74 +KPX A W -57 +KPX A Y -96 +KPX A a -11 +KPX A b -10 +KPX A c -17 +KPX A ccedilla -17 +KPX A comma 9 +KPX A d -17 +KPX A e -10 +KPX A g -20 +KPX A guillemotleft -48 +KPX A guilsinglleft -44 +KPX A hyphen 2 +KPX A o -19 +KPX A period 13 +KPX A q -13 +KPX A quotedblright -71 +KPX A quoteright -67 +KPX A t -21 +KPX A u -17 +KPX A v -42 +KPX A w -28 +KPX A y -41 +KPX Aacute C -37 +KPX Aacute G -38 +KPX Aacute O -38 +KPX Aacute Q -40 +KPX Aacute T -91 +KPX Aacute U -38 +KPX Aacute V -74 +KPX Aacute W -57 +KPX Aacute Y -96 +KPX Aacute a -11 +KPX Aacute b -10 +KPX Aacute c -17 +KPX Aacute comma 9 +KPX Aacute d -17 +KPX Aacute e -11 +KPX Aacute g -20 +KPX Aacute guillemotleft -48 +KPX Aacute guilsinglleft -45 +KPX Aacute hyphen 2 +KPX Aacute o -20 +KPX Aacute period 12 +KPX Aacute q -14 +KPX Aacute quoteright -67 +KPX Aacute t -22 +KPX Aacute u -18 +KPX Aacute v -42 +KPX Aacute w -29 +KPX Aacute y -41 +KPX Acircumflex C -36 +KPX Acircumflex G -38 +KPX Acircumflex O -37 +KPX Acircumflex Q -39 +KPX Acircumflex T -91 +KPX Acircumflex U -37 +KPX Acircumflex V -74 +KPX Acircumflex W -57 +KPX Acircumflex Y -96 +KPX Acircumflex comma 9 +KPX Acircumflex period 13 +KPX Adieresis C -37 +KPX Adieresis G -38 +KPX Adieresis O -38 +KPX Adieresis Q -39 +KPX Adieresis T -91 +KPX Adieresis U -38 +KPX Adieresis V -74 +KPX Adieresis W -57 +KPX Adieresis Y -96 +KPX Adieresis a -11 +KPX Adieresis b -10 +KPX Adieresis c -17 +KPX Adieresis comma 9 +KPX Adieresis d -17 +KPX Adieresis g -20 +KPX Adieresis guillemotleft -48 +KPX Adieresis guilsinglleft -44 +KPX Adieresis hyphen 2 +KPX Adieresis o -20 +KPX Adieresis period 12 +KPX Adieresis q -13 +KPX Adieresis quotedblright -71 +KPX Adieresis quoteright -67 +KPX Adieresis t -22 +KPX Adieresis u -17 +KPX Adieresis v -42 +KPX Adieresis w -28 +KPX Adieresis y -41 +KPX Agrave C -36 +KPX Agrave G -38 +KPX Agrave O -37 +KPX Agrave Q -39 +KPX Agrave T -91 +KPX Agrave U -37 +KPX Agrave V -74 +KPX Agrave W -57 +KPX Agrave Y -96 +KPX Agrave comma 9 +KPX Agrave period 13 +KPX Aring C -36 +KPX Aring G -38 +KPX Aring O -37 +KPX Aring Q -39 +KPX Aring T -91 +KPX Aring U -37 +KPX Aring V -74 +KPX Aring W -57 +KPX Aring Y -96 +KPX Aring a -11 +KPX Aring b -10 +KPX Aring c -17 +KPX Aring comma 9 +KPX Aring d -17 +KPX Aring e -10 +KPX Aring g -20 +KPX Aring guillemotleft -48 +KPX Aring guilsinglleft -44 +KPX Aring hyphen 2 +KPX Aring o -19 +KPX Aring period 13 +KPX Aring q -13 +KPX Aring quotedblright -71 +KPX Aring quoteright -67 +KPX Aring t -21 +KPX Aring u -17 +KPX Aring v -42 +KPX Aring w -28 +KPX Aring y -41 +KPX Atilde C -38 +KPX Atilde G -40 +KPX Atilde O -39 +KPX Atilde Q -41 +KPX Atilde T -92 +KPX Atilde U -39 +KPX Atilde V -74 +KPX Atilde W -57 +KPX Atilde Y -96 +KPX Atilde comma 9 +KPX Atilde period 11 +KPX B A -41 +KPX B AE -30 +KPX B Aacute -41 +KPX B Acircumflex -41 +KPX B Adieresis -41 +KPX B Aring -41 +KPX B Atilde -41 +KPX B O -18 +KPX B OE -9 +KPX B Oacute -18 +KPX B Ocircumflex -18 +KPX B Odieresis -18 +KPX B Ograve -18 +KPX B Oslash -17 +KPX B V -46 +KPX B W -30 +KPX B Y -63 +KPX C A -34 +KPX C AE -23 +KPX C Aacute -34 +KPX C Adieresis -34 +KPX C Aring -34 +KPX C H -1 +KPX C K -4 +KPX C O -12 +KPX C Oacute -12 +KPX C Odieresis -12 +KPX Ccedilla A -34 +KPX D A -40 +KPX D Aacute -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D J -4 +KPX D T -24 +KPX D V -37 +KPX D W -20 +KPX D X -40 +KPX D Y -62 +KPX F A -68 +KPX F Aacute -68 +KPX F Acircumflex -68 +KPX F Adieresis -68 +KPX F Agrave -68 +KPX F Aring -68 +KPX F Atilde -68 +KPX F J -33 +KPX F O -24 +KPX F Odieresis -24 +KPX F a -23 +KPX F aacute -23 +KPX F adieresis -23 +KPX F ae -26 +KPX F aring -23 +KPX F comma -84 +KPX F e -12 +KPX F eacute -12 +KPX F hyphen 4 +KPX F i -15 +KPX F j -17 +KPX F o -21 +KPX F oacute -21 +KPX F odieresis -21 +KPX F oe -16 +KPX F oslash -24 +KPX F period -82 +KPX F r -35 +KPX F u -32 +KPX G A -17 +KPX G AE -5 +KPX G Aacute -17 +KPX G Acircumflex -17 +KPX G Adieresis -17 +KPX G Agrave -17 +KPX G Aring -17 +KPX G Atilde -17 +KPX G T -28 +KPX G V -41 +KPX G W -25 +KPX G Y -65 +KPX J A -38 +KPX J AE -29 +KPX J Adieresis -38 +KPX J Aring -38 +KPX K C -59 +KPX K G -61 +KPX K O -60 +KPX K OE -51 +KPX K Oacute -60 +KPX K Odieresis -60 +KPX K S -45 +KPX K T 5 +KPX K a -17 +KPX K adieresis -17 +KPX K ae -17 +KPX K aring -17 +KPX K e -38 +KPX K hyphen -52 +KPX K o -45 +KPX K oacute -45 +KPX K odieresis -45 +KPX K u -35 +KPX K udieresis -35 +KPX K y -74 +KPX L A 0 +KPX L AE 12 +KPX L Aacute 0 +KPX L Adieresis 0 +KPX L Aring 0 +KPX L C -35 +KPX L Ccedilla -36 +KPX L G -40 +KPX L O -39 +KPX L Oacute -39 +KPX L Ocircumflex -39 +KPX L Odieresis -39 +KPX L Ograve -39 +KPX L Otilde -39 +KPX L S -14 +KPX L T -104 +KPX L U -35 +KPX L Udieresis -35 +KPX L V -102 +KPX L W -79 +KPX L Y -121 +KPX L hyphen -20 +KPX L quotedblright -147 +KPX L quoteright -143 +KPX L u -17 +KPX L udieresis -17 +KPX L y -64 +KPX N A -15 +KPX N AE -2 +KPX N Aacute -15 +KPX N Adieresis -15 +KPX N Aring -15 +KPX N C -1 +KPX N Ccedilla -1 +KPX N G -2 +KPX N O -2 +KPX N Oacute -2 +KPX N Odieresis -2 +KPX N a 5 +KPX N aacute 5 +KPX N adieresis 5 +KPX N ae 4 +KPX N aring 5 +KPX N comma 7 +KPX N e 10 +KPX N eacute 10 +KPX N o 1 +KPX N oacute 1 +KPX N odieresis 1 +KPX N oslash 2 +KPX N period 8 +KPX N u 4 +KPX N udieresis 4 +KPX O A -42 +KPX O AE -33 +KPX O Aacute -42 +KPX O Adieresis -42 +KPX O Aring -42 +KPX O T -32 +KPX O V -40 +KPX O W -24 +KPX O X -43 +KPX O Y -65 +KPX Oacute A -42 +KPX Oacute T -32 +KPX Oacute V -40 +KPX Oacute W -24 +KPX Oacute Y -65 +KPX Ocircumflex T -32 +KPX Ocircumflex V -40 +KPX Ocircumflex Y -65 +KPX Odieresis A -42 +KPX Odieresis T -32 +KPX Odieresis V -40 +KPX Odieresis W -24 +KPX Odieresis X -43 +KPX Odieresis Y -65 +KPX Ograve T -32 +KPX Ograve V -40 +KPX Ograve Y -65 +KPX Oslash A -34 +KPX Otilde T -32 +KPX Otilde V -40 +KPX Otilde Y -65 +KPX P A -71 +KPX P AE -62 +KPX P Aacute -71 +KPX P Adieresis -71 +KPX P Aring -71 +KPX P J -52 +KPX P a -14 +KPX P aacute -14 +KPX P adieresis -14 +KPX P ae -15 +KPX P aring -14 +KPX P comma -103 +KPX P e -13 +KPX P eacute -13 +KPX P hyphen -7 +KPX P o -22 +KPX P oacute -22 +KPX P odieresis -22 +KPX P oe -17 +KPX P oslash -26 +KPX P period -101 +KPX R C -12 +KPX R Ccedilla -12 +KPX R G -13 +KPX R O -13 +KPX R OE -3 +KPX R Oacute -13 +KPX R Odieresis -13 +KPX R T -12 +KPX R U -12 +KPX R Udieresis -12 +KPX R V -38 +KPX R W -22 +KPX R Y -50 +KPX R a -4 +KPX R aacute -4 +KPX R adieresis -4 +KPX R ae -5 +KPX R aring -4 +KPX R e 0 +KPX R eacute 0 +KPX R hyphen 10 +KPX R o -9 +KPX R oacute -9 +KPX R odieresis -9 +KPX R oe -4 +KPX R u -6 +KPX R uacute -6 +KPX R udieresis -6 +KPX R y -4 +KPX S A -26 +KPX S AE -14 +KPX S Aacute -26 +KPX S Adieresis -26 +KPX S Aring -26 +KPX S T -15 +KPX S V -36 +KPX S W -20 +KPX S Y -54 +KPX S t -4 +KPX T A -93 +KPX T AE -85 +KPX T Aacute -93 +KPX T Acircumflex -93 +KPX T Adieresis -93 +KPX T Agrave -93 +KPX T Aring -93 +KPX T Atilde -93 +KPX T C -29 +KPX T G -30 +KPX T J -95 +KPX T O -30 +KPX T OE -20 +KPX T Oacute -30 +KPX T Ocircumflex -30 +KPX T Odieresis -30 +KPX T Ograve -30 +KPX T Oslash -36 +KPX T Otilde -30 +KPX T S -7 +KPX T V 9 +KPX T W 15 +KPX T Y 7 +KPX T a -77 +KPX T ae -78 +KPX T c -79 +KPX T colon -104 +KPX T comma -75 +KPX T e -72 +KPX T g -79 +KPX T guillemotleft -107 +KPX T guilsinglleft -103 +KPX T hyphen -53 +KPX T i -9 +KPX T j -11 +KPX T o -81 +KPX T oslash -80 +KPX T period -73 +KPX T r -76 +KPX T s -81 +KPX T semicolon -105 +KPX T u -78 +KPX T v -91 +KPX T w -85 +KPX T y -89 +KPX U A -40 +KPX U AE -30 +KPX U Aacute -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -17 +KPX U m -3 +KPX U n -5 +KPX U p -3 +KPX U period -12 +KPX U r -5 +KPX Uacute A -40 +KPX Uacute comma -17 +KPX Uacute m -3 +KPX Uacute n -5 +KPX Uacute p -3 +KPX Uacute period -12 +KPX Uacute r -5 +KPX Ucircumflex A -40 +KPX Udieresis A -40 +KPX Udieresis b -4 +KPX Udieresis comma -17 +KPX Udieresis m -3 +KPX Udieresis n -5 +KPX Udieresis p -3 +KPX Udieresis period -12 +KPX Udieresis r -5 +KPX Ugrave A -40 +KPX V A -75 +KPX V AE -65 +KPX V Aacute -75 +KPX V Acircumflex -75 +KPX V Adieresis -75 +KPX V Agrave -75 +KPX V Aring -75 +KPX V Atilde -75 +KPX V C -43 +KPX V G -44 +KPX V O -44 +KPX V Oacute -44 +KPX V Ocircumflex -44 +KPX V Odieresis -44 +KPX V Ograve -44 +KPX V Oslash -42 +KPX V Otilde -44 +KPX V S -31 +KPX V T 12 +KPX V a -51 +KPX V ae -52 +KPX V colon -74 +KPX V comma -76 +KPX V e -46 +KPX V g -54 +KPX V guillemotleft -81 +KPX V guilsinglleft -77 +KPX V hyphen -26 +KPX V i -13 +KPX V o -56 +KPX V oslash -55 +KPX V period -74 +KPX V r -43 +KPX V semicolon -77 +KPX V u -42 +KPX V y -19 +KPX W A -59 +KPX W AE -50 +KPX W Aacute -59 +KPX W Acircumflex -59 +KPX W Adieresis -59 +KPX W Agrave -59 +KPX W Aring -59 +KPX W Atilde -59 +KPX W C -28 +KPX W G -29 +KPX W O -29 +KPX W Oacute -29 +KPX W Ocircumflex -29 +KPX W Odieresis -29 +KPX W Ograve -29 +KPX W Oslash -27 +KPX W Otilde -29 +KPX W S -22 +KPX W T 16 +KPX W a -34 +KPX W ae -34 +KPX W colon -61 +KPX W comma -53 +KPX W e -28 +KPX W g -36 +KPX W guillemotleft -63 +KPX W guilsinglleft -59 +KPX W hyphen -9 +KPX W i -9 +KPX W o -38 +KPX W oslash -37 +KPX W period -51 +KPX W r -33 +KPX W semicolon -63 +KPX W u -32 +KPX W y -9 +KPX X C -39 +KPX X O -40 +KPX X Odieresis -40 +KPX X Q -43 +KPX X a -17 +KPX X e -33 +KPX X hyphen -33 +KPX X o -43 +KPX X u -35 +KPX X y -48 +KPX Y A -91 +KPX Y AE -81 +KPX Y Aacute -91 +KPX Y Acircumflex -91 +KPX Y Adieresis -91 +KPX Y Agrave -91 +KPX Y Aring -91 +KPX Y Atilde -91 +KPX Y C -60 +KPX Y G -61 +KPX Y O -61 +KPX Y Oacute -61 +KPX Y Ocircumflex -61 +KPX Y Odieresis -61 +KPX Y Ograve -61 +KPX Y Oslash -58 +KPX Y Otilde -61 +KPX Y S -39 +KPX Y T 14 +KPX Y a -71 +KPX Y ae -71 +KPX Y colon -90 +KPX Y comma -85 +KPX Y e -66 +KPX Y g -73 +KPX Y guillemotleft -105 +KPX Y guilsinglleft -101 +KPX Y hyphen -55 +KPX Y i -11 +KPX Y o -76 +KPX Y oslash -74 +KPX Y p -53 +KPX Y period -84 +KPX Y semicolon -93 +KPX Y u -57 +KPX Y v -36 +KPX Z v -21 +KPX Z y -19 +KPX a j -7 +KPX a quoteright -14 +KPX a v -23 +KPX a w -10 +KPX a y -24 +KPX aacute v -23 +KPX aacute w -10 +KPX aacute y -24 +KPX adieresis v -23 +KPX adieresis w -10 +KPX adieresis y -24 +KPX ae v -21 +KPX ae w -7 +KPX ae y -23 +KPX agrave v -23 +KPX agrave w -10 +KPX agrave y -24 +KPX aring v -23 +KPX aring w -10 +KPX aring y -24 +KPX b v -23 +KPX b w -9 +KPX b y -25 +KPX c h -9 +KPX c k -5 +KPX comma one -79 +KPX comma quotedblright -39 +KPX comma quoteright -35 +KPX e quoteright -13 +KPX e t -9 +KPX e v -22 +KPX e w -9 +KPX e x -25 +KPX e y -25 +KPX eacute v -22 +KPX eacute w -9 +KPX eacute y -25 +KPX ecircumflex v -22 +KPX ecircumflex w -9 +KPX ecircumflex y -25 +KPX eight four 2 +KPX eight one -32 +KPX eight seven -15 +KPX f a -6 +KPX f aacute -6 +KPX f adieresis -6 +KPX f ae -6 +KPX f aring -6 +KPX f e -6 +KPX f eacute -6 +KPX f f 14 +KPX f i -13 +KPX f j -15 +KPX f l -13 +KPX f o -16 +KPX f oacute -16 +KPX f odieresis -16 +KPX f oe -11 +KPX f oslash -16 +KPX f quoteright 0 +KPX f s -10 +KPX f t 14 +KPX five four -3 +KPX five one -37 +KPX five seven -17 +KPX four four 0 +KPX four one -55 +KPX four seven -33 +KPX g a -3 +KPX g adieresis -3 +KPX g ae -4 +KPX g aring -3 +KPX g e 1 +KPX g eacute 1 +KPX g l -5 +KPX g oacute -8 +KPX g odieresis -8 +KPX g r -3 +KPX guillemotright A -56 +KPX guillemotright AE -46 +KPX guillemotright Aacute -56 +KPX guillemotright Adieresis -56 +KPX guillemotright Aring -56 +KPX guillemotright T -115 +KPX guillemotright V -84 +KPX guillemotright W -65 +KPX guillemotright Y -117 +KPX guilsinglright A -52 +KPX guilsinglright AE -42 +KPX guilsinglright Aacute -52 +KPX guilsinglright Adieresis -52 +KPX guilsinglright Aring -52 +KPX guilsinglright T -110 +KPX guilsinglright V -79 +KPX guilsinglright W -60 +KPX guilsinglright Y -113 +KPX h quoteright -15 +KPX h y -25 +KPX hyphen A -7 +KPX hyphen AE 2 +KPX hyphen Aacute -7 +KPX hyphen Adieresis -7 +KPX hyphen Aring -7 +KPX hyphen T -64 +KPX hyphen V -34 +KPX hyphen W -15 +KPX hyphen Y -71 +KPX i T -12 +KPX i j -7 +KPX k a -13 +KPX k aacute -13 +KPX k adieresis -13 +KPX k ae -15 +KPX k aring -13 +KPX k comma -3 +KPX k e -19 +KPX k eacute -19 +KPX k g -26 +KPX k hyphen -31 +KPX k o -28 +KPX k oacute -28 +KPX k odieresis -28 +KPX k period -3 +KPX k s -23 +KPX k u -8 +KPX k udieresis -8 +KPX l v -14 +KPX l y -11 +KPX m p -1 +KPX m v -23 +KPX m w -9 +KPX m y -23 +KPX n T -87 +KPX n p -2 +KPX n quoteright -15 +KPX n v -24 +KPX n w -11 +KPX n y -25 +KPX nine four -6 +KPX nine one -30 +KPX nine seven -23 +KPX o T -90 +KPX o quoteright -19 +KPX o t -13 +KPX o v -27 +KPX o w -13 +KPX o x -30 +KPX o y -29 +KPX oacute v -27 +KPX oacute w -13 +KPX oacute y -29 +KPX ocircumflex t -13 +KPX odieresis t -13 +KPX odieresis v -27 +KPX odieresis w -13 +KPX odieresis x -30 +KPX odieresis y -29 +KPX ograve v -27 +KPX ograve w -13 +KPX ograve y -29 +KPX one comma -51 +KPX one eight -47 +KPX one five -50 +KPX one four -70 +KPX one nine -47 +KPX one one -92 +KPX one period -49 +KPX one seven -72 +KPX one six -48 +KPX one three -53 +KPX one two -56 +KPX one zero -44 +KPX p t -10 +KPX p y -25 +KPX period one -80 +KPX period quotedblright -39 +KPX period quoteright -35 +KPX q c -3 +KPX q u -3 +KPX quotedblbase A 7 +KPX quotedblbase AE 19 +KPX quotedblbase T -79 +KPX quotedblbase V -77 +KPX quotedblbase W -54 +KPX quotedblbase Y -96 +KPX quotedblleft A -72 +KPX quotedblleft AE -64 +KPX quotedblleft Aacute -72 +KPX quotedblleft Adieresis -72 +KPX quotedblleft Aring -72 +KPX quotedblleft T -11 +KPX quotedblleft V 0 +KPX quotedblleft W 9 +KPX quotedblleft Y -15 +KPX quotedblright A -72 +KPX quotedblright AE -64 +KPX quotedblright Aacute -72 +KPX quotedblright Adieresis -72 +KPX quotedblright Aring -72 +KPX quotedblright T -7 +KPX quotedblright V 1 +KPX quotedblright W 11 +KPX quotedblright Y -14 +KPX quoteleft A -76 +KPX quoteleft AE -69 +KPX quoteleft Aacute -76 +KPX quoteleft Adieresis -76 +KPX quoteleft Aring -76 +KPX quoteleft T -15 +KPX quoteleft V -4 +KPX quoteleft W 5 +KPX quoteleft Y -20 +KPX quoteright A -80 +KPX quoteright AE -72 +KPX quoteright Aacute -80 +KPX quoteright Adieresis -80 +KPX quoteright Aring -80 +KPX quoteright comma -53 +KPX quoteright d -30 +KPX quoteright o -34 +KPX quoteright period -51 +KPX quoteright r -20 +KPX quoteright s -27 +KPX quoteright t -11 +KPX quoteright v -11 +KPX quoteright w -4 +KPX quoteright y -9 +KPX r a -1 +KPX r aacute -1 +KPX r acircumflex -1 +KPX r adieresis -1 +KPX r ae -2 +KPX r agrave -1 +KPX r aring -1 +KPX r c -6 +KPX r ccedilla -6 +KPX r colon -36 +KPX r comma -64 +KPX r d -5 +KPX r e 2 +KPX r eacute 2 +KPX r ecircumflex 2 +KPX r egrave 2 +KPX r f 15 +KPX r g -7 +KPX r h -12 +KPX r hyphen -40 +KPX r i -12 +KPX r j -13 +KPX r k -8 +KPX r l -12 +KPX r m -8 +KPX r n -10 +KPX r o -7 +KPX r oacute -7 +KPX r ocircumflex -7 +KPX r odieresis -7 +KPX r oe -2 +KPX r ograve -7 +KPX r oslash -12 +KPX r p -7 +KPX r period -63 +KPX r q -2 +KPX r quoteright 4 +KPX r r -10 +KPX r s -4 +KPX r semicolon -37 +KPX r t 15 +KPX r u -8 +KPX r v 12 +KPX r w 17 +KPX r x 7 +KPX r y 14 +KPX r z 2 +KPX s quoteright -12 +KPX s t -9 +KPX seven colon -71 +KPX seven comma -95 +KPX seven eight -10 +KPX seven five -28 +KPX seven four -70 +KPX seven one -21 +KPX seven period -94 +KPX seven seven 2 +KPX seven six -21 +KPX seven three -7 +KPX seven two -11 +KPX six four -1 +KPX six one -29 +KPX six seven -13 +KPX t S -9 +KPX t a -3 +KPX t aacute -3 +KPX t adieresis -3 +KPX t ae -5 +KPX t aring -3 +KPX t colon -41 +KPX t e -5 +KPX t eacute -5 +KPX t h -9 +KPX t o -15 +KPX t oacute -15 +KPX t odieresis -15 +KPX t quoteright -3 +KPX t semicolon -42 +KPX three four -2 +KPX three one -34 +KPX three seven -19 +KPX two four -16 +KPX two one -24 +KPX two seven -12 +KPX u quoteright -8 +KPX v a -21 +KPX v aacute -21 +KPX v acircumflex -21 +KPX v adieresis -21 +KPX v ae -21 +KPX v agrave -21 +KPX v aring -21 +KPX v atilde -21 +KPX v c -25 +KPX v colon -41 +KPX v comma -57 +KPX v e -18 +KPX v eacute -18 +KPX v ecircumflex -18 +KPX v egrave -18 +KPX v g -26 +KPX v hyphen -5 +KPX v l -12 +KPX v o -28 +KPX v oacute -28 +KPX v odieresis -28 +KPX v ograve -28 +KPX v oslash -28 +KPX v period -55 +KPX v s -25 +KPX v semicolon -43 +KPX w a -11 +KPX w aacute -11 +KPX w acircumflex -11 +KPX w adieresis -11 +KPX w ae -12 +KPX w agrave -11 +KPX w aring -11 +KPX w atilde -11 +KPX w c -12 +KPX w colon -36 +KPX w comma -38 +KPX w e -5 +KPX w eacute -5 +KPX w ecircumflex -5 +KPX w egrave -5 +KPX w g -13 +KPX w hyphen 7 +KPX w l -8 +KPX w o -15 +KPX w oacute -15 +KPX w odieresis -15 +KPX w ograve -15 +KPX w oslash -14 +KPX w period -36 +KPX w s -15 +KPX w semicolon -38 +KPX x a -22 +KPX x c -27 +KPX x e -20 +KPX x eacute -20 +KPX x o -30 +KPX x q -23 +KPX y a -20 +KPX y aacute -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y ae -20 +KPX y agrave -20 +KPX y aring -20 +KPX y atilde -20 +KPX y c -26 +KPX y colon -40 +KPX y comma -58 +KPX y e -19 +KPX y eacute -19 +KPX y ecircumflex -19 +KPX y egrave -19 +KPX y g -27 +KPX y hyphen -4 +KPX y l -11 +KPX y o -28 +KPX y oacute -28 +KPX y odieresis -28 +KPX y ograve -28 +KPX y oslash -27 +KPX y period -55 +KPX y s -24 +KPX y semicolon -43 +KPX zero four -3 +KPX zero one -29 +KPX zero seven -21 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n019024l.pfb b/pdf2swf/fonts/n019024l.pfb new file mode 100644 index 00000000..47990408 Binary files /dev/null and b/pdf2swf/fonts/n019024l.pfb differ diff --git a/pdf2swf/fonts/n021003l.afm b/pdf2swf/fonts/n021003l.afm new file mode 100644 index 00000000..95759a53 --- /dev/null +++ b/pdf2swf/fonts/n021003l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusRomNo9L-Regu +FullName Nimbus Roman No9 L Regular +FamilyName Nimbus Roman No9 L +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -168 -281 1000 924 +CapHeight 662 +XHeight 450 +Descender -217 +Ascender 683 +StartCharMetrics 316 +C 32 ; WX 250 ; N space ; B 125 0 125 0 ; +C 33 ; WX 333 ; N exclam ; B 130 -9 237 676 ; +C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ; +C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ; +C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ; +C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ; +C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ; +C 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ; +C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ; +C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ; +C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ; +C 43 ; WX 564 ; N plus ; B 30 0 534 506 ; +C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ; +C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ; +C 46 ; WX 250 ; N period ; B 70 -11 181 100 ; +C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ; +C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ; +C 49 ; WX 500 ; N one ; B 111 0 394 676 ; +C 50 ; WX 500 ; N two ; B 30 0 475 676 ; +C 51 ; WX 500 ; N three ; B 43 -14 432 676 ; +C 52 ; WX 500 ; N four ; B 12 0 472 676 ; +C 53 ; WX 500 ; N five ; B 32 -14 438 688 ; +C 54 ; WX 500 ; N six ; B 34 -14 468 684 ; +C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ; +C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ; +C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ; +C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ; +C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ; +C 60 ; WX 564 ; N less ; B 28 -10 536 516 ; +C 61 ; WX 564 ; N equal ; B 30 120 534 386 ; +C 62 ; WX 564 ; N greater ; B 28 -10 536 516 ; +C 63 ; WX 444 ; N question ; B 68 -8 414 676 ; +C 64 ; WX 921 ; N at ; B 116 -14 809 676 ; +C 65 ; WX 722 ; N A ; B 15 0 706 674 ; +C 66 ; WX 667 ; N B ; B 17 0 593 662 ; +C 67 ; WX 667 ; N C ; B 28 -14 633 676 ; +C 68 ; WX 722 ; N D ; B 16 0 685 662 ; +C 69 ; WX 611 ; N E ; B 12 0 597 662 ; +C 70 ; WX 556 ; N F ; B 12 0 546 662 ; +C 71 ; WX 722 ; N G ; B 32 -14 709 676 ; +C 72 ; WX 722 ; N H ; B 19 0 702 662 ; +C 73 ; WX 333 ; N I ; B 18 0 315 662 ; +C 74 ; WX 389 ; N J ; B 10 -14 370 662 ; +C 75 ; WX 722 ; N K ; B 34 0 723 662 ; +C 76 ; WX 611 ; N L ; B 12 0 598 662 ; +C 77 ; WX 889 ; N M ; B 12 0 863 662 ; +C 78 ; WX 722 ; N N ; B 12 -11 707 662 ; +C 79 ; WX 722 ; N O ; B 34 -14 688 676 ; +C 80 ; WX 556 ; N P ; B 16 0 542 662 ; +C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ; +C 82 ; WX 667 ; N R ; B 17 0 659 662 ; +C 83 ; WX 556 ; N S ; B 42 -14 491 676 ; +C 84 ; WX 611 ; N T ; B 17 0 593 662 ; +C 85 ; WX 722 ; N U ; B 14 -14 705 662 ; +C 86 ; WX 722 ; N V ; B 16 -11 697 662 ; +C 87 ; WX 944 ; N W ; B 5 -11 932 662 ; +C 88 ; WX 722 ; N X ; B 10 0 704 662 ; +C 89 ; WX 722 ; N Y ; B 22 0 703 662 ; +C 90 ; WX 611 ; N Z ; B 9 0 597 662 ; +C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ; +C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ; +C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ; +C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ; +C 97 ; WX 444 ; N a ; B 37 -10 442 460 ; +C 98 ; WX 500 ; N b ; B 3 -10 468 683 ; +C 99 ; WX 444 ; N c ; B 25 -10 412 460 ; +C 100 ; WX 500 ; N d ; B 27 -10 491 683 ; +C 101 ; WX 444 ; N e ; B 25 -10 424 460 ; +C 102 ; WX 333 ; N f ; B 20 0 383 683 ; +C 103 ; WX 500 ; N g ; B 28 -218 470 460 ; +C 104 ; WX 500 ; N h ; B 9 0 487 683 ; +C 105 ; WX 278 ; N i ; B 16 0 253 683 ; +C 106 ; WX 278 ; N j ; B -70 -218 194 683 ; +C 107 ; WX 500 ; N k ; B 7 0 505 683 ; +C 108 ; WX 278 ; N l ; B 19 0 257 683 ; +C 109 ; WX 778 ; N m ; B 16 0 775 460 ; +C 110 ; WX 500 ; N n ; B 16 0 485 460 ; +C 111 ; WX 500 ; N o ; B 29 -10 470 460 ; +C 112 ; WX 500 ; N p ; B 5 -217 470 460 ; +C 113 ; WX 500 ; N q ; B 24 -217 488 461 ; +C 114 ; WX 333 ; N r ; B 5 0 335 460 ; +C 115 ; WX 389 ; N s ; B 51 -10 348 459 ; +C 116 ; WX 278 ; N t ; B 13 -10 279 579 ; +C 117 ; WX 500 ; N u ; B 9 -10 479 450 ; +C 118 ; WX 500 ; N v ; B 19 -14 477 450 ; +C 119 ; WX 722 ; N w ; B 21 -14 694 450 ; +C 120 ; WX 500 ; N x ; B 17 0 479 450 ; +C 121 ; WX 500 ; N y ; B 14 -218 475 450 ; +C 122 ; WX 444 ; N z ; B 27 0 418 450 ; +C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ; +C 124 ; WX 200 ; N bar ; B 67 -14 133 676 ; +C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ; +C 126 ; WX 541 ; N asciitilde ; B 40 186 502 320 ; +C 161 ; WX 333 ; N exclamdown ; B 97 -218 204 469 ; +C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ; +C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ; +C 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ; +C 165 ; WX 500 ; N yen ; B -53 0 512 662 ; +C 166 ; WX 500 ; N florin ; B 7 -189 490 676 ; +C 167 ; WX 500 ; N section ; B 70 -148 426 676 ; +C 168 ; WX 500 ; N currency ; B -22 58 522 602 ; +C 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ; +C 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ; +C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ; +C 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ; +C 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ; +C 174 ; WX 556 ; N fi ; B 31 0 521 683 ; +C 175 ; WX 556 ; N fl ; B 32 0 521 683 ; +C 177 ; WX 500 ; N endash ; B 0 201 500 250 ; +C 178 ; WX 500 ; N dagger ; B 59 -149 443 676 ; +C 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ; +C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ; +C 183 ; WX 350 ; N bullet ; B 40 196 310 466 ; +C 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ; +C 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ; +C 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ; +C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ; +C 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ; +C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ; +C 191 ; WX 444 ; N questiondown ; B 30 -218 376 468 ; +C 193 ; WX 333 ; N grave ; B 19 507 242 678 ; +C 194 ; WX 333 ; N acute ; B 93 507 317 678 ; +C 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ; +C 196 ; WX 333 ; N tilde ; B 1 532 331 638 ; +C 197 ; WX 333 ; N macron ; B 11 547 322 601 ; +C 198 ; WX 333 ; N breve ; B 26 507 307 664 ; +C 199 ; WX 333 ; N dotaccent ; B 118 523 217 622 ; +C 200 ; WX 333 ; N dieresis ; B 18 523 316 622 ; +C 202 ; WX 333 ; N ring ; B 67 512 266 711 ; +C 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ; +C 206 ; WX 333 ; N ogonek ; B 64 -165 249 0 ; +C 207 ; WX 333 ; N caron ; B 11 507 322 674 ; +C 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ; +C 225 ; WX 889 ; N AE ; B 0 0 863 662 ; +C 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ; +C 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ; +C 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ; +C 234 ; WX 889 ; N OE ; B 30 -6 885 668 ; +C 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ; +C 241 ; WX 667 ; N ae ; B 38 -10 632 460 ; +C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ; +C 248 ; WX 278 ; N lslash ; B 19 0 259 683 ; +C 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ; +C 250 ; WX 722 ; N oe ; B 30 -10 690 460 ; +C 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ; +C -1 ; WX 722 ; N Udieresis ; B 14 -14 705 834 ; +C -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ; +C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ; +C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ; +C -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ; +C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ; +C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ; +C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ; +C -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ; +C -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ; +C -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ; +C -1 ; WX 722 ; N Eth ; B 16 0 685 662 ; +C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ; +C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ; +C -1 ; WX 722 ; N Uring ; B 14 -14 705 923 ; +C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ; +C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 622 ; +C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ; +C -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ; +C -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ; +C -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N edieresis ; B 25 -10 424 622 ; +C -1 ; WX 600 ; N dcaron ; B 27 -10 599 683 ; +C -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ; +C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ; +C -1 ; WX 444 ; N cacute ; B 25 -10 412 678 ; +C -1 ; WX 444 ; N aogonek ; B 37 -165 444 460 ; +C -1 ; WX 444 ; N aring ; B 37 -10 442 721 ; +C -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ; +C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ; +C -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ; +C -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ; +C -1 ; WX 444 ; N adieresis ; B 37 -10 442 622 ; +C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ; +C -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ; +C -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ; +C -1 ; WX 500 ; N udieresis ; B 9 -10 479 622 ; +C -1 ; WX 278 ; N tcaron ; B 13 -10 300 676 ; +C -1 ; WX 389 ; N scommaaccent ; B 51 -281 348 459 ; +C -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ; +C -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ; +C -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ; +C -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ; +C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 834 ; +C -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ; +C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ; +C -1 ; WX 389 ; N sacute ; B 51 -10 365 678 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 17 -281 593 662 ; +C -1 ; WX 722 ; N Ydieresis ; B 22 0 703 834 ; +C -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ; +C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ; +C -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ; +C -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ; +C -1 ; WX 722 ; N Odieresis ; B 34 -14 688 834 ; +C -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ; +C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ; +C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ; +C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ; +C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ; +C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 834 ; +C -1 ; WX 333 ; N racute ; B 5 0 335 678 ; +C -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 470 678 ; +C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ; +C -1 ; WX 500 ; N Euro ; B -16 -14 477 674 ; +C -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ; +C -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ; +C -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ; +C -1 ; WX 300 ; N threesuperior ; B 14 262 291 676 ; +C -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ; +C -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ; +C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ; +C -1 ; WX 333 ; N Iogonek ; B 18 -165 397 662 ; +C -1 ; WX 333 ; N Idieresis ; B 18 0 316 834 ; +C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ; +C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 34 -281 723 662 ; +C -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ; +C -1 ; WX 556 ; N Scommaaccent ; B 42 -281 491 676 ; +C -1 ; WX 611 ; N Eogonek ; B 12 -165 611 662 ; +C -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ; +C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 834 ; +C -1 ; WX 278 ; N iogonek ; B 16 -165 278 683 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 736 ; +C -1 ; WX 500 ; N odieresis ; B 29 -10 470 622 ; +C -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ; +C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ; +C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ; +C -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ; +C -1 ; WX 389 ; N scedilla ; B 51 -215 348 459 ; +C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ; +C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ; +C -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 32 -281 709 676 ; +C -1 ; WX 667 ; N Rcommaaccent ; B 17 -281 659 662 ; +C -1 ; WX 611 ; N Edieresis ; B 12 0 597 834 ; +C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ; +C -1 ; WX 500 ; N uogonek ; B 9 -165 500 450 ; +C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ; +C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ; +C -1 ; WX 348 ; N lcaron ; B 19 0 348 683 ; +C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ; +C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ; +C -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ; +C -1 ; WX 400 ; N degree ; B 57 390 343 676 ; +C -1 ; WX 722 ; N Aogonek ; B 15 -165 786 674 ; +C -1 ; WX 564 ; N minus ; B 30 220 534 286 ; +C -1 ; WX 564 ; N multiply ; B 38 8 527 497 ; +C -1 ; WX 564 ; N divide ; B 30 -10 534 516 ; +C -1 ; WX 722 ; N Aring ; B 15 0 706 915 ; +C -1 ; WX 980 ; N trademark ; B 30 256 957 662 ; +C -1 ; WX 333 ; N rcommaaccent ; B 5 -281 335 460 ; +C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ; +C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ; +C -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ; +C -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ; +C -1 ; WX 278 ; N igrave ; B -8 0 253 678 ; +C -1 ; WX 500 ; N ncommaaccent ; B 16 -281 485 460 ; +C -1 ; WX 278 ; N lcommaaccent ; B 19 -281 257 683 ; +C -1 ; WX 564 ; N plusminus ; B 30 0 534 568 ; +C -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ; +C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ; +C -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ; +C -1 ; WX 278 ; N iacute ; B 16 0 290 678 ; +C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ; +C -1 ; WX 500 ; N kcommaaccent ; B 7 -281 505 683 ; +C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ; +C -1 ; WX 278 ; N imacron ; B -16 0 292 601 ; +C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ; +C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ; +C -1 ; WX 278 ; N tcommaaccent ; B 13 -281 279 579 ; +C -1 ; WX 500 ; N ydieresis ; B 14 -218 475 622 ; +C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 622 ; +C -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ; +C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ; +C -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 479 678 ; +C -1 ; WX 500 ; N eth ; B 29 -10 471 686 ; +C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ; +C -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ; +C -1 ; WX 333 ; N commaaccent ; B 97 -281 236 -38 ; +C -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ; +C -1 ; WX 760 ; N registered ; B 38 -14 722 676 ; +C -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ; +C -1 ; WX 278 ; N idieresis ; B 11 0 269 622 ; +C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 564 ; N notequal ; B 30 -3 534 509 ; +C -1 ; WX 549 ; N radical ; B -2 -65 526 924 ; +C -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ; +C -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ; +C -1 ; WX 564 ; N lessequal ; B 28 0 536 628 ; +C -1 ; WX 564 ; N greaterequal ; B 28 0 536 628 ; +C -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ; +C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C -1 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 12 -281 707 662 ; +C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ; +C -1 ; WX 200 ; N brokenbar ; B 67 -14 133 676 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 12 -281 598 662 ; +C -1 ; WX 722 ; N Adieresis ; B 15 0 706 834 ; +C -1 ; WX 500 ; N mu ; B 36 -218 512 450 ; +C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -51 +KPX A Ccedilla -57 +KPX A G -57 +KPX A O -60 +KPX A Odieresis -60 +KPX A Q -60 +KPX A T -54 +KPX A U -62 +KPX A Uacute -62 +KPX A Ucircumflex -62 +KPX A Udieresis -62 +KPX A Ugrave -62 +KPX A V -131 +KPX A W -113 +KPX A Y -81 +KPX A a -6 +KPX A b -20 +KPX A c -29 +KPX A ccedilla -29 +KPX A comma -3 +KPX A d -28 +KPX A e -27 +KPX A g -20 +KPX A guillemotleft -64 +KPX A guilsinglleft -74 +KPX A hyphen -23 +KPX A o -40 +KPX A period -10 +KPX A q -21 +KPX A quotedblright -91 +KPX A quoteright -116 +KPX A t -20 +KPX A u -28 +KPX A v -81 +KPX A w -73 +KPX A y -83 +KPX Aacute C -51 +KPX Aacute G -57 +KPX Aacute O -60 +KPX Aacute Q -60 +KPX Aacute T -54 +KPX Aacute U -62 +KPX Aacute V -131 +KPX Aacute W -113 +KPX Aacute Y -81 +KPX Aacute a -6 +KPX Aacute b -20 +KPX Aacute c -29 +KPX Aacute comma -3 +KPX Aacute d -28 +KPX Aacute e -27 +KPX Aacute g -20 +KPX Aacute guillemotleft -64 +KPX Aacute guilsinglleft -74 +KPX Aacute hyphen -23 +KPX Aacute o -40 +KPX Aacute period -10 +KPX Aacute q -21 +KPX Aacute quoteright -116 +KPX Aacute t -20 +KPX Aacute u -28 +KPX Aacute v -81 +KPX Aacute w -73 +KPX Aacute y -83 +KPX Acircumflex C -51 +KPX Acircumflex G -57 +KPX Acircumflex O -60 +KPX Acircumflex Q -60 +KPX Acircumflex T -54 +KPX Acircumflex U -62 +KPX Acircumflex V -131 +KPX Acircumflex W -113 +KPX Acircumflex Y -81 +KPX Acircumflex comma -3 +KPX Acircumflex period -10 +KPX Adieresis C -51 +KPX Adieresis G -57 +KPX Adieresis O -60 +KPX Adieresis Q -60 +KPX Adieresis T -54 +KPX Adieresis U -62 +KPX Adieresis V -131 +KPX Adieresis W -113 +KPX Adieresis Y -81 +KPX Adieresis a -6 +KPX Adieresis b -20 +KPX Adieresis c -29 +KPX Adieresis comma -3 +KPX Adieresis d -28 +KPX Adieresis g -20 +KPX Adieresis guillemotleft -64 +KPX Adieresis guilsinglleft -74 +KPX Adieresis hyphen -23 +KPX Adieresis o -40 +KPX Adieresis period -10 +KPX Adieresis q -21 +KPX Adieresis quotedblright -91 +KPX Adieresis quoteright -116 +KPX Adieresis t -20 +KPX Adieresis u -28 +KPX Adieresis v -81 +KPX Adieresis w -73 +KPX Adieresis y -83 +KPX Agrave C -51 +KPX Agrave G -57 +KPX Agrave O -60 +KPX Agrave Q -60 +KPX Agrave T -54 +KPX Agrave U -62 +KPX Agrave V -131 +KPX Agrave W -113 +KPX Agrave Y -81 +KPX Agrave comma -3 +KPX Agrave period -10 +KPX Aring C -51 +KPX Aring G -57 +KPX Aring O -60 +KPX Aring Q -60 +KPX Aring T -54 +KPX Aring U -62 +KPX Aring V -131 +KPX Aring W -113 +KPX Aring Y -81 +KPX Aring a -6 +KPX Aring b -20 +KPX Aring c -29 +KPX Aring comma -3 +KPX Aring d -28 +KPX Aring e -27 +KPX Aring g -20 +KPX Aring guillemotleft -64 +KPX Aring guilsinglleft -74 +KPX Aring hyphen -23 +KPX Aring o -40 +KPX Aring period -10 +KPX Aring q -21 +KPX Aring quotedblright -91 +KPX Aring quoteright -116 +KPX Aring t -20 +KPX Aring u -28 +KPX Aring v -81 +KPX Aring w -73 +KPX Aring y -83 +KPX Atilde C -51 +KPX Atilde G -57 +KPX Atilde O -60 +KPX Atilde Q -60 +KPX Atilde T -54 +KPX Atilde U -62 +KPX Atilde V -131 +KPX Atilde W -113 +KPX Atilde Y -81 +KPX Atilde comma -3 +KPX Atilde period -10 +KPX B A -51 +KPX B AE -44 +KPX B Aacute -51 +KPX B Acircumflex -51 +KPX B Adieresis -51 +KPX B Aring -51 +KPX B Atilde -51 +KPX B O -24 +KPX B OE -18 +KPX B Oacute -24 +KPX B Ocircumflex -24 +KPX B Odieresis -24 +KPX B Ograve -24 +KPX B Oslash -23 +KPX B V -65 +KPX B W -59 +KPX B Y -68 +KPX C A -23 +KPX C AE -15 +KPX C Aacute -23 +KPX C Adieresis -23 +KPX C Aring -23 +KPX C H -2 +KPX C K -10 +KPX C O -12 +KPX C Oacute -12 +KPX C Odieresis -12 +KPX Ccedilla A -27 +KPX D A -67 +KPX D Aacute -67 +KPX D Acircumflex -67 +KPX D Adieresis -67 +KPX D Agrave -67 +KPX D Aring -67 +KPX D Atilde -67 +KPX D J -41 +KPX D T -10 +KPX D V -71 +KPX D W -57 +KPX D X -64 +KPX D Y -74 +KPX F A -71 +KPX F Aacute -71 +KPX F Acircumflex -71 +KPX F Adieresis -71 +KPX F Agrave -71 +KPX F Aring -71 +KPX F Atilde -71 +KPX F J -13 +KPX F O -10 +KPX F Odieresis -10 +KPX F a -34 +KPX F aacute -34 +KPX F adieresis -10 +KPX F ae -36 +KPX F aring -34 +KPX F comma -51 +KPX F e -19 +KPX F eacute -19 +KPX F hyphen 3 +KPX F i -13 +KPX F j -20 +KPX F o -21 +KPX F oacute -21 +KPX F odieresis -21 +KPX F oe -21 +KPX F oslash -21 +KPX F period -58 +KPX F r -10 +KPX F u -11 +KPX G A -26 +KPX G AE -19 +KPX G Aacute -26 +KPX G Acircumflex -26 +KPX G Adieresis -26 +KPX G Agrave -26 +KPX G Aring -26 +KPX G Atilde -26 +KPX G T -21 +KPX G V -23 +KPX G W -18 +KPX G Y -26 +KPX J A -53 +KPX J AE -46 +KPX J Adieresis -53 +KPX J Aring -53 +KPX K C -43 +KPX K G -49 +KPX K O -51 +KPX K OE -44 +KPX K Oacute -51 +KPX K Odieresis -51 +KPX K S 1 +KPX K T 0 +KPX K a 2 +KPX K adieresis 2 +KPX K ae 0 +KPX K aring 2 +KPX K e -19 +KPX K hyphen -63 +KPX K o -31 +KPX K oacute -31 +KPX K odieresis -31 +KPX K u -19 +KPX K udieresis -19 +KPX K y -86 +KPX L A 0 +KPX L AE 6 +KPX L Aacute 0 +KPX L Adieresis 0 +KPX L Aring 0 +KPX L C 2 +KPX L Ccedilla 0 +KPX L G 0 +KPX L O -3 +KPX L Oacute -3 +KPX L Ocircumflex -3 +KPX L Odieresis -3 +KPX L Ograve -3 +KPX L Otilde -3 +KPX L S 5 +KPX L T -73 +KPX L U -26 +KPX L Udieresis -26 +KPX L V -115 +KPX L W -89 +KPX L Y -100 +KPX L hyphen 25 +KPX L quotedblright -100 +KPX L quoteright -125 +KPX L u -10 +KPX L udieresis -10 +KPX L y -56 +KPX N A -28 +KPX N AE -21 +KPX N Aacute -28 +KPX N Adieresis -28 +KPX N Aring -28 +KPX N C -16 +KPX N Ccedilla -16 +KPX N G -19 +KPX N O -20 +KPX N Oacute -20 +KPX N Odieresis -20 +KPX N a -27 +KPX N aacute -27 +KPX N adieresis -27 +KPX N ae -27 +KPX N aring -27 +KPX N comma -14 +KPX N e -17 +KPX N eacute -17 +KPX N o -21 +KPX N oacute -21 +KPX N odieresis -21 +KPX N oslash -20 +KPX N period -21 +KPX N u -25 +KPX N udieresis -25 +KPX O A -58 +KPX O AE -50 +KPX O Aacute -58 +KPX O Adieresis -58 +KPX O Aring -58 +KPX O T -9 +KPX O V -69 +KPX O W -54 +KPX O X -55 +KPX O Y -72 +KPX Oacute A -58 +KPX Oacute T -9 +KPX Oacute V -69 +KPX Oacute W -54 +KPX Oacute Y -72 +KPX Ocircumflex T -9 +KPX Ocircumflex V -69 +KPX Ocircumflex Y -72 +KPX Odieresis A -58 +KPX Odieresis T -9 +KPX Odieresis V -69 +KPX Odieresis W -54 +KPX Odieresis X -55 +KPX Odieresis Y -72 +KPX Ograve T -9 +KPX Ograve V -69 +KPX Ograve Y -72 +KPX Oslash A -58 +KPX Otilde T -9 +KPX Otilde V -69 +KPX Otilde Y -72 +KPX P A -90 +KPX P AE -91 +KPX P Aacute -90 +KPX P Adieresis -90 +KPX P Aring -90 +KPX P J -52 +KPX P a -17 +KPX P aacute -17 +KPX P adieresis -17 +KPX P ae -18 +KPX P aring -17 +KPX P comma -94 +KPX P e -23 +KPX P eacute -23 +KPX P hyphen -37 +KPX P o -25 +KPX P oacute -25 +KPX P odieresis -25 +KPX P oe -25 +KPX P oslash -25 +KPX P period -101 +KPX R C -41 +KPX R Ccedilla -41 +KPX R G -44 +KPX R O -45 +KPX R OE -39 +KPX R Oacute -45 +KPX R Odieresis -45 +KPX R T -34 +KPX R U -56 +KPX R Udieresis -55 +KPX R V -73 +KPX R W -67 +KPX R Y -76 +KPX R a -2 +KPX R aacute -2 +KPX R adieresis -2 +KPX R ae -5 +KPX R aring -2 +KPX R e -23 +KPX R eacute -23 +KPX R hyphen -52 +KPX R o -36 +KPX R oacute -36 +KPX R odieresis -36 +KPX R oe -31 +KPX R u -24 +KPX R uacute -24 +KPX R udieresis -24 +KPX R y -37 +KPX S A -37 +KPX S AE -30 +KPX S Aacute -37 +KPX S Adieresis -37 +KPX S Aring -37 +KPX S T -19 +KPX S V -27 +KPX S W -21 +KPX S Y -30 +KPX S t -20 +KPX T A -53 +KPX T AE -45 +KPX T Aacute -53 +KPX T Acircumflex -53 +KPX T Adieresis -53 +KPX T Agrave -53 +KPX T Aring -53 +KPX T Atilde -53 +KPX T C -8 +KPX T G -11 +KPX T J -18 +KPX T O -10 +KPX T OE -4 +KPX T Oacute -10 +KPX T Ocircumflex -10 +KPX T Odieresis -10 +KPX T Ograve -10 +KPX T Oslash -10 +KPX T Otilde -10 +KPX T S -10 +KPX T V 14 +KPX T W 20 +KPX T Y 11 +KPX T a -77 +KPX T ae -80 +KPX T c -87 +KPX T colon -87 +KPX T comma -74 +KPX T e -86 +KPX T g -91 +KPX T guillemotleft -114 +KPX T guilsinglleft -125 +KPX T hyphen -73 +KPX T i -18 +KPX T j -25 +KPX T o -90 +KPX T oslash -89 +KPX T period -82 +KPX T r -50 +KPX T s -73 +KPX T semicolon -87 +KPX T u -93 +KPX T v -105 +KPX T w -106 +KPX T y -102 +KPX U A -65 +KPX U AE -58 +KPX U Aacute -65 +KPX U Acircumflex -65 +KPX U Adieresis -65 +KPX U Aring -65 +KPX U Atilde -65 +KPX U comma -31 +KPX U m -33 +KPX U n -31 +KPX U p -28 +KPX U period -37 +KPX U r -27 +KPX Uacute A -65 +KPX Uacute comma -31 +KPX Uacute m -33 +KPX Uacute n -31 +KPX Uacute p -28 +KPX Uacute period -37 +KPX Uacute r -27 +KPX Ucircumflex A -65 +KPX Udieresis A -65 +KPX Udieresis b 21 +KPX Udieresis comma -31 +KPX Udieresis m -33 +KPX Udieresis n -31 +KPX Udieresis p -28 +KPX Udieresis period -37 +KPX Udieresis r -27 +KPX Ugrave A -65 +KPX V A -124 +KPX V AE -104 +KPX V Aacute -124 +KPX V Acircumflex -124 +KPX V Adieresis -124 +KPX V Agrave -124 +KPX V Aring -124 +KPX V Atilde -124 +KPX V C -63 +KPX V G -66 +KPX V O -67 +KPX V Oacute -67 +KPX V Ocircumflex -67 +KPX V Odieresis -67 +KPX V Ograve -67 +KPX V Oslash -65 +KPX V Otilde -67 +KPX V S -47 +KPX V T 10 +KPX V a -88 +KPX V ae -89 +KPX V colon -90 +KPX V comma -105 +KPX V e -85 +KPX V g -101 +KPX V guillemotleft -109 +KPX V guilsinglleft -119 +KPX V hyphen -69 +KPX V i -20 +KPX V o -89 +KPX V oslash -88 +KPX V period -112 +KPX V r -56 +KPX V semicolon -89 +KPX V u -51 +KPX V y -54 +KPX W A -113 +KPX W AE -98 +KPX W Aacute -113 +KPX W Acircumflex -113 +KPX W Adieresis -113 +KPX W Agrave -113 +KPX W Aring -113 +KPX W Atilde -113 +KPX W C -53 +KPX W G -56 +KPX W O -56 +KPX W Oacute -56 +KPX W Ocircumflex -56 +KPX W Odieresis -56 +KPX W Ograve -56 +KPX W Oslash -55 +KPX W Otilde -56 +KPX W S -41 +KPX W T 17 +KPX W a -80 +KPX W ae -81 +KPX W colon -81 +KPX W comma -89 +KPX W e -72 +KPX W g -91 +KPX W guillemotleft -97 +KPX W guilsinglleft -107 +KPX W hyphen -56 +KPX W i -13 +KPX W o -76 +KPX W oslash -75 +KPX W period -96 +KPX W r -47 +KPX W semicolon -81 +KPX W u -43 +KPX W y -45 +KPX X C -52 +KPX X O -61 +KPX X Odieresis -61 +KPX X Q -61 +KPX X a -7 +KPX X e -28 +KPX X hyphen -54 +KPX X o -41 +KPX X u -29 +KPX X y -96 +KPX Y A -74 +KPX Y AE -67 +KPX Y Aacute -74 +KPX Y Acircumflex -74 +KPX Y Adieresis -74 +KPX Y Agrave -74 +KPX Y Aring -74 +KPX Y Atilde -74 +KPX Y C -68 +KPX Y G -71 +KPX Y O -69 +KPX Y Oacute -69 +KPX Y Ocircumflex -69 +KPX Y Odieresis -69 +KPX Y Ograve -69 +KPX Y Oslash -69 +KPX Y Otilde -69 +KPX Y S -44 +KPX Y T 13 +KPX Y a -99 +KPX Y ae -102 +KPX Y colon -109 +KPX Y comma -96 +KPX Y e -103 +KPX Y g -113 +KPX Y guillemotleft -135 +KPX Y guilsinglleft -145 +KPX Y hyphen -98 +KPX Y i -17 +KPX Y o -107 +KPX Y oslash -106 +KPX Y p -88 +KPX Y period -103 +KPX Y semicolon -108 +KPX Y u -78 +KPX Y v -86 +KPX Z v -48 +KPX Z y -50 +KPX a j -26 +KPX a quoteright -40 +KPX a v -30 +KPX a w -31 +KPX a y -32 +KPX aacute v -30 +KPX aacute w -31 +KPX aacute y -32 +KPX adieresis v -30 +KPX adieresis w -31 +KPX adieresis y -32 +KPX ae v -27 +KPX ae w -28 +KPX ae y -30 +KPX agrave v -30 +KPX agrave w -31 +KPX agrave y -32 +KPX aring v -30 +KPX aring w -31 +KPX aring y -32 +KPX b v -29 +KPX b w -30 +KPX b y -32 +KPX c h -15 +KPX c k -19 +KPX comma one -52 +KPX comma quotedblright -29 +KPX comma quoteright -53 +KPX e quoteright -30 +KPX e t -10 +KPX e v -27 +KPX e w -28 +KPX e x -35 +KPX e y -30 +KPX eacute v -27 +KPX eacute w -28 +KPX eacute y -30 +KPX ecircumflex v -27 +KPX ecircumflex w -28 +KPX ecircumflex y -30 +KPX eight four 0 +KPX eight one -64 +KPX eight seven -15 +KPX f a -25 +KPX f aacute -25 +KPX f adieresis 12 +KPX f ae -25 +KPX f aring -6 +KPX f e -34 +KPX f eacute -34 +KPX f f 6 +KPX f i 15 +KPX f j 8 +KPX f l 44 +KPX f o -38 +KPX f oacute -38 +KPX f odieresis -1 +KPX f oe -36 +KPX f oslash -37 +KPX f quoteright 17 +KPX f s -21 +KPX f t 10 +KPX five four -8 +KPX five one -70 +KPX five seven -36 +KPX four four 14 +KPX four one -75 +KPX four seven -42 +KPX g a -17 +KPX g adieresis -17 +KPX g ae -18 +KPX g aring -17 +KPX g e -25 +KPX g eacute -25 +KPX g l -7 +KPX g oacute -26 +KPX g odieresis -26 +KPX g r 11 +KPX guillemotright A -62 +KPX guillemotright AE -61 +KPX guillemotright Aacute -62 +KPX guillemotright Adieresis -62 +KPX guillemotright Aring -62 +KPX guillemotright T -114 +KPX guillemotright V -117 +KPX guillemotright W -95 +KPX guillemotright Y -138 +KPX guilsinglright A -72 +KPX guilsinglright AE -71 +KPX guilsinglright Aacute -72 +KPX guilsinglright Adieresis -72 +KPX guilsinglright Aring -72 +KPX guilsinglright T -124 +KPX guilsinglright V -128 +KPX guilsinglright W -105 +KPX guilsinglright Y -149 +KPX h quoteright -38 +KPX h y -30 +KPX hyphen A -26 +KPX hyphen AE -25 +KPX hyphen Aacute -26 +KPX hyphen Adieresis -26 +KPX hyphen Aring -26 +KPX hyphen T -77 +KPX hyphen V -82 +KPX hyphen W -59 +KPX hyphen Y -108 +KPX i T -28 +KPX i j -36 +KPX k a 1 +KPX k aacute 1 +KPX k adieresis 1 +KPX k ae -1 +KPX k aring 1 +KPX k comma 4 +KPX k e -19 +KPX k eacute -19 +KPX k g -12 +KPX k hyphen -65 +KPX k o -32 +KPX k oacute -32 +KPX k odieresis -32 +KPX k period -2 +KPX k s 5 +KPX k u 14 +KPX k udieresis 14 +KPX l v -28 +KPX l y -25 +KPX m p -9 +KPX m v -30 +KPX m w -31 +KPX m y -31 +KPX n T -55 +KPX n p -13 +KPX n quoteright -39 +KPX n v -30 +KPX n w -31 +KPX n y -31 +KPX nine four -7 +KPX nine one -63 +KPX nine seven -6 +KPX o T -91 +KPX o quoteright -34 +KPX o t -9 +KPX o v -36 +KPX o w -36 +KPX o x -36 +KPX o y -41 +KPX oacute v -36 +KPX oacute w -36 +KPX oacute y -41 +KPX ocircumflex t -9 +KPX odieresis t -9 +KPX odieresis v -36 +KPX odieresis w -36 +KPX odieresis x -36 +KPX odieresis y -41 +KPX ograve v -36 +KPX ograve w -36 +KPX ograve y -41 +KPX one comma -48 +KPX one eight -68 +KPX one five -37 +KPX one four -72 +KPX one nine -61 +KPX one one -78 +KPX one period -55 +KPX one seven -78 +KPX one six -66 +KPX one three -41 +KPX one two -34 +KPX one zero -54 +KPX p t -6 +KPX p y -28 +KPX period one -61 +KPX period quotedblright -33 +KPX period quoteright -58 +KPX q c -7 +KPX q u -12 +KPX quotedblbase A 12 +KPX quotedblbase AE 19 +KPX quotedblbase T -60 +KPX quotedblbase V -104 +KPX quotedblbase W -76 +KPX quotedblbase Y -87 +KPX quotedblleft A -86 +KPX quotedblleft AE -91 +KPX quotedblleft Aacute -86 +KPX quotedblleft Adieresis -86 +KPX quotedblleft Aring -86 +KPX quotedblleft T 14 +KPX quotedblleft V 1 +KPX quotedblleft W 7 +KPX quotedblleft Y -1 +KPX quotedblright A -94 +KPX quotedblright AE -99 +KPX quotedblright Aacute -94 +KPX quotedblright Adieresis -94 +KPX quotedblright Aring -94 +KPX quotedblright T 11 +KPX quotedblright V 0 +KPX quotedblright W 6 +KPX quotedblright Y -2 +KPX quoteleft A -110 +KPX quoteleft AE -115 +KPX quoteleft Aacute -110 +KPX quoteleft Adieresis -110 +KPX quoteleft Aring -110 +KPX quoteleft T -9 +KPX quoteleft V -23 +KPX quoteleft W -17 +KPX quoteleft Y -26 +KPX quoteright A -130 +KPX quoteright AE -135 +KPX quoteright Aacute -130 +KPX quoteright Adieresis -130 +KPX quoteright Aring -130 +KPX quoteright comma -71 +KPX quoteright d -56 +KPX quoteright o -54 +KPX quoteright period -78 +KPX quoteright r -44 +KPX quoteright s -47 +KPX quoteright t -43 +KPX quoteright v -47 +KPX quoteright w -47 +KPX quoteright y -45 +KPX r a -1 +KPX r aacute -1 +KPX r acircumflex -1 +KPX r adieresis -1 +KPX r ae -3 +KPX r agrave -1 +KPX r aring -1 +KPX r c -8 +KPX r ccedilla -8 +KPX r colon -7 +KPX r comma -41 +KPX r d -10 +KPX r e -6 +KPX r eacute -6 +KPX r ecircumflex -6 +KPX r egrave -6 +KPX r f 19 +KPX r g -15 +KPX r h -6 +KPX r hyphen -46 +KPX r i 20 +KPX r j 14 +KPX r k -10 +KPX r l -18 +KPX r m 20 +KPX r n 22 +KPX r o -8 +KPX r oacute -8 +KPX r ocircumflex -8 +KPX r odieresis -8 +KPX r oe -7 +KPX r ograve -8 +KPX r oslash -7 +KPX r p 25 +KPX r period -48 +KPX r q -10 +KPX r quoteright -19 +KPX r r 26 +KPX r s 0 +KPX r semicolon -7 +KPX r t 23 +KPX r u 19 +KPX r v 20 +KPX r w 19 +KPX r x 17 +KPX r y 22 +KPX r z 2 +KPX s quoteright -38 +KPX s t -15 +KPX seven colon -68 +KPX seven comma -72 +KPX seven eight -40 +KPX seven five -59 +KPX seven four -63 +KPX seven one -56 +KPX seven period -79 +KPX seven seven -20 +KPX seven six -46 +KPX seven three -35 +KPX seven two -31 +KPX six four 12 +KPX six one -74 +KPX six seven -29 +KPX t S 2 +KPX t a 10 +KPX t aacute 10 +KPX t adieresis 10 +KPX t ae 9 +KPX t aring 10 +KPX t colon -8 +KPX t e 0 +KPX t eacute 0 +KPX t h 10 +KPX t o -8 +KPX t oacute -8 +KPX t odieresis -8 +KPX t quoteright -29 +KPX t semicolon -8 +KPX three four -6 +KPX three one -75 +KPX three seven -28 +KPX two four 0 +KPX two one -60 +KPX two seven -16 +KPX u quoteright -36 +KPX v a -24 +KPX v aacute -24 +KPX v acircumflex -24 +KPX v adieresis -24 +KPX v ae -24 +KPX v agrave -24 +KPX v aring -24 +KPX v atilde -24 +KPX v c -37 +KPX v colon -20 +KPX v comma -69 +KPX v e -36 +KPX v eacute -36 +KPX v ecircumflex -36 +KPX v egrave -36 +KPX v g -41 +KPX v hyphen -28 +KPX v l -31 +KPX v o -38 +KPX v oacute -38 +KPX v odieresis -38 +KPX v ograve -38 +KPX v oslash -38 +KPX v period -76 +KPX v s -21 +KPX v semicolon -20 +KPX w a -27 +KPX w aacute -27 +KPX w acircumflex -27 +KPX w adieresis -27 +KPX w ae -27 +KPX w agrave -27 +KPX w aring -27 +KPX w atilde -27 +KPX w c -33 +KPX w colon -23 +KPX w comma -64 +KPX w e -31 +KPX w eacute -31 +KPX w ecircumflex -31 +KPX w egrave -31 +KPX w g -43 +KPX w hyphen -24 +KPX w l -33 +KPX w o -35 +KPX w oacute -35 +KPX w odieresis -35 +KPX w ograve -35 +KPX w oslash -34 +KPX w period -71 +KPX w s -23 +KPX w semicolon -23 +KPX x a -11 +KPX x c -34 +KPX x e -32 +KPX x eacute -32 +KPX x o -45 +KPX x q -26 +KPX y a -32 +KPX y aacute -32 +KPX y acircumflex -32 +KPX y adieresis -32 +KPX y ae -31 +KPX y agrave -32 +KPX y aring -32 +KPX y atilde -32 +KPX y c -37 +KPX y colon -23 +KPX y comma -66 +KPX y e -35 +KPX y eacute -35 +KPX y ecircumflex -35 +KPX y egrave -35 +KPX y g -48 +KPX y hyphen -27 +KPX y l -32 +KPX y o -39 +KPX y oacute -39 +KPX y odieresis -39 +KPX y ograve -39 +KPX y oslash -38 +KPX y period -73 +KPX y s -26 +KPX y semicolon -23 +KPX zero four 12 +KPX zero one -55 +KPX zero seven -5 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n021003l.pfb b/pdf2swf/fonts/n021003l.pfb new file mode 100644 index 00000000..cbae7ed1 Binary files /dev/null and b/pdf2swf/fonts/n021003l.pfb differ diff --git a/pdf2swf/fonts/n021004l.afm b/pdf2swf/fonts/n021004l.afm new file mode 100644 index 00000000..8931279b --- /dev/null +++ b/pdf2swf/fonts/n021004l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusRomNo9L-Medi +FullName Nimbus Roman No9 L Medium +FamilyName Nimbus Roman No9 L +Weight Bold +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -168 -341 1000 960 +CapHeight 676 +XHeight 461 +Descender -205 +Ascender 676 +StartCharMetrics 316 +C 32 ; WX 250 ; N space ; B 125 0 125 0 ; +C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; +C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; +C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; +C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; +C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; +C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; +C 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ; +C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; +C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; +C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; +C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; +C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; +C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; +C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; +C 49 ; WX 500 ; N one ; B 65 0 442 688 ; +C 50 ; WX 500 ; N two ; B 17 0 478 688 ; +C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; +C 52 ; WX 500 ; N four ; B 19 0 475 688 ; +C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; +C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; +C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; +C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; +C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; +C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; +C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; +C 60 ; WX 570 ; N less ; B 31 -12 539 518 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -12 539 518 ; +C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; +C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; +C 65 ; WX 722 ; N A ; B 9 0 689 690 ; +C 66 ; WX 667 ; N B ; B 16 0 619 676 ; +C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; +C 68 ; WX 722 ; N D ; B 14 0 690 676 ; +C 69 ; WX 667 ; N E ; B 16 0 641 676 ; +C 70 ; WX 611 ; N F ; B 16 0 583 676 ; +C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; +C 72 ; WX 778 ; N H ; B 21 0 759 676 ; +C 73 ; WX 389 ; N I ; B 20 0 370 676 ; +C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; +C 75 ; WX 778 ; N K ; B 30 0 769 676 ; +C 76 ; WX 667 ; N L ; B 19 0 638 676 ; +C 77 ; WX 944 ; N M ; B 14 0 921 676 ; +C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; +C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; +C 80 ; WX 611 ; N P ; B 16 0 600 676 ; +C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; +C 82 ; WX 722 ; N R ; B 26 0 715 676 ; +C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; +C 84 ; WX 667 ; N T ; B 31 0 636 676 ; +C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; +C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; +C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; +C 88 ; WX 722 ; N X ; B 16 0 699 676 ; +C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; +C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; +C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; +C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; +C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; +C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; +C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; +C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; +C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; +C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; +C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; +C 102 ; WX 333 ; N f ; B 14 0 389 691 ; +C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; +C 104 ; WX 556 ; N h ; B 16 0 534 676 ; +C 105 ; WX 278 ; N i ; B 16 0 255 691 ; +C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; +C 107 ; WX 556 ; N k ; B 22 0 543 676 ; +C 108 ; WX 278 ; N l ; B 16 0 255 676 ; +C 109 ; WX 833 ; N m ; B 16 0 814 473 ; +C 110 ; WX 556 ; N n ; B 21 0 539 473 ; +C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; +C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; +C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; +C 114 ; WX 444 ; N r ; B 29 0 434 473 ; +C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; +C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; +C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; +C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; +C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; +C 120 ; WX 500 ; N x ; B 12 0 484 461 ; +C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; +C 122 ; WX 444 ; N z ; B 21 0 420 461 ; +C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; +C 124 ; WX 220 ; N bar ; B 66 -19 154 691 ; +C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; +C 126 ; WX 520 ; N asciitilde ; B 29 175 491 331 ; +C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; +C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; +C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; +C 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ; +C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; +C 166 ; WX 500 ; N florin ; B 0 -155 498 706 ; +C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; +C 168 ; WX 500 ; N currency ; B -26 61 526 613 ; +C 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; +C 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; +C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; +C 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; +C 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; +C 174 ; WX 556 ; N fi ; B 14 0 536 691 ; +C 175 ; WX 556 ; N fl ; B 14 0 536 691 ; +C 177 ; WX 500 ; N endash ; B 0 181 500 271 ; +C 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ; +C 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; +C 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; +C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; +C 183 ; WX 350 ; N bullet ; B 35 198 315 478 ; +C 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; +C 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; +C 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; +C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; +C 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; +C 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; +C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; +C 193 ; WX 333 ; N grave ; B 8 528 246 713 ; +C 194 ; WX 333 ; N acute ; B 86 528 324 713 ; +C 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ; +C 196 ; WX 333 ; N tilde ; B -16 547 349 674 ; +C 197 ; WX 333 ; N macron ; B 1 565 331 637 ; +C 198 ; WX 333 ; N breve ; B 15 528 318 691 ; +C 199 ; WX 333 ; N dotaccent ; B 103 537 232 666 ; +C 200 ; WX 333 ; N dieresis ; B -2 537 337 666 ; +C 202 ; WX 333 ; N ring ; B 60 537 273 750 ; +C 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; +C 206 ; WX 333 ; N ogonek ; B 90 -173 319 44 ; +C 207 ; WX 333 ; N caron ; B -2 528 335 704 ; +C 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; +C 225 ; WX 1000 ; N AE ; B 4 0 951 676 ; +C 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; +C 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ; +C 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; +C 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ; +C 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; +C 241 ; WX 722 ; N ae ; B 33 -14 693 473 ; +C 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; +C 248 ; WX 278 ; N lslash ; B -22 0 303 676 ; +C 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ; +C 250 ; WX 722 ; N oe ; B 22 -14 696 473 ; +C 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; +C -1 ; WX 722 ; N Udieresis ; B 16 -19 701 876 ; +C -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; +C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; +C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; +C -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; +C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; +C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; +C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; +C -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; +C -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; +C -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ; +C -1 ; WX 722 ; N Eth ; B 6 0 690 676 ; +C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; +C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; +C -1 ; WX 722 ; N Uring ; B 16 -19 701 960 ; +C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; +C -1 ; WX 444 ; N eogonek ; B 25 -173 444 473 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 666 ; +C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; +C -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; +C -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ; +C -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ; +C -1 ; WX 444 ; N edieresis ; B 25 -14 426 666 ; +C -1 ; WX 665 ; N dcaron ; B 25 -14 665 691 ; +C -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; +C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; +C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; +C -1 ; WX 500 ; N aogonek ; B 25 -173 500 473 ; +C -1 ; WX 500 ; N aring ; B 25 -14 488 750 ; +C -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ; +C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; +C -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ; +C -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ; +C -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ; +C -1 ; WX 500 ; N adieresis ; B 25 -14 488 666 ; +C -1 ; WX 722 ; N Uogonek ; B 16 -173 701 676 ; +C -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; +C -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ; +C -1 ; WX 556 ; N udieresis ; B 16 -14 537 666 ; +C -1 ; WX 400 ; N tcaron ; B 20 -12 400 691 ; +C -1 ; WX 389 ; N scommaaccent ; B 25 -341 361 473 ; +C -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; +C -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; +C -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; +C -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; +C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 876 ; +C -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ; +C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; +C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; +C -1 ; WX 667 ; N Tcommaaccent ; B 31 -341 636 676 ; +C -1 ; WX 722 ; N Ydieresis ; B 15 0 699 876 ; +C -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ; +C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; +C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; +C -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; +C -1 ; WX 778 ; N Odieresis ; B 35 -19 743 876 ; +C -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; +C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; +C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; +C -1 ; WX 667 ; N Lcaron ; B 19 0 638 691 ; +C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; +C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 876 ; +C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; +C -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 509 713 ; +C -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ; +C -1 ; WX 500 ; N Euro ; B -36 -24 478 671 ; +C -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; +C -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; +C -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; +C -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; +C -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ; +C -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ; +C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; +C -1 ; WX 389 ; N Iogonek ; B 20 -173 505 676 ; +C -1 ; WX 389 ; N Idieresis ; B 20 0 370 876 ; +C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; +C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; +C -1 ; WX 778 ; N Kcommaaccent ; B 30 -341 769 676 ; +C -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ; +C -1 ; WX 556 ; N Scommaaccent ; B 35 -341 513 692 ; +C -1 ; WX 667 ; N Eogonek ; B 16 -173 737 676 ; +C -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ; +C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 876 ; +C -1 ; WX 278 ; N iogonek ; B 16 -173 388 691 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 811 ; +C -1 ; WX 500 ; N odieresis ; B 25 -14 476 666 ; +C -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ; +C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; +C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; +C -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; +C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; +C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; +C -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ; +C -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 37 -341 755 691 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 26 -341 715 676 ; +C -1 ; WX 667 ; N Edieresis ; B 16 0 641 876 ; +C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; +C -1 ; WX 556 ; N uogonek ; B 16 -173 556 461 ; +C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; +C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; +C -1 ; WX 396 ; N lcaron ; B 16 0 396 691 ; +C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; +C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; +C -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; +C -1 ; WX 400 ; N degree ; B 57 402 343 688 ; +C -1 ; WX 722 ; N Aogonek ; B 9 -173 822 690 ; +C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; +C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C -1 ; WX 570 ; N divide ; B 33 -31 537 537 ; +C -1 ; WX 722 ; N Aring ; B 9 0 689 948 ; +C -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ; +C -1 ; WX 444 ; N rcommaaccent ; B 29 -341 434 473 ; +C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; +C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; +C -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ; +C -1 ; WX 278 ; N icircumflex ; B -36 0 301 704 ; +C -1 ; WX 278 ; N igrave ; B -26 0 255 713 ; +C -1 ; WX 556 ; N ncommaaccent ; B 21 -341 539 473 ; +C -1 ; WX 278 ; N lcommaaccent ; B 16 -341 255 676 ; +C -1 ; WX 570 ; N plusminus ; B 33 0 537 568 ; +C -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; +C -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; +C -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; +C -1 ; WX 278 ; N iacute ; B 16 0 290 713 ; +C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; +C -1 ; WX 556 ; N kcommaaccent ; B 22 -341 543 676 ; +C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; +C -1 ; WX 278 ; N imacron ; B -27 0 303 637 ; +C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; +C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; +C -1 ; WX 333 ; N tcommaaccent ; B 20 -341 332 630 ; +C -1 ; WX 500 ; N ydieresis ; B 16 -205 480 666 ; +C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 666 ; +C -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ; +C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; +C -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 537 713 ; +C -1 ; WX 500 ; N eth ; B 25 -14 476 691 ; +C -1 ; WX 556 ; N uring ; B 16 -14 537 750 ; +C -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; +C -1 ; WX 333 ; N commaaccent ; B 84 -341 249 -40 ; +C -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ; +C -1 ; WX 747 ; N registered ; B 26 -19 721 691 ; +C -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; +C -1 ; WX 278 ; N idieresis ; B -36 0 303 666 ; +C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 570 ; N notequal ; B 33 -13 537 519 ; +C -1 ; WX 549 ; N radical ; B -17 -35 535 916 ; +C -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ; +C -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ; +C -1 ; WX 570 ; N lessequal ; B 31 0 539 642 ; +C -1 ; WX 570 ; N greaterequal ; B 31 0 539 642 ; +C -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; +C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C -1 ; WX 494 ; N partialdiff ; B 16 -20 472 743 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 16 -341 701 676 ; +C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; +C -1 ; WX 220 ; N brokenbar ; B 66 -19 154 691 ; +C -1 ; WX 667 ; N Lcommaaccent ; B 19 -341 638 676 ; +C -1 ; WX 722 ; N Adieresis ; B 9 0 689 876 ; +C -1 ; WX 556 ; N mu ; B 33 -206 536 461 ; +C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -73 +KPX A Ccedilla -77 +KPX A G -68 +KPX A O -68 +KPX A Odieresis -68 +KPX A Q -68 +KPX A T -59 +KPX A U -66 +KPX A Uacute -66 +KPX A Ucircumflex -66 +KPX A Udieresis -66 +KPX A Ugrave -66 +KPX A V -130 +KPX A W -116 +KPX A Y -74 +KPX A a -5 +KPX A b -22 +KPX A c -35 +KPX A ccedilla -43 +KPX A comma 1 +KPX A d -28 +KPX A e -32 +KPX A g -7 +KPX A guillemotleft -53 +KPX A guilsinglleft -67 +KPX A hyphen -30 +KPX A o -37 +KPX A period 0 +KPX A q -38 +KPX A quotedblright -76 +KPX A quoteright -108 +KPX A t -27 +KPX A u -30 +KPX A v -84 +KPX A w -79 +KPX A y -83 +KPX Aacute C -73 +KPX Aacute G -68 +KPX Aacute O -68 +KPX Aacute Q -68 +KPX Aacute T -59 +KPX Aacute U -66 +KPX Aacute V -130 +KPX Aacute W -116 +KPX Aacute Y -74 +KPX Aacute a -5 +KPX Aacute b -22 +KPX Aacute c -35 +KPX Aacute comma 1 +KPX Aacute d -28 +KPX Aacute e -32 +KPX Aacute g -7 +KPX Aacute guillemotleft -53 +KPX Aacute guilsinglleft -67 +KPX Aacute hyphen -30 +KPX Aacute o -37 +KPX Aacute period 0 +KPX Aacute q -38 +KPX Aacute quoteright -108 +KPX Aacute t -27 +KPX Aacute u -30 +KPX Aacute v -84 +KPX Aacute w -79 +KPX Aacute y -83 +KPX Acircumflex C -73 +KPX Acircumflex G -68 +KPX Acircumflex O -68 +KPX Acircumflex Q -68 +KPX Acircumflex T -59 +KPX Acircumflex U -66 +KPX Acircumflex V -130 +KPX Acircumflex W -116 +KPX Acircumflex Y -74 +KPX Acircumflex comma 1 +KPX Acircumflex period 0 +KPX Adieresis C -73 +KPX Adieresis G -68 +KPX Adieresis O -68 +KPX Adieresis Q -68 +KPX Adieresis T -59 +KPX Adieresis U -66 +KPX Adieresis V -130 +KPX Adieresis W -116 +KPX Adieresis Y -74 +KPX Adieresis a -5 +KPX Adieresis b -22 +KPX Adieresis c -35 +KPX Adieresis comma 1 +KPX Adieresis d -28 +KPX Adieresis g -7 +KPX Adieresis guillemotleft -53 +KPX Adieresis guilsinglleft -67 +KPX Adieresis hyphen -30 +KPX Adieresis o -37 +KPX Adieresis period 0 +KPX Adieresis q -38 +KPX Adieresis quotedblright -76 +KPX Adieresis quoteright -108 +KPX Adieresis t -27 +KPX Adieresis u -30 +KPX Adieresis v -84 +KPX Adieresis w -79 +KPX Adieresis y -83 +KPX Agrave C -73 +KPX Agrave G -68 +KPX Agrave O -68 +KPX Agrave Q -68 +KPX Agrave T -59 +KPX Agrave U -66 +KPX Agrave V -130 +KPX Agrave W -116 +KPX Agrave Y -74 +KPX Agrave comma 1 +KPX Agrave period 0 +KPX Aring C -73 +KPX Aring G -68 +KPX Aring O -68 +KPX Aring Q -68 +KPX Aring T -59 +KPX Aring U -66 +KPX Aring V -130 +KPX Aring W -116 +KPX Aring Y -74 +KPX Aring a -5 +KPX Aring b -22 +KPX Aring c -35 +KPX Aring comma 1 +KPX Aring d -28 +KPX Aring e -32 +KPX Aring g -7 +KPX Aring guillemotleft -53 +KPX Aring guilsinglleft -67 +KPX Aring hyphen -30 +KPX Aring o -37 +KPX Aring period 0 +KPX Aring q -38 +KPX Aring quotedblright -76 +KPX Aring quoteright -108 +KPX Aring t -27 +KPX Aring u -30 +KPX Aring v -84 +KPX Aring w -79 +KPX Aring y -83 +KPX Atilde C -73 +KPX Atilde G -68 +KPX Atilde O -68 +KPX Atilde Q -68 +KPX Atilde T -59 +KPX Atilde U -66 +KPX Atilde V -130 +KPX Atilde W -116 +KPX Atilde Y -74 +KPX Atilde comma 1 +KPX Atilde period 0 +KPX B A -34 +KPX B AE -32 +KPX B Aacute -34 +KPX B Acircumflex -34 +KPX B Adieresis -34 +KPX B Aring -34 +KPX B Atilde -34 +KPX B O -12 +KPX B OE -4 +KPX B Oacute -12 +KPX B Ocircumflex -12 +KPX B Odieresis -12 +KPX B Ograve -12 +KPX B Oslash -11 +KPX B V -45 +KPX B W -46 +KPX B Y -44 +KPX C A -25 +KPX C AE -22 +KPX C Aacute -25 +KPX C Adieresis -25 +KPX C Aring -25 +KPX C H -2 +KPX C K -6 +KPX C O -14 +KPX C Oacute -14 +KPX C Odieresis -14 +KPX Ccedilla A -33 +KPX D A -55 +KPX D Aacute -55 +KPX D Acircumflex -55 +KPX D Adieresis -55 +KPX D Agrave -55 +KPX D Aring -55 +KPX D Atilde -55 +KPX D J -40 +KPX D T -7 +KPX D V -60 +KPX D W -50 +KPX D X -51 +KPX D Y -59 +KPX F A -79 +KPX F Aacute -79 +KPX F Acircumflex -79 +KPX F Adieresis -79 +KPX F Agrave -79 +KPX F Aring -79 +KPX F Atilde -79 +KPX F J -42 +KPX F O -7 +KPX F Odieresis -7 +KPX F a -50 +KPX F aacute -50 +KPX F adieresis -22 +KPX F ae -53 +KPX F aring -50 +KPX F comma -59 +KPX F e -51 +KPX F eacute -51 +KPX F hyphen -34 +KPX F i -1 +KPX F j -26 +KPX F o -54 +KPX F oacute -54 +KPX F odieresis -24 +KPX F oe -51 +KPX F oslash -53 +KPX F period -60 +KPX F r -7 +KPX F u -10 +KPX G A -27 +KPX G AE -24 +KPX G Aacute -27 +KPX G Acircumflex -27 +KPX G Adieresis -27 +KPX G Agrave -27 +KPX G Aring -27 +KPX G Atilde -27 +KPX G T -41 +KPX G V -33 +KPX G W -35 +KPX G Y -33 +KPX J A -30 +KPX J AE -27 +KPX J Adieresis -30 +KPX J Aring -30 +KPX K C -61 +KPX K G -56 +KPX K O -56 +KPX K OE -46 +KPX K Oacute -56 +KPX K Odieresis -56 +KPX K S 13 +KPX K T -2 +KPX K a 6 +KPX K adieresis 6 +KPX K ae 3 +KPX K aring 6 +KPX K e -20 +KPX K hyphen -47 +KPX K o -25 +KPX K oacute -25 +KPX K odieresis -25 +KPX K u -18 +KPX K udieresis -18 +KPX K y -83 +KPX L A -1 +KPX L AE 1 +KPX L Aacute -1 +KPX L Adieresis -1 +KPX L Aring -1 +KPX L C -11 +KPX L Ccedilla -14 +KPX L G -5 +KPX L O -5 +KPX L Oacute -5 +KPX L Ocircumflex -5 +KPX L Odieresis -5 +KPX L Ograve -5 +KPX L Otilde -5 +KPX L S 2 +KPX L T -74 +KPX L U -29 +KPX L Udieresis -29 +KPX L V -106 +KPX L W -87 +KPX L Y -89 +KPX L hyphen 24 +KPX L quotedblright -37 +KPX L quoteright -69 +KPX L u -11 +KPX L udieresis -12 +KPX L y -49 +KPX N A -19 +KPX N AE -16 +KPX N Aacute -19 +KPX N Adieresis -19 +KPX N Aring -19 +KPX N C -22 +KPX N Ccedilla -22 +KPX N G -16 +KPX N O -15 +KPX N Oacute -15 +KPX N Odieresis -15 +KPX N a -16 +KPX N aacute -16 +KPX N adieresis -16 +KPX N ae -18 +KPX N aring -16 +KPX N comma 1 +KPX N e -13 +KPX N eacute -13 +KPX N o -16 +KPX N oacute -16 +KPX N odieresis -16 +KPX N oslash -15 +KPX N period 0 +KPX N u -17 +KPX N udieresis -17 +KPX O A -55 +KPX O AE -54 +KPX O Aacute -55 +KPX O Adieresis -55 +KPX O Aring -55 +KPX O T -9 +KPX O V -60 +KPX O W -54 +KPX O X -51 +KPX O Y -59 +KPX Oacute A -55 +KPX Oacute T -9 +KPX Oacute V -60 +KPX Oacute W -54 +KPX Oacute Y -59 +KPX Ocircumflex T -9 +KPX Ocircumflex V -60 +KPX Ocircumflex Y -59 +KPX Odieresis A -55 +KPX Odieresis T -9 +KPX Odieresis V -60 +KPX Odieresis W -54 +KPX Odieresis X -51 +KPX Odieresis Y -59 +KPX Ograve T -9 +KPX Ograve V -60 +KPX Ograve Y -59 +KPX Oslash A -52 +KPX Otilde T -9 +KPX Otilde V -60 +KPX Otilde Y -59 +KPX P A -81 +KPX P AE -94 +KPX P Aacute -81 +KPX P Adieresis -81 +KPX P Aring -81 +KPX P J -68 +KPX P a -19 +KPX P aacute -19 +KPX P adieresis -19 +KPX P ae -22 +KPX P aring -19 +KPX P comma -85 +KPX P e -29 +KPX P eacute -29 +KPX P hyphen -39 +KPX P o -33 +KPX P oacute -33 +KPX P odieresis -22 +KPX P oe -30 +KPX P oslash -33 +KPX P period -86 +KPX R C -36 +KPX R Ccedilla -37 +KPX R G -30 +KPX R O -29 +KPX R OE -22 +KPX R Oacute -29 +KPX R Odieresis -29 +KPX R T -26 +KPX R U -37 +KPX R Udieresis -37 +KPX R V -53 +KPX R W -55 +KPX R Y -53 +KPX R a 7 +KPX R aacute 7 +KPX R adieresis 7 +KPX R ae 4 +KPX R aring 7 +KPX R e -19 +KPX R eacute -19 +KPX R hyphen -30 +KPX R o -24 +KPX R oacute -24 +KPX R odieresis -24 +KPX R oe -21 +KPX R u -17 +KPX R uacute -17 +KPX R udieresis -17 +KPX R y -27 +KPX S A -24 +KPX S AE -21 +KPX S Aacute -24 +KPX S Adieresis -24 +KPX S Aring -24 +KPX S T -16 +KPX S V -9 +KPX S W -10 +KPX S Y -8 +KPX S t -10 +KPX T A -46 +KPX T AE -44 +KPX T Aacute -46 +KPX T Acircumflex -46 +KPX T Adieresis -46 +KPX T Agrave -46 +KPX T Aring -46 +KPX T Atilde -46 +KPX T C -17 +KPX T G -11 +KPX T J -43 +KPX T O -9 +KPX T OE -3 +KPX T Oacute -9 +KPX T Ocircumflex -9 +KPX T Odieresis -9 +KPX T Ograve -9 +KPX T Oslash -11 +KPX T Otilde -9 +KPX T S -2 +KPX T V 11 +KPX T W 9 +KPX T Y 11 +KPX T a -65 +KPX T ae -69 +KPX T c -88 +KPX T colon -85 +KPX T comma -63 +KPX T e -85 +KPX T g -68 +KPX T guillemotleft -99 +KPX T guilsinglleft -113 +KPX T hyphen -73 +KPX T i -16 +KPX T j -40 +KPX T o -88 +KPX T oslash -87 +KPX T period -64 +KPX T r -61 +KPX T s -59 +KPX T semicolon -85 +KPX T u -89 +KPX T v -106 +KPX T w -107 +KPX T y -104 +KPX U A -54 +KPX U AE -52 +KPX U Aacute -54 +KPX U Acircumflex -54 +KPX U Adieresis -54 +KPX U Aring -54 +KPX U Atilde -54 +KPX U comma -17 +KPX U m -23 +KPX U n -25 +KPX U p -28 +KPX U period -18 +KPX U r -29 +KPX Uacute A -54 +KPX Uacute comma -17 +KPX Uacute m -23 +KPX Uacute n -25 +KPX Uacute p -28 +KPX Uacute period -18 +KPX Uacute r -29 +KPX Ucircumflex A -54 +KPX Udieresis A -54 +KPX Udieresis b 10 +KPX Udieresis comma -17 +KPX Udieresis m -23 +KPX Udieresis n -25 +KPX Udieresis p -28 +KPX Udieresis period -18 +KPX Udieresis r -29 +KPX Ugrave A -54 +KPX V A -113 +KPX V AE -113 +KPX V Aacute -113 +KPX V Acircumflex -113 +KPX V Adieresis -113 +KPX V Agrave -113 +KPX V Aring -113 +KPX V Atilde -113 +KPX V C -70 +KPX V G -64 +KPX V O -63 +KPX V Oacute -63 +KPX V Ocircumflex -63 +KPX V Odieresis -63 +KPX V Ograve -63 +KPX V Oslash -65 +KPX V Otilde -63 +KPX V S -25 +KPX V T 8 +KPX V a -87 +KPX V ae -90 +KPX V colon -94 +KPX V comma -94 +KPX V e -86 +KPX V g -86 +KPX V guillemotleft -98 +KPX V guilsinglleft -112 +KPX V hyphen -68 +KPX V i -13 +KPX V o -89 +KPX V oslash -87 +KPX V period -95 +KPX V r -60 +KPX V semicolon -94 +KPX V u -58 +KPX V y -56 +KPX W A -98 +KPX W AE -102 +KPX W Aacute -98 +KPX W Acircumflex -98 +KPX W Adieresis -98 +KPX W Agrave -98 +KPX W Aring -98 +KPX W Atilde -98 +KPX W C -58 +KPX W G -52 +KPX W O -51 +KPX W Oacute -51 +KPX W Ocircumflex -51 +KPX W Odieresis -51 +KPX W Ograve -51 +KPX W Oslash -50 +KPX W Otilde -51 +KPX W S -24 +KPX W T 9 +KPX W a -70 +KPX W ae -73 +KPX W colon -81 +KPX W comma -72 +KPX W e -67 +KPX W g -70 +KPX W guillemotleft -79 +KPX W guilsinglleft -93 +KPX W hyphen -49 +KPX W i -12 +KPX W o -70 +KPX W oslash -69 +KPX W period -73 +KPX W r -49 +KPX W semicolon -80 +KPX W u -45 +KPX W y -44 +KPX X C -63 +KPX X O -56 +KPX X Odieresis -56 +KPX X Q -57 +KPX X a 0 +KPX X e -27 +KPX X hyphen -43 +KPX X o -32 +KPX X u -25 +KPX X y -90 +KPX Y A -64 +KPX Y AE -62 +KPX Y Aacute -64 +KPX Y Acircumflex -64 +KPX Y Adieresis -64 +KPX Y Agrave -64 +KPX Y Aring -64 +KPX Y Atilde -64 +KPX Y C -71 +KPX Y G -65 +KPX Y O -64 +KPX Y Oacute -64 +KPX Y Ocircumflex -64 +KPX Y Odieresis -64 +KPX Y Ograve -64 +KPX Y Oslash -68 +KPX Y Otilde -64 +KPX Y S -26 +KPX Y T 7 +KPX Y a -83 +KPX Y ae -87 +KPX Y colon -103 +KPX Y comma -80 +KPX Y e -93 +KPX Y g -86 +KPX Y guillemotleft -111 +KPX Y guilsinglleft -125 +KPX Y hyphen -87 +KPX Y i -14 +KPX Y o -96 +KPX Y oslash -95 +KPX Y p -72 +KPX Y period -81 +KPX Y semicolon -103 +KPX Y u -76 +KPX Y v -78 +KPX Z v -45 +KPX Z y -44 +KPX a j -39 +KPX a quoteright -34 +KPX a v -39 +KPX a w -40 +KPX a y -44 +KPX aacute v -39 +KPX aacute w -40 +KPX aacute y -44 +KPX adieresis v -39 +KPX adieresis w -40 +KPX adieresis y -44 +KPX ae v -34 +KPX ae w -35 +KPX ae y -37 +KPX agrave v -39 +KPX agrave w -40 +KPX agrave y -44 +KPX aring v -39 +KPX aring w -40 +KPX aring y -44 +KPX b v -39 +KPX b w -40 +KPX b y -42 +KPX c h -17 +KPX c k -18 +KPX comma one -12 +KPX comma quotedblright 9 +KPX comma quoteright -23 +KPX e quoteright -19 +KPX e t -10 +KPX e v -29 +KPX e w -30 +KPX e x -19 +KPX e y -31 +KPX eacute v -29 +KPX eacute w -30 +KPX eacute y -31 +KPX ecircumflex v -29 +KPX ecircumflex w -30 +KPX ecircumflex y -31 +KPX eight four 11 +KPX eight one -19 +KPX eight seven 0 +KPX f a -17 +KPX f aacute -17 +KPX f adieresis 14 +KPX f ae -21 +KPX f aring -15 +KPX f e -29 +KPX f eacute -29 +KPX f f 12 +KPX f i 22 +KPX f j -1 +KPX f l 33 +KPX f o -32 +KPX f oacute -32 +KPX f odieresis 11 +KPX f oe -29 +KPX f oslash -31 +KPX f quoteright 18 +KPX f s -8 +KPX f t -3 +KPX five four 1 +KPX five one -28 +KPX five seven -9 +KPX four four 13 +KPX four one -35 +KPX four seven -16 +KPX g a -15 +KPX g adieresis -15 +KPX g ae -18 +KPX g aring -15 +KPX g e -20 +KPX g eacute -20 +KPX g l 0 +KPX g oacute -20 +KPX g odieresis -20 +KPX g r 1 +KPX guillemotright A -40 +KPX guillemotright AE -46 +KPX guillemotright Aacute -40 +KPX guillemotright Adieresis -40 +KPX guillemotright Aring -40 +KPX guillemotright T -100 +KPX guillemotright V -102 +KPX guillemotright W -84 +KPX guillemotright Y -106 +KPX guilsinglright A -54 +KPX guilsinglright AE -60 +KPX guilsinglright Aacute -54 +KPX guilsinglright Adieresis -54 +KPX guilsinglright Aring -54 +KPX guilsinglright T -114 +KPX guilsinglright V -116 +KPX guilsinglright W -98 +KPX guilsinglright Y -120 +KPX h quoteright -30 +KPX h y -34 +KPX hyphen A -18 +KPX hyphen AE -24 +KPX hyphen Aacute -18 +KPX hyphen Adieresis -18 +KPX hyphen Aring -18 +KPX hyphen T -74 +KPX hyphen V -72 +KPX hyphen W -54 +KPX hyphen Y -83 +KPX i T -18 +KPX i j -36 +KPX k a -3 +KPX k aacute -3 +KPX k adieresis -3 +KPX k ae -7 +KPX k aring -3 +KPX k comma 0 +KPX k e -33 +KPX k eacute -33 +KPX k g -4 +KPX k hyphen -47 +KPX k o -38 +KPX k oacute -38 +KPX k odieresis -38 +KPX k period 0 +KPX k s 5 +KPX k u -5 +KPX k udieresis -5 +KPX l v -22 +KPX l y -19 +KPX m p -16 +KPX m v -32 +KPX m w -33 +KPX m y -33 +KPX n T -56 +KPX n p -14 +KPX n quoteright -28 +KPX n v -31 +KPX n w -32 +KPX n y -32 +KPX nine four 2 +KPX nine one -26 +KPX nine seven 10 +KPX o T -88 +KPX o quoteright -27 +KPX o t -10 +KPX o v -42 +KPX o w -38 +KPX o x -29 +KPX o y -42 +KPX oacute v -42 +KPX oacute w -38 +KPX oacute y -42 +KPX ocircumflex t -10 +KPX odieresis t -10 +KPX odieresis v -42 +KPX odieresis w -38 +KPX odieresis x -29 +KPX odieresis y -42 +KPX ograve v -42 +KPX ograve w -38 +KPX ograve y -42 +KPX one comma -16 +KPX one eight -34 +KPX one five -16 +KPX one four -56 +KPX one nine -9 +KPX one one -27 +KPX one period -17 +KPX one seven -56 +KPX one six -47 +KPX one three -10 +KPX one two -2 +KPX one zero -35 +KPX p t -11 +KPX p y -34 +KPX period one -21 +KPX period quotedblright 5 +KPX period quoteright -27 +KPX q c -13 +KPX q u -15 +KPX quotedblbase A 19 +KPX quotedblbase AE 20 +KPX quotedblbase T -59 +KPX quotedblbase V -98 +KPX quotedblbase W -75 +KPX quotedblbase Y -73 +KPX quotedblleft A -59 +KPX quotedblleft AE -78 +KPX quotedblleft Aacute -59 +KPX quotedblleft Adieresis -59 +KPX quotedblleft Aring -59 +KPX quotedblleft T 9 +KPX quotedblleft V 15 +KPX quotedblleft W 13 +KPX quotedblleft Y 15 +KPX quotedblright A -72 +KPX quotedblright AE -91 +KPX quotedblright Aacute -72 +KPX quotedblright Adieresis -72 +KPX quotedblright Aring -72 +KPX quotedblright T 4 +KPX quotedblright V 5 +KPX quotedblright W 4 +KPX quotedblright Y 6 +KPX quoteleft A -92 +KPX quoteleft AE -111 +KPX quoteleft Aacute -92 +KPX quoteleft Adieresis -92 +KPX quoteleft Aring -92 +KPX quoteleft T -22 +KPX quoteleft V -17 +KPX quoteleft W -19 +KPX quoteleft Y -17 +KPX quoteright A -91 +KPX quoteright AE -110 +KPX quoteright Aacute -91 +KPX quoteright Adieresis -91 +KPX quoteright Aring -91 +KPX quoteright comma -34 +KPX quoteright d -31 +KPX quoteright o -34 +KPX quoteright period -35 +KPX quoteright r -26 +KPX quoteright s -17 +KPX quoteright t -19 +KPX quoteright v -25 +KPX quoteright w -23 +KPX quoteright y -22 +KPX r a -6 +KPX r aacute -6 +KPX r acircumflex -6 +KPX r adieresis -6 +KPX r ae -8 +KPX r agrave -6 +KPX r aring -6 +KPX r c -15 +KPX r ccedilla -10 +KPX r colon -16 +KPX r comma -67 +KPX r d -13 +KPX r e -11 +KPX r eacute -11 +KPX r ecircumflex -11 +KPX r egrave -11 +KPX r f 11 +KPX r g -5 +KPX r h -15 +KPX r hyphen -18 +KPX r i 6 +KPX r j -12 +KPX r k -15 +KPX r l -14 +KPX r m 6 +KPX r n 4 +KPX r o -14 +KPX r oacute -14 +KPX r ocircumflex -14 +KPX r odieresis -14 +KPX r oe -12 +KPX r ograve -14 +KPX r oslash -14 +KPX r p 4 +KPX r period -68 +KPX r q -15 +KPX r quoteright -8 +KPX r r 0 +KPX r s 0 +KPX r semicolon -16 +KPX r t 9 +KPX r u 9 +KPX r v 8 +KPX r w 7 +KPX r x 11 +KPX r y 9 +KPX r z -1 +KPX s quoteright -17 +KPX s t -7 +KPX seven colon -64 +KPX seven comma -57 +KPX seven eight -18 +KPX seven five -34 +KPX seven four -54 +KPX seven one -25 +KPX seven period -58 +KPX seven seven -6 +KPX seven six -37 +KPX seven three -20 +KPX seven two -21 +KPX six four 13 +KPX six one -43 +KPX six seven -7 +KPX t S 11 +KPX t a 11 +KPX t aacute 11 +KPX t adieresis 11 +KPX t ae 7 +KPX t aring 11 +KPX t colon -12 +KPX t e -1 +KPX t eacute -1 +KPX t h -4 +KPX t o -4 +KPX t oacute -4 +KPX t odieresis -4 +KPX t quoteright -31 +KPX t semicolon -12 +KPX three four 9 +KPX three one -33 +KPX three seven -15 +KPX two four 14 +KPX two one -29 +KPX two seven -7 +KPX u quoteright -25 +KPX v a -23 +KPX v aacute -23 +KPX v acircumflex -23 +KPX v adieresis -23 +KPX v ae -25 +KPX v agrave -23 +KPX v aring -23 +KPX v atilde -23 +KPX v c -40 +KPX v colon -23 +KPX v comma -56 +KPX v e -35 +KPX v eacute -35 +KPX v ecircumflex -35 +KPX v egrave -35 +KPX v g -22 +KPX v hyphen -27 +KPX v l -16 +KPX v o -40 +KPX v oacute -40 +KPX v odieresis -40 +KPX v ograve -40 +KPX v oslash -39 +KPX v period -57 +KPX v s -16 +KPX v semicolon -23 +KPX w a -23 +KPX w aacute -23 +KPX w acircumflex -23 +KPX w adieresis -23 +KPX w ae -25 +KPX w agrave -23 +KPX w aring -23 +KPX w atilde -23 +KPX w c -36 +KPX w colon -23 +KPX w comma -50 +KPX w e -33 +KPX w eacute -33 +KPX w ecircumflex -33 +KPX w egrave -33 +KPX w g -22 +KPX w hyphen -23 +KPX w l -16 +KPX w o -36 +KPX w oacute -36 +KPX w odieresis -36 +KPX w ograve -36 +KPX w oslash -35 +KPX w period -51 +KPX w s -16 +KPX w semicolon -23 +KPX x a -2 +KPX x c -30 +KPX x e -27 +KPX x eacute -27 +KPX x o -30 +KPX x q -32 +KPX y a -32 +KPX y aacute -32 +KPX y acircumflex -32 +KPX y adieresis -32 +KPX y ae -34 +KPX y agrave -32 +KPX y aring -32 +KPX y atilde -32 +KPX y c -42 +KPX y colon -28 +KPX y comma -56 +KPX y e -40 +KPX y eacute -40 +KPX y ecircumflex -40 +KPX y egrave -40 +KPX y g -31 +KPX y hyphen -29 +KPX y l -19 +KPX y o -42 +KPX y oacute -42 +KPX y odieresis -42 +KPX y ograve -42 +KPX y oslash -41 +KPX y period -57 +KPX y s -24 +KPX y semicolon -28 +KPX zero four 11 +KPX zero one -31 +KPX zero seven 7 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n021004l.pfb b/pdf2swf/fonts/n021004l.pfb new file mode 100644 index 00000000..47f8fd57 Binary files /dev/null and b/pdf2swf/fonts/n021004l.pfb differ diff --git a/pdf2swf/fonts/n021023l.afm b/pdf2swf/fonts/n021023l.afm new file mode 100644 index 00000000..8454d36a --- /dev/null +++ b/pdf2swf/fonts/n021023l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusRomNo9L-ReguItal +FullName Nimbus Roman No9 L Regular Italic +FamilyName Nimbus Roman No9 L +Weight Regular +ItalicAngle -15.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -169 -270 1010 924 +CapHeight 653 +XHeight 432 +Descender -205 +Ascender 683 +StartCharMetrics 316 +C 32 ; WX 250 ; N space ; B 125 0 125 0 ; +C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; +C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; +C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; +C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; +C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; +C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; +C 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ; +C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; +C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; +C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; +C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; +C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; +C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; +C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; +C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; +C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; +C 49 ; WX 500 ; N one ; B 49 0 409 676 ; +C 50 ; WX 500 ; N two ; B 12 0 452 676 ; +C 51 ; WX 500 ; N three ; B 15 -7 466 676 ; +C 52 ; WX 500 ; N four ; B 1 0 479 676 ; +C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; +C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; +C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; +C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; +C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; +C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; +C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; +C 60 ; WX 675 ; N less ; B 84 -10 592 516 ; +C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; +C 62 ; WX 675 ; N greater ; B 84 -10 592 516 ; +C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; +C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; +C 65 ; WX 611 ; N A ; B -51 0 564 668 ; +C 66 ; WX 611 ; N B ; B -8 0 588 653 ; +C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; +C 68 ; WX 722 ; N D ; B -8 0 700 653 ; +C 69 ; WX 611 ; N E ; B -1 0 634 653 ; +C 70 ; WX 611 ; N F ; B 8 0 645 653 ; +C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; +C 72 ; WX 722 ; N H ; B -8 0 767 653 ; +C 73 ; WX 333 ; N I ; B -8 0 384 653 ; +C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; +C 75 ; WX 667 ; N K ; B 7 0 722 653 ; +C 76 ; WX 556 ; N L ; B -8 0 559 653 ; +C 77 ; WX 833 ; N M ; B -18 0 873 653 ; +C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; +C 79 ; WX 722 ; N O ; B 60 -18 706 666 ; +C 80 ; WX 611 ; N P ; B 0 0 605 653 ; +C 81 ; WX 722 ; N Q ; B 59 -183 699 666 ; +C 82 ; WX 611 ; N R ; B -13 0 588 653 ; +C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; +C 84 ; WX 556 ; N T ; B 59 0 633 653 ; +C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; +C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; +C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; +C 88 ; WX 611 ; N X ; B -29 0 655 653 ; +C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; +C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; +C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; +C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; +C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; +C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; +C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; +C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; +C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; +C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; +C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; +C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; +C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; +C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; +C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; +C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; +C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; +C 108 ; WX 278 ; N l ; B 40 -11 279 683 ; +C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; +C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; +C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; +C 112 ; WX 500 ; N p ; B -75 -205 469 442 ; +C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; +C 114 ; WX 389 ; N r ; B 45 0 412 441 ; +C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; +C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; +C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; +C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; +C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; +C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; +C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; +C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; +C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; +C 124 ; WX 275 ; N bar ; B 105 -18 171 666 ; +C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; +C 126 ; WX 541 ; N asciitilde ; B 40 186 502 320 ; +C 161 ; WX 389 ; N exclamdown ; B 59 -205 321 474 ; +C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; +C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; +C 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ; +C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; +C 166 ; WX 500 ; N florin ; B 25 -182 507 682 ; +C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; +C 168 ; WX 500 ; N currency ; B -22 53 522 597 ; +C 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; +C 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; +C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; +C 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; +C 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; +C 174 ; WX 500 ; N fi ; B -141 -207 481 681 ; +C 175 ; WX 500 ; N fl ; B -141 -204 518 682 ; +C 177 ; WX 500 ; N endash ; B -6 197 505 243 ; +C 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ; +C 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; +C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; +C 183 ; WX 350 ; N bullet ; B 40 191 310 461 ; +C 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; +C 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; +C 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; +C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; +C 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; +C 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; +C 191 ; WX 500 ; N questiondown ; B 28 -205 367 473 ; +C 193 ; WX 333 ; N grave ; B 121 492 311 664 ; +C 194 ; WX 333 ; N acute ; B 180 494 403 664 ; +C 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ; +C 196 ; WX 333 ; N tilde ; B 100 517 427 624 ; +C 197 ; WX 333 ; N macron ; B 99 532 411 583 ; +C 198 ; WX 333 ; N breve ; B 117 492 418 650 ; +C 199 ; WX 333 ; N dotaccent ; B 207 508 305 606 ; +C 200 ; WX 333 ; N dieresis ; B 107 508 405 606 ; +C 202 ; WX 333 ; N ring ; B 155 508 355 707 ; +C 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; +C 206 ; WX 333 ; N ogonek ; B -20 -169 200 40 ; +C 207 ; WX 333 ; N caron ; B 121 492 426 661 ; +C 208 ; WX 889 ; N emdash ; B -6 197 894 243 ; +C 225 ; WX 889 ; N AE ; B -27 0 911 653 ; +C 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; +C 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ; +C 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; +C 234 ; WX 944 ; N OE ; B 49 -8 964 666 ; +C 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; +C 241 ; WX 667 ; N ae ; B 23 -11 640 441 ; +C 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; +C 248 ; WX 278 ; N lslash ; B 37 -11 307 683 ; +C 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ; +C 250 ; WX 667 ; N oe ; B 20 -12 646 441 ; +C 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; +C -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; +C -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; +C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; +C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; +C -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; +C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; +C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; +C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; +C -1 ; WX 722 ; N Otilde ; B 60 -18 706 836 ; +C -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 706 876 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; +C -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ; +C -1 ; WX 722 ; N Eth ; B -8 0 700 653 ; +C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; +C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; +C -1 ; WX 722 ; N Uring ; B 102 -18 765 919 ; +C -1 ; WX 500 ; N gbreve ; B 8 -206 502 650 ; +C -1 ; WX 444 ; N eogonek ; B 31 -169 444 441 ; +C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; +C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; +C -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; +C -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ; +C -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ; +C -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; +C -1 ; WX 521 ; N dcaron ; B 15 -13 641 683 ; +C -1 ; WX 444 ; N ccedilla ; B 26 -217 425 441 ; +C -1 ; WX 444 ; N ccaron ; B 30 -11 484 661 ; +C -1 ; WX 444 ; N cacute ; B 30 -11 458 664 ; +C -1 ; WX 500 ; N aogonek ; B 17 -169 500 441 ; +C -1 ; WX 500 ; N aring ; B 17 -11 476 707 ; +C -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ; +C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; +C -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ; +C -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ; +C -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ; +C -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; +C -1 ; WX 722 ; N Uogonek ; B 102 -169 765 653 ; +C -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; +C -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ; +C -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; +C -1 ; WX 278 ; N tcaron ; B 37 -11 378 666 ; +C -1 ; WX 389 ; N scommaaccent ; B 16 -270 366 442 ; +C -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; +C -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; +C -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; +C -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; +C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; +C -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ; +C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; +C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; +C -1 ; WX 556 ; N Tcommaaccent ; B 59 -270 633 653 ; +C -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; +C -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ; +C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; +C -1 ; WX 722 ; N Ograve ; B 60 -18 706 876 ; +C -1 ; WX 722 ; N Oacute ; B 60 -18 706 876 ; +C -1 ; WX 722 ; N Odieresis ; B 60 -18 706 818 ; +C -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; +C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; +C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; +C -1 ; WX 556 ; N Lcaron ; B -8 0 596 666 ; +C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; +C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; +C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; +C -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 570 664 ; +C -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ; +C -1 ; WX 500 ; N Euro ; B 57 0 668 693 ; +C -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; +C -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; +C -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; +C -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; +C -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ; +C -1 ; WX 333 ; N Iacute ; B -8 0 403 876 ; +C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; +C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; +C -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; +C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; +C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 7 -270 722 653 ; +C -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ; +C -1 ; WX 500 ; N Scommaaccent ; B 17 -270 508 667 ; +C -1 ; WX 611 ; N Eogonek ; B -1 -169 651 653 ; +C -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ; +C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; +C -1 ; WX 278 ; N iogonek ; B 49 -169 278 654 ; +C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; +C -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; +C -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; +C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; +C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; +C -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; +C -1 ; WX 389 ; N scedilla ; B -2 -217 366 442 ; +C -1 ; WX 389 ; N rcaron ; B 45 0 454 661 ; +C -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ; +C -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 52 -270 722 666 ; +C -1 ; WX 611 ; N Rcommaaccent ; B -13 -270 588 653 ; +C -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; +C -1 ; WX 500 ; N nacute ; B 14 -9 487 664 ; +C -1 ; WX 500 ; N uogonek ; B 42 -169 500 441 ; +C -1 ; WX 500 ; N umacron ; B 42 -11 495 583 ; +C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; +C -1 ; WX 278 ; N lcaron ; B 40 -11 395 683 ; +C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; +C -1 ; WX 667 ; N Cacute ; B 66 -18 689 876 ; +C -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; +C -1 ; WX 400 ; N degree ; B 101 390 387 676 ; +C -1 ; WX 611 ; N Aogonek ; B -51 -169 707 668 ; +C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; +C -1 ; WX 675 ; N multiply ; B 93 8 582 497 ; +C -1 ; WX 675 ; N divide ; B 86 -11 590 517 ; +C -1 ; WX 611 ; N Aring ; B -51 0 564 904 ; +C -1 ; WX 980 ; N trademark ; B 30 247 957 653 ; +C -1 ; WX 389 ; N rcommaaccent ; B 35 -270 412 441 ; +C -1 ; WX 278 ; N lacute ; B 40 -11 376 876 ; +C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; +C -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ; +C -1 ; WX 278 ; N icircumflex ; B 34 -11 328 661 ; +C -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ; +C -1 ; WX 500 ; N ncommaaccent ; B 14 -270 474 441 ; +C -1 ; WX 278 ; N lcommaaccent ; B -21 -270 279 683 ; +C -1 ; WX 675 ; N plusminus ; B 86 0 590 568 ; +C -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; +C -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; +C -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; +C -1 ; WX 278 ; N iacute ; B 49 -11 356 664 ; +C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; +C -1 ; WX 444 ; N kcommaaccent ; B 14 -270 461 683 ; +C -1 ; WX 722 ; N Omacron ; B 60 -18 706 795 ; +C -1 ; WX 278 ; N imacron ; B 49 -11 384 583 ; +C -1 ; WX 444 ; N emacron ; B 31 -11 467 583 ; +C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; +C -1 ; WX 278 ; N tcommaaccent ; B -21 -270 296 546 ; +C -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; +C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; +C -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; +C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; +C -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 570 664 ; +C -1 ; WX 500 ; N eth ; B 27 -11 482 683 ; +C -1 ; WX 500 ; N uring ; B 42 -11 475 707 ; +C -1 ; WX 722 ; N Ocircumflex ; B 60 -18 706 873 ; +C -1 ; WX 333 ; N commaaccent ; B 7 -270 146 -40 ; +C -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ; +C -1 ; WX 760 ; N registered ; B 41 -18 719 666 ; +C -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; +C -1 ; WX 278 ; N idieresis ; B 49 -11 353 606 ; +C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 564 ; N notequal ; B 30 -3 534 509 ; +C -1 ; WX 549 ; N radical ; B -2 -65 526 924 ; +C -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ; +C -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ; +C -1 ; WX 675 ; N lessequal ; B 84 0 592 628 ; +C -1 ; WX 675 ; N greaterequal ; B 84 0 592 628 ; +C -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; +C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C -1 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ; +C -1 ; WX 667 ; N Ncommaaccent ; B -20 -270 727 653 ; +C -1 ; WX 500 ; N dcroat ; B 15 -13 558 683 ; +C -1 ; WX 275 ; N brokenbar ; B 105 -18 171 666 ; +C -1 ; WX 556 ; N Lcommaaccent ; B -8 -270 559 653 ; +C -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; +C -1 ; WX 500 ; N mu ; B -30 -209 497 428 ; +C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -50 +KPX A Ccedilla -50 +KPX A G -44 +KPX A O -45 +KPX A Odieresis -45 +KPX A Q -44 +KPX A T -14 +KPX A U -57 +KPX A Uacute -57 +KPX A Ucircumflex -57 +KPX A Udieresis -57 +KPX A Ugrave -57 +KPX A V -81 +KPX A W -75 +KPX A Y -21 +KPX A a -4 +KPX A b 0 +KPX A c -18 +KPX A ccedilla -28 +KPX A comma 8 +KPX A d -4 +KPX A e -17 +KPX A g -25 +KPX A guillemotleft -44 +KPX A guilsinglleft -43 +KPX A hyphen -13 +KPX A o -17 +KPX A period 8 +KPX A q -12 +KPX A quotedblright -92 +KPX A quoteright -92 +KPX A t -6 +KPX A u -9 +KPX A v -50 +KPX A w -44 +KPX A y -57 +KPX Aacute C -50 +KPX Aacute G -44 +KPX Aacute O -45 +KPX Aacute Q -44 +KPX Aacute T -14 +KPX Aacute U -57 +KPX Aacute V -81 +KPX Aacute W -75 +KPX Aacute Y -21 +KPX Aacute a -4 +KPX Aacute b 0 +KPX Aacute c -18 +KPX Aacute comma 8 +KPX Aacute d -4 +KPX Aacute e -17 +KPX Aacute g -25 +KPX Aacute guillemotleft -44 +KPX Aacute guilsinglleft -43 +KPX Aacute hyphen -13 +KPX Aacute o -17 +KPX Aacute period 8 +KPX Aacute q -12 +KPX Aacute quoteright -92 +KPX Aacute t -6 +KPX Aacute u -9 +KPX Aacute v -50 +KPX Aacute w -44 +KPX Aacute y -57 +KPX Acircumflex C -50 +KPX Acircumflex G -44 +KPX Acircumflex O -45 +KPX Acircumflex Q -44 +KPX Acircumflex T -14 +KPX Acircumflex U -57 +KPX Acircumflex V -81 +KPX Acircumflex W -75 +KPX Acircumflex Y -21 +KPX Acircumflex comma 8 +KPX Acircumflex period 8 +KPX Adieresis C -50 +KPX Adieresis G -44 +KPX Adieresis O -45 +KPX Adieresis Q -44 +KPX Adieresis T -14 +KPX Adieresis U -57 +KPX Adieresis V -81 +KPX Adieresis W -75 +KPX Adieresis Y -21 +KPX Adieresis a -4 +KPX Adieresis b 0 +KPX Adieresis c -18 +KPX Adieresis comma 8 +KPX Adieresis d -4 +KPX Adieresis g -25 +KPX Adieresis guillemotleft -44 +KPX Adieresis guilsinglleft -43 +KPX Adieresis hyphen -13 +KPX Adieresis o -17 +KPX Adieresis period 8 +KPX Adieresis q -12 +KPX Adieresis quotedblright -92 +KPX Adieresis quoteright -92 +KPX Adieresis t -6 +KPX Adieresis u -9 +KPX Adieresis v -50 +KPX Adieresis w -44 +KPX Adieresis y -57 +KPX Agrave C -50 +KPX Agrave G -44 +KPX Agrave O -45 +KPX Agrave Q -44 +KPX Agrave T -14 +KPX Agrave U -57 +KPX Agrave V -81 +KPX Agrave W -75 +KPX Agrave Y -21 +KPX Agrave comma 8 +KPX Agrave period 8 +KPX Aring C -50 +KPX Aring G -44 +KPX Aring O -45 +KPX Aring Q -44 +KPX Aring T -14 +KPX Aring U -57 +KPX Aring V -81 +KPX Aring W -75 +KPX Aring Y -21 +KPX Aring a -4 +KPX Aring b 0 +KPX Aring c -18 +KPX Aring comma 8 +KPX Aring d -4 +KPX Aring e -17 +KPX Aring g -25 +KPX Aring guillemotleft -44 +KPX Aring guilsinglleft -43 +KPX Aring hyphen -13 +KPX Aring o -17 +KPX Aring period 8 +KPX Aring q -12 +KPX Aring quotedblright -92 +KPX Aring quoteright -92 +KPX Aring t -6 +KPX Aring u -9 +KPX Aring v -50 +KPX Aring w -44 +KPX Aring y -57 +KPX Atilde C -50 +KPX Atilde G -44 +KPX Atilde O -45 +KPX Atilde Q -44 +KPX Atilde T -14 +KPX Atilde U -57 +KPX Atilde V -81 +KPX Atilde W -75 +KPX Atilde Y -21 +KPX Atilde comma 7 +KPX Atilde period 7 +KPX B A -23 +KPX B AE -35 +KPX B Aacute -23 +KPX B Acircumflex -23 +KPX B Adieresis -23 +KPX B Aring -23 +KPX B Atilde -23 +KPX B O -14 +KPX B OE -6 +KPX B Oacute -14 +KPX B Ocircumflex -14 +KPX B Odieresis -14 +KPX B Ograve -14 +KPX B Oslash -14 +KPX B V -32 +KPX B W -29 +KPX B Y -39 +KPX C A -14 +KPX C AE -30 +KPX C Aacute -14 +KPX C Adieresis -14 +KPX C Aring -14 +KPX C H -13 +KPX C K -21 +KPX C O -19 +KPX C Oacute -19 +KPX C Odieresis -19 +KPX Ccedilla A -18 +KPX D A -36 +KPX D Aacute -36 +KPX D Acircumflex -36 +KPX D Adieresis -36 +KPX D Agrave -36 +KPX D Aring -36 +KPX D Atilde -36 +KPX D J -32 +KPX D T -9 +KPX D V -42 +KPX D W -36 +KPX D X -40 +KPX D Y -50 +KPX F A -72 +KPX F Aacute -72 +KPX F Acircumflex -72 +KPX F Adieresis -72 +KPX F Agrave -72 +KPX F Aring -72 +KPX F Atilde -72 +KPX F J -60 +KPX F O -40 +KPX F Odieresis -40 +KPX F a -77 +KPX F aacute -78 +KPX F adieresis -52 +KPX F ae -82 +KPX F aring -70 +KPX F comma -95 +KPX F e -83 +KPX F eacute -83 +KPX F hyphen -45 +KPX F i -36 +KPX F j -41 +KPX F o -79 +KPX F oacute -79 +KPX F odieresis -52 +KPX F oe -75 +KPX F oslash -80 +KPX F period -99 +KPX F r -52 +KPX F u -50 +KPX G A -17 +KPX G AE -29 +KPX G Aacute -17 +KPX G Acircumflex -17 +KPX G Adieresis -17 +KPX G Agrave -17 +KPX G Aring -17 +KPX G Atilde -17 +KPX G T -13 +KPX G V -5 +KPX G W -2 +KPX G Y -12 +KPX J A -40 +KPX J AE -52 +KPX J Adieresis -40 +KPX J Aring -40 +KPX K C -55 +KPX K G -53 +KPX K O -46 +KPX K OE -45 +KPX K Oacute -46 +KPX K Odieresis -46 +KPX K S 6 +KPX K T 21 +KPX K a -5 +KPX K adieresis -5 +KPX K ae -5 +KPX K aring -5 +KPX K e -18 +KPX K hyphen -57 +KPX K o -18 +KPX K oacute -18 +KPX K odieresis -18 +KPX K u -10 +KPX K udieresis -10 +KPX K y -89 +KPX L A 44 +KPX L AE 32 +KPX L Aacute 44 +KPX L Adieresis 44 +KPX L Aring 44 +KPX L C 6 +KPX L Ccedilla 4 +KPX L G 11 +KPX L O 10 +KPX L Oacute 10 +KPX L Ocircumflex 10 +KPX L Odieresis 10 +KPX L Ograve 10 +KPX L Otilde 10 +KPX L S 20 +KPX L T -13 +KPX L U -8 +KPX L Udieresis -8 +KPX L V -55 +KPX L W -48 +KPX L Y -20 +KPX L hyphen 47 +KPX L quotedblright -92 +KPX L quoteright -92 +KPX L u 12 +KPX L udieresis 10 +KPX L y -26 +KPX N A -20 +KPX N AE -32 +KPX N Aacute -20 +KPX N Adieresis -20 +KPX N Aring -20 +KPX N C -21 +KPX N Ccedilla -20 +KPX N G -14 +KPX N O -20 +KPX N Oacute -20 +KPX N Odieresis -20 +KPX N a -22 +KPX N aacute -23 +KPX N adieresis -23 +KPX N ae -27 +KPX N aring -23 +KPX N comma -13 +KPX N e -28 +KPX N eacute -30 +KPX N o -25 +KPX N oacute -27 +KPX N odieresis -27 +KPX N oslash -27 +KPX N period -16 +KPX N u -24 +KPX N udieresis -25 +KPX O A -38 +KPX O AE -70 +KPX O Aacute -38 +KPX O Adieresis -38 +KPX O Aring -38 +KPX O T -3 +KPX O V -45 +KPX O W -39 +KPX O X -41 +KPX O Y -51 +KPX Oacute A -38 +KPX Oacute T -3 +KPX Oacute V -45 +KPX Oacute W -39 +KPX Oacute Y -51 +KPX Ocircumflex T -3 +KPX Ocircumflex V -45 +KPX Ocircumflex Y -51 +KPX Odieresis A -38 +KPX Odieresis T -3 +KPX Odieresis V -45 +KPX Odieresis W -39 +KPX Odieresis X -41 +KPX Odieresis Y -51 +KPX Ograve T -3 +KPX Ograve V -45 +KPX Ograve Y -51 +KPX Oslash A -38 +KPX Otilde T -3 +KPX Otilde V -45 +KPX Otilde Y -51 +KPX P A -79 +KPX P AE -116 +KPX P Aacute -79 +KPX P Adieresis -79 +KPX P Aring -79 +KPX P J -89 +KPX P a -74 +KPX P aacute -74 +KPX P adieresis -64 +KPX P ae -80 +KPX P aring -74 +KPX P comma -118 +KPX P e -79 +KPX P eacute -79 +KPX P hyphen -64 +KPX P o -73 +KPX P oacute -73 +KPX P odieresis -64 +KPX P oe -67 +KPX P oslash -74 +KPX P period -121 +KPX R C -26 +KPX R Ccedilla -25 +KPX R G -20 +KPX R O -26 +KPX R OE -18 +KPX R Oacute -26 +KPX R Odieresis -26 +KPX R T 0 +KPX R U -36 +KPX R Udieresis -36 +KPX R V -31 +KPX R W -28 +KPX R Y -19 +KPX R a -3 +KPX R aacute -3 +KPX R adieresis -3 +KPX R ae -3 +KPX R aring -3 +KPX R e -15 +KPX R eacute -15 +KPX R hyphen -29 +KPX R o -15 +KPX R oacute -15 +KPX R odieresis -15 +KPX R oe -15 +KPX R u -7 +KPX R uacute -7 +KPX R udieresis -7 +KPX R y 0 +KPX S A -2 +KPX S AE -14 +KPX S Aacute -2 +KPX S Adieresis -2 +KPX S Aring -2 +KPX S T 1 +KPX S V 5 +KPX S W 8 +KPX S Y -1 +KPX S t -13 +KPX T A -33 +KPX T AE -45 +KPX T Aacute -33 +KPX T Acircumflex -33 +KPX T Adieresis -33 +KPX T Agrave -33 +KPX T Aring -33 +KPX T Atilde -33 +KPX T C -15 +KPX T G -7 +KPX T J -39 +KPX T O -20 +KPX T OE -8 +KPX T Oacute -20 +KPX T Ocircumflex -20 +KPX T Odieresis -20 +KPX T Ograve -20 +KPX T Oslash -20 +KPX T Otilde -20 +KPX T S -2 +KPX T V 41 +KPX T W 43 +KPX T Y 33 +KPX T a -81 +KPX T ae -81 +KPX T c -86 +KPX T colon -84 +KPX T comma -70 +KPX T e -90 +KPX T g -102 +KPX T guillemotleft -102 +KPX T guilsinglleft -101 +KPX T hyphen -68 +KPX T i -16 +KPX T j -20 +KPX T o -87 +KPX T oslash -89 +KPX T period -71 +KPX T r -87 +KPX T s -74 +KPX T semicolon -92 +KPX T u -86 +KPX T v -72 +KPX T w -69 +KPX T y -70 +KPX U A -50 +KPX U AE -69 +KPX U Aacute -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -35 +KPX U m -28 +KPX U n -29 +KPX U p -32 +KPX U period -39 +KPX U r -41 +KPX Uacute A -50 +KPX Uacute comma -35 +KPX Uacute m -28 +KPX Uacute n -29 +KPX Uacute p -32 +KPX Uacute period -39 +KPX Uacute r -41 +KPX Ucircumflex A -50 +KPX Udieresis A -50 +KPX Udieresis b 1 +KPX Udieresis comma -35 +KPX Udieresis m -28 +KPX Udieresis n -29 +KPX Udieresis p -32 +KPX Udieresis period -39 +KPX Udieresis r -41 +KPX Ugrave A -50 +KPX V A -66 +KPX V AE -102 +KPX V Aacute -66 +KPX V Acircumflex -66 +KPX V Adieresis -66 +KPX V Agrave -66 +KPX V Aring -66 +KPX V Atilde -66 +KPX V C -48 +KPX V G -42 +KPX V O -48 +KPX V Oacute -48 +KPX V Ocircumflex -48 +KPX V Odieresis -48 +KPX V Ograve -48 +KPX V Oslash -48 +KPX V Otilde -48 +KPX V S -15 +KPX V T 32 +KPX V a -67 +KPX V ae -72 +KPX V colon -82 +KPX V comma -76 +KPX V e -74 +KPX V g -84 +KPX V guillemotleft -82 +KPX V guilsinglleft -81 +KPX V hyphen -45 +KPX V i -16 +KPX V o -70 +KPX V oslash -72 +KPX V period -80 +KPX V r -45 +KPX V semicolon -79 +KPX V u -40 +KPX V y -16 +KPX W A -57 +KPX W AE -85 +KPX W Aacute -57 +KPX W Acircumflex -57 +KPX W Adieresis -57 +KPX W Agrave -57 +KPX W Aring -57 +KPX W Atilde -57 +KPX W C -39 +KPX W G -33 +KPX W O -39 +KPX W Oacute -39 +KPX W Ocircumflex -39 +KPX W Odieresis -39 +KPX W Ograve -39 +KPX W Oslash -39 +KPX W Otilde -39 +KPX W S -17 +KPX W T 30 +KPX W a -53 +KPX W ae -58 +KPX W colon -77 +KPX W comma -58 +KPX W e -60 +KPX W g -75 +KPX W guillemotleft -68 +KPX W guilsinglleft -67 +KPX W hyphen -32 +KPX W i -18 +KPX W o -56 +KPX W oslash -58 +KPX W period -62 +KPX W r -40 +KPX W semicolon -74 +KPX W u -35 +KPX W y -11 +KPX X C -50 +KPX X O -44 +KPX X Odieresis -44 +KPX X Q -42 +KPX X a -3 +KPX X e -15 +KPX X hyphen -41 +KPX X o -15 +KPX X u -7 +KPX X y -67 +KPX Y A -27 +KPX Y AE -39 +KPX Y Aacute -27 +KPX Y Acircumflex -27 +KPX Y Adieresis -27 +KPX Y Agrave -27 +KPX Y Aring -27 +KPX Y Atilde -27 +KPX Y C -52 +KPX Y G -45 +KPX Y O -52 +KPX Y Oacute -52 +KPX Y Ocircumflex -52 +KPX Y Odieresis -52 +KPX Y Ograve -52 +KPX Y Oslash -52 +KPX Y Otilde -52 +KPX Y S -15 +KPX Y T 32 +KPX Y a -72 +KPX Y ae -75 +KPX Y colon -78 +KPX Y comma -64 +KPX Y e -78 +KPX Y g -94 +KPX Y guillemotleft -93 +KPX Y guilsinglleft -92 +KPX Y hyphen -60 +KPX Y i -16 +KPX Y o -75 +KPX Y oslash -77 +KPX Y p -52 +KPX Y period -65 +KPX Y semicolon -86 +KPX Y u -58 +KPX Y v -32 +KPX Z v -12 +KPX Z y -28 +KPX a j -22 +KPX a quoteright -28 +KPX a v 1 +KPX a w 4 +KPX a y 2 +KPX aacute v 1 +KPX aacute w 4 +KPX aacute y 2 +KPX adieresis v 1 +KPX adieresis w 4 +KPX adieresis y 2 +KPX ae v 2 +KPX ae w 5 +KPX ae y 6 +KPX agrave v 1 +KPX agrave w 4 +KPX agrave y 2 +KPX aring v 1 +KPX aring w 4 +KPX aring y 2 +KPX b v -10 +KPX b w -7 +KPX b y -3 +KPX c h -30 +KPX c k -29 +KPX comma one -40 +KPX comma quotedblright -39 +KPX comma quoteright -39 +KPX e quoteright -21 +KPX e t -16 +KPX e v 0 +KPX e w 2 +KPX e x -10 +KPX e y 4 +KPX eacute v 0 +KPX eacute w 2 +KPX eacute y 4 +KPX ecircumflex v 0 +KPX ecircumflex w 2 +KPX ecircumflex y 4 +KPX eight four 13 +KPX eight one -50 +KPX eight seven -1 +KPX f a -26 +KPX f aacute -27 +KPX f adieresis -2 +KPX f ae -30 +KPX f aring -17 +KPX f e -32 +KPX f eacute -34 +KPX f f 30 +KPX f i 17 +KPX f j 13 +KPX f l 42 +KPX f o -29 +KPX f oacute -30 +KPX f odieresis -2 +KPX f oe -24 +KPX f oslash -31 +KPX f quoteright 18 +KPX f s -20 +KPX f t 18 +KPX five four -5 +KPX five one -71 +KPX five seven -28 +KPX four four 12 +KPX four one -69 +KPX four seven -27 +KPX g a -41 +KPX g adieresis -42 +KPX g ae -46 +KPX g aring -42 +KPX g e -45 +KPX g eacute -45 +KPX g l -46 +KPX g oacute -41 +KPX g odieresis -41 +KPX g r -21 +KPX guillemotright A -25 +KPX guillemotright AE -51 +KPX guillemotright Aacute -25 +KPX guillemotright Adieresis -25 +KPX guillemotright Aring -25 +KPX guillemotright T -77 +KPX guillemotright V -76 +KPX guillemotright W -67 +KPX guillemotright Y -81 +KPX guilsinglright A -24 +KPX guilsinglright AE -50 +KPX guilsinglright Aacute -24 +KPX guilsinglright Adieresis -24 +KPX guilsinglright Aring -24 +KPX guilsinglright T -76 +KPX guilsinglright V -75 +KPX guilsinglright W -66 +KPX guilsinglright Y -80 +KPX h quoteright -31 +KPX h y -4 +KPX hyphen A 3 +KPX hyphen AE -23 +KPX hyphen Aacute 3 +KPX hyphen Adieresis 3 +KPX hyphen Aring 3 +KPX hyphen T -46 +KPX hyphen V -43 +KPX hyphen W -34 +KPX hyphen Y -53 +KPX i T -10 +KPX i j -31 +KPX k a 12 +KPX k aacute 12 +KPX k adieresis 12 +KPX k ae 9 +KPX k aring 12 +KPX k comma 27 +KPX k e 5 +KPX k eacute 5 +KPX k g -27 +KPX k hyphen -27 +KPX k o 6 +KPX k oacute 6 +KPX k odieresis 6 +KPX k period 26 +KPX k s 7 +KPX k u 8 +KPX k udieresis 8 +KPX l v -12 +KPX l y -11 +KPX m p -4 +KPX m v -6 +KPX m w -4 +KPX m y -3 +KPX n T -41 +KPX n p -7 +KPX n quoteright -34 +KPX n v -10 +KPX n w -7 +KPX n y -6 +KPX nine four 2 +KPX nine one -64 +KPX nine seven -5 +KPX o T -63 +KPX o quoteright -24 +KPX o t -15 +KPX o v -18 +KPX o w -15 +KPX o x -33 +KPX o y -10 +KPX oacute v -18 +KPX oacute w -15 +KPX oacute y -10 +KPX ocircumflex t -16 +KPX odieresis t -16 +KPX odieresis v -18 +KPX odieresis w -15 +KPX odieresis x -33 +KPX odieresis y -10 +KPX ograve v -18 +KPX ograve w -15 +KPX ograve y -10 +KPX one comma -52 +KPX one eight -57 +KPX one five -55 +KPX one four -69 +KPX one nine -61 +KPX one one -69 +KPX one period -56 +KPX one seven -60 +KPX one six -50 +KPX one three -55 +KPX one two -50 +KPX one zero -41 +KPX p t -14 +KPX p y -4 +KPX period one -39 +KPX period quotedblright -38 +KPX period quoteright -38 +KPX q c -13 +KPX q u -11 +KPX quotedblbase A 1 +KPX quotedblbase AE -13 +KPX quotedblbase T -64 +KPX quotedblbase V -96 +KPX quotedblbase W -84 +KPX quotedblbase Y -69 +KPX quotedblleft A -88 +KPX quotedblleft AE -141 +KPX quotedblleft Aacute -88 +KPX quotedblleft Adieresis -88 +KPX quotedblleft Aring -88 +KPX quotedblleft T -19 +KPX quotedblleft V -17 +KPX quotedblleft W -15 +KPX quotedblleft Y -25 +KPX quotedblright A -94 +KPX quotedblright AE -147 +KPX quotedblright Aacute -94 +KPX quotedblright Adieresis -94 +KPX quotedblright Aring -94 +KPX quotedblright T -21 +KPX quotedblright V -22 +KPX quotedblright W -19 +KPX quotedblright Y -30 +KPX quoteleft A -78 +KPX quoteleft AE -131 +KPX quoteleft Aacute -78 +KPX quoteleft Adieresis -78 +KPX quoteleft Aring -78 +KPX quoteleft T -9 +KPX quoteleft V -8 +KPX quoteleft W -5 +KPX quoteleft Y -15 +KPX quoteright A -87 +KPX quoteright AE -140 +KPX quoteright Aacute -87 +KPX quoteright Adieresis -87 +KPX quoteright Aring -87 +KPX quoteright comma -73 +KPX quoteright d -79 +KPX quoteright o -78 +KPX quoteright period -78 +KPX quoteright r -57 +KPX quoteright s -63 +KPX quoteright t -49 +KPX quoteright v -28 +KPX quoteright w -26 +KPX quoteright y -28 +KPX r a -29 +KPX r aacute -29 +KPX r acircumflex -29 +KPX r adieresis -29 +KPX r ae -36 +KPX r agrave -29 +KPX r aring -29 +KPX r c -26 +KPX r ccedilla -17 +KPX r colon -28 +KPX r comma -68 +KPX r d -31 +KPX r e -35 +KPX r eacute -35 +KPX r ecircumflex -35 +KPX r egrave -35 +KPX r f 23 +KPX r g -21 +KPX r h -17 +KPX r hyphen -52 +KPX r i 8 +KPX r j 4 +KPX r k -15 +KPX r l -21 +KPX r m 17 +KPX r n 16 +KPX r o -28 +KPX r oacute -28 +KPX r ocircumflex -28 +KPX r odieresis -28 +KPX r oe -23 +KPX r ograve -28 +KPX r oslash -29 +KPX r p 13 +KPX r period -72 +KPX r q -31 +KPX r quoteright -4 +KPX r r 4 +KPX r s -17 +KPX r semicolon -28 +KPX r t 12 +KPX r u 11 +KPX r v 30 +KPX r w 32 +KPX r x 7 +KPX r y 33 +KPX r z 0 +KPX s quoteright -20 +KPX s t -12 +KPX seven colon -88 +KPX seven comma -79 +KPX seven eight -32 +KPX seven five -53 +KPX seven four -65 +KPX seven one -47 +KPX seven period -83 +KPX seven seven -11 +KPX seven six -37 +KPX seven three -42 +KPX seven two -13 +KPX six four 17 +KPX six one -64 +KPX six seven -37 +KPX t S -9 +KPX t a -6 +KPX t aacute -6 +KPX t adieresis -6 +KPX t ae -10 +KPX t aring -6 +KPX t colon -29 +KPX t e -13 +KPX t eacute -13 +KPX t h -11 +KPX t o -11 +KPX t oacute -11 +KPX t odieresis -11 +KPX t quoteright -19 +KPX t semicolon -26 +KPX three four -9 +KPX three one -76 +KPX three seven -15 +KPX two four -12 +KPX two one -45 +KPX two seven -22 +KPX u quoteright -31 +KPX v a -24 +KPX v aacute -26 +KPX v acircumflex -26 +KPX v adieresis -26 +KPX v ae -29 +KPX v agrave -26 +KPX v aring -26 +KPX v atilde -26 +KPX v c -26 +KPX v colon -48 +KPX v comma -46 +KPX v e -30 +KPX v eacute -32 +KPX v ecircumflex -32 +KPX v egrave -32 +KPX v g -36 +KPX v hyphen 0 +KPX v l -29 +KPX v o -26 +KPX v oacute -28 +KPX v odieresis -28 +KPX v ograve -28 +KPX v oslash -29 +KPX v period -51 +KPX v s -30 +KPX v semicolon -48 +KPX w a -26 +KPX w aacute -28 +KPX w acircumflex -28 +KPX w adieresis -28 +KPX w ae -31 +KPX w agrave -28 +KPX w aring -28 +KPX w atilde -28 +KPX w c -28 +KPX w colon -49 +KPX w comma -47 +KPX w e -32 +KPX w eacute -34 +KPX w ecircumflex -34 +KPX w egrave -34 +KPX w g -38 +KPX w hyphen -4 +KPX w l -30 +KPX w o -28 +KPX w oacute -30 +KPX w odieresis -30 +KPX w ograve -30 +KPX w oslash -31 +KPX w period -51 +KPX w s -32 +KPX w semicolon -49 +KPX x a 6 +KPX x c 0 +KPX x e 0 +KPX x eacute 0 +KPX x o 1 +KPX x q 2 +KPX y a -12 +KPX y aacute -12 +KPX y acircumflex -12 +KPX y adieresis -12 +KPX y ae -17 +KPX y agrave -12 +KPX y aring -12 +KPX y atilde -12 +KPX y c -15 +KPX y colon -48 +KPX y comma -21 +KPX y e -19 +KPX y eacute -19 +KPX y ecircumflex -19 +KPX y egrave -19 +KPX y g -34 +KPX y hyphen 7 +KPX y l -18 +KPX y o -15 +KPX y oacute -15 +KPX y odieresis -15 +KPX y ograve -15 +KPX y oslash -16 +KPX y period -25 +KPX y s -19 +KPX y semicolon -45 +KPX zero four 14 +KPX zero one -50 +KPX zero seven -3 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n021023l.pfb b/pdf2swf/fonts/n021023l.pfb new file mode 100644 index 00000000..aa9ff5f8 Binary files /dev/null and b/pdf2swf/fonts/n021023l.pfb differ diff --git a/pdf2swf/fonts/n021024l.afm b/pdf2swf/fonts/n021024l.afm new file mode 100644 index 00000000..0833e4f0 --- /dev/null +++ b/pdf2swf/fonts/n021024l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusRomNo9L-MediItal +FullName Nimbus Roman No9 L Medium Italic +FamilyName Nimbus Roman No9 L +Weight Bold +ItalicAngle -15.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -200 -324 996 964 +CapHeight 669 +XHeight 449 +Descender -205 +Ascender 699 +StartCharMetrics 316 +C 32 ; WX 250 ; N space ; B 125 0 125 0 ; +C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ; +C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ; +C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ; +C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ; +C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ; +C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ; +C 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ; +C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ; +C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ; +C 42 ; WX 500 ; N asterisk ; B 65 252 456 685 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ; +C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ; +C 46 ; WX 250 ; N period ; B -9 -13 139 135 ; +C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ; +C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ; +C 49 ; WX 500 ; N one ; B 5 0 419 683 ; +C 50 ; WX 500 ; N two ; B -27 0 446 683 ; +C 51 ; WX 500 ; N three ; B -15 -13 450 683 ; +C 52 ; WX 500 ; N four ; B -15 0 503 683 ; +C 53 ; WX 500 ; N five ; B -11 -13 487 669 ; +C 54 ; WX 500 ; N six ; B 23 -15 509 679 ; +C 55 ; WX 500 ; N seven ; B 52 0 525 669 ; +C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ; +C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ; +C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ; +C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ; +C 60 ; WX 570 ; N less ; B 31 -12 539 518 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -12 539 518 ; +C 63 ; WX 500 ; N question ; B 79 -13 470 684 ; +C 64 ; WX 832 ; N at ; B 63 -18 770 685 ; +C 65 ; WX 667 ; N A ; B -67 0 593 683 ; +C 66 ; WX 667 ; N B ; B -24 0 624 669 ; +C 67 ; WX 667 ; N C ; B 32 -18 677 685 ; +C 68 ; WX 722 ; N D ; B -46 0 685 669 ; +C 69 ; WX 667 ; N E ; B -27 0 653 669 ; +C 70 ; WX 667 ; N F ; B -13 0 660 669 ; +C 71 ; WX 722 ; N G ; B 21 -18 706 685 ; +C 72 ; WX 778 ; N H ; B -24 0 799 669 ; +C 73 ; WX 389 ; N I ; B -32 0 406 669 ; +C 74 ; WX 500 ; N J ; B -46 -99 524 669 ; +C 75 ; WX 667 ; N K ; B -21 0 702 669 ; +C 76 ; WX 611 ; N L ; B -22 0 590 669 ; +C 77 ; WX 889 ; N M ; B -29 -12 917 669 ; +C 78 ; WX 722 ; N N ; B -27 -15 748 669 ; +C 79 ; WX 722 ; N O ; B 27 -18 691 685 ; +C 80 ; WX 611 ; N P ; B -27 0 613 669 ; +C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ; +C 82 ; WX 667 ; N R ; B -29 0 623 669 ; +C 83 ; WX 556 ; N S ; B 2 -18 526 685 ; +C 84 ; WX 611 ; N T ; B 50 0 650 669 ; +C 85 ; WX 722 ; N U ; B 67 -18 744 669 ; +C 86 ; WX 667 ; N V ; B 65 -18 715 669 ; +C 87 ; WX 889 ; N W ; B 65 -18 940 669 ; +C 88 ; WX 667 ; N X ; B -24 0 694 669 ; +C 89 ; WX 611 ; N Y ; B 73 0 659 669 ; +C 90 ; WX 611 ; N Z ; B -11 0 590 669 ; +C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ; +C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ; +C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ; +C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ; +C 97 ; WX 500 ; N a ; B -21 -14 455 462 ; +C 98 ; WX 500 ; N b ; B -14 -13 444 699 ; +C 99 ; WX 444 ; N c ; B -5 -13 392 462 ; +C 100 ; WX 500 ; N d ; B -21 -13 517 699 ; +C 101 ; WX 444 ; N e ; B 5 -13 398 462 ; +C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; +C 103 ; WX 500 ; N g ; B -52 -203 478 462 ; +C 104 ; WX 556 ; N h ; B -13 -9 498 699 ; +C 105 ; WX 278 ; N i ; B 2 -9 263 685 ; +C 106 ; WX 278 ; N j ; B -189 -207 279 685 ; +C 107 ; WX 500 ; N k ; B -23 -8 483 699 ; +C 108 ; WX 278 ; N l ; B 2 -9 290 699 ; +C 109 ; WX 778 ; N m ; B -14 -9 722 462 ; +C 110 ; WX 556 ; N n ; B -6 -9 493 462 ; +C 111 ; WX 500 ; N o ; B -3 -13 441 462 ; +C 112 ; WX 500 ; N p ; B -120 -205 446 462 ; +C 113 ; WX 500 ; N q ; B 1 -205 471 462 ; +C 114 ; WX 389 ; N r ; B -21 0 389 462 ; +C 115 ; WX 389 ; N s ; B -19 -13 333 462 ; +C 116 ; WX 278 ; N t ; B -11 -9 281 594 ; +C 117 ; WX 556 ; N u ; B 15 -9 492 462 ; +C 118 ; WX 444 ; N v ; B 16 -13 401 462 ; +C 119 ; WX 667 ; N w ; B 16 -13 614 462 ; +C 120 ; WX 500 ; N x ; B -46 -13 469 462 ; +C 121 ; WX 444 ; N y ; B -94 -205 392 462 ; +C 122 ; WX 389 ; N z ; B -43 -78 368 449 ; +C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ; +C 124 ; WX 220 ; N bar ; B 66 -18 154 685 ; +C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ; +C 126 ; WX 570 ; N asciitilde ; B 54 175 516 331 ; +C 161 ; WX 389 ; N exclamdown ; B 19 -205 320 494 ; +C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ; +C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ; +C 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ; +C 165 ; WX 500 ; N yen ; B 33 0 628 669 ; +C 166 ; WX 500 ; N florin ; B -87 -156 537 707 ; +C 167 ; WX 500 ; N section ; B 36 -143 459 685 ; +C 168 ; WX 500 ; N currency ; B -26 34 526 586 ; +C 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ; +C 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ; +C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ; +C 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ; +C 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ; +C 174 ; WX 556 ; N fi ; B -188 -205 514 703 ; +C 175 ; WX 556 ; N fl ; B -186 -205 553 704 ; +C 177 ; WX 500 ; N endash ; B -40 178 477 269 ; +C 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ; +C 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ; +C 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ; +C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ; +C 183 ; WX 350 ; N bullet ; B 0 175 350 525 ; +C 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ; +C 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ; +C 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ; +C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ; +C 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ; +C 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ; +C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ; +C 193 ; WX 333 ; N grave ; B 85 516 297 697 ; +C 194 ; WX 333 ; N acute ; B 139 516 379 697 ; +C 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ; +C 196 ; WX 333 ; N tilde ; B 48 536 407 655 ; +C 197 ; WX 333 ; N macron ; B 51 553 393 623 ; +C 198 ; WX 333 ; N breve ; B 71 516 387 678 ; +C 199 ; WX 333 ; N dotaccent ; B 163 525 293 655 ; +C 200 ; WX 333 ; N dieresis ; B 55 525 397 655 ; +C 202 ; WX 333 ; N ring ; B 127 540 340 754 ; +C 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ; +C 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ; +C 206 ; WX 333 ; N ogonek ; B -40 -173 189 44 ; +C 207 ; WX 333 ; N caron ; B 79 516 411 690 ; +C 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ; +C 225 ; WX 944 ; N AE ; B -64 0 918 669 ; +C 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ; +C 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ; +C 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ; +C 234 ; WX 944 ; N OE ; B 23 -9 946 677 ; +C 235 ; WX 300 ; N ordmasculine ; B 56 400 350 685 ; +C 241 ; WX 722 ; N ae ; B -5 -13 673 462 ; +C 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ; +C 248 ; WX 278 ; N lslash ; B -13 -9 301 699 ; +C 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ; +C 250 ; WX 722 ; N oe ; B 6 -13 674 462 ; +C 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ; +C -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ; +C -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ; +C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ; +C -1 ; WX 611 ; N Tcaron ; B 50 0 650 900 ; +C -1 ; WX 556 ; N Scaron ; B 2 -18 526 897 ; +C -1 ; WX 667 ; N Rcaron ; B -29 0 623 900 ; +C -1 ; WX 667 ; N Racute ; B -29 0 623 907 ; +C -1 ; WX 556 ; N Sacute ; B 2 -18 526 907 ; +C -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ; +C -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 693 907 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 907 ; +C -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ; +C -1 ; WX 722 ; N Eth ; B -31 0 700 669 ; +C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ; +C -1 ; WX 611 ; N Zacute ; B -11 0 590 907 ; +C -1 ; WX 722 ; N Uring ; B 67 -18 744 964 ; +C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ; +C -1 ; WX 444 ; N eogonek ; B 5 -173 404 462 ; +C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ; +C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ; +C -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ; +C -1 ; WX 611 ; N Thorn ; B -27 0 574 669 ; +C -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ; +C -1 ; WX 444 ; N edieresis ; B 5 -13 443 655 ; +C -1 ; WX 600 ; N dcaron ; B -21 -13 664 699 ; +C -1 ; WX 444 ; N ccedilla ; B -24 -218 392 462 ; +C -1 ; WX 444 ; N ccaron ; B -5 -13 468 690 ; +C -1 ; WX 444 ; N cacute ; B -5 -13 444 697 ; +C -1 ; WX 500 ; N aogonek ; B -21 -173 500 462 ; +C -1 ; WX 500 ; N aring ; B -21 -14 455 754 ; +C -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ; +C -1 ; WX 500 ; N abreve ; B -21 -14 470 678 ; +C -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ; +C -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ; +C -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ; +C -1 ; WX 500 ; N adieresis ; B -21 -14 471 655 ; +C -1 ; WX 722 ; N Uogonek ; B 67 -173 744 669 ; +C -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ; +C -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ; +C -1 ; WX 556 ; N udieresis ; B 15 -9 494 655 ; +C -1 ; WX 345 ; N tcaron ; B -11 -9 409 685 ; +C -1 ; WX 389 ; N scommaaccent ; B -26 -324 333 462 ; +C -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ; +C -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ; +C -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ; +C -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ; +C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 865 ; +C -1 ; WX 389 ; N scaron ; B -19 -13 439 690 ; +C -1 ; WX 667 ; N Amacron ; B -67 0 593 833 ; +C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 50 -324 650 669 ; +C -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ; +C -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ; +C -1 ; WX 667 ; N Emacron ; B -27 0 653 833 ; +C -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ; +C -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ; +C -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ; +C -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ; +C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 900 ; +C -1 ; WX 722 ; N Nacute ; B -27 -15 748 907 ; +C -1 ; WX 611 ; N Lcaron ; B -22 0 651 685 ; +C -1 ; WX 611 ; N Lacute ; B -22 0 590 907 ; +C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 865 ; +C -1 ; WX 389 ; N racute ; B -21 0 407 697 ; +C -1 ; WX 389 ; N Icircumflex ; B -32 0 420 897 ; +C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ; +C -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ; +C -1 ; WX 500 ; N Euro ; B 53 -5 666 689 ; +C -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ; +C -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ; +C -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ; +C -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ; +C -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ; +C -1 ; WX 389 ; N Iacute ; B -32 0 407 907 ; +C -1 ; WX 389 ; N Imacron ; B -32 0 461 833 ; +C -1 ; WX 389 ; N Iogonek ; B -32 -173 406 669 ; +C -1 ; WX 389 ; N Idieresis ; B -32 0 445 862 ; +C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 888 ; +C -1 ; WX 722 ; N Umacron ; B 67 -18 744 833 ; +C -1 ; WX 667 ; N Kcommaaccent ; B -21 -324 702 669 ; +C -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ; +C -1 ; WX 556 ; N Scommaaccent ; B 2 -324 526 685 ; +C -1 ; WX 667 ; N Eogonek ; B -27 -173 667 669 ; +C -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ; +C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 865 ; +C -1 ; WX 278 ; N iogonek ; B 2 -173 278 685 ; +C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 765 ; +C -1 ; WX 500 ; N odieresis ; B -3 -13 466 655 ; +C -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ; +C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ; +C -1 ; WX 667 ; N Ecaron ; B -27 0 653 900 ; +C -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ; +C -1 ; WX 389 ; N scedilla ; B -40 -218 333 462 ; +C -1 ; WX 389 ; N rcaron ; B -21 0 439 690 ; +C -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ; +C -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 21 -324 706 685 ; +C -1 ; WX 667 ; N Rcommaaccent ; B -29 -324 623 669 ; +C -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ; +C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ; +C -1 ; WX 556 ; N uogonek ; B 15 -173 556 462 ; +C -1 ; WX 556 ; N umacron ; B 15 -9 505 623 ; +C -1 ; WX 722 ; N Dcaron ; B -46 0 685 900 ; +C -1 ; WX 382 ; N lcaron ; B 2 -9 446 699 ; +C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 900 ; +C -1 ; WX 667 ; N Cacute ; B 32 -18 677 907 ; +C -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ; +C -1 ; WX 400 ; N degree ; B 83 397 369 683 ; +C -1 ; WX 667 ; N Aogonek ; B -67 -173 729 683 ; +C -1 ; WX 606 ; N minus ; B 51 209 555 297 ; +C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C -1 ; WX 570 ; N divide ; B 33 -29 537 535 ; +C -1 ; WX 667 ; N Aring ; B -67 0 593 950 ; +C -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ; +C -1 ; WX 389 ; N rcommaaccent ; B -80 -324 389 462 ; +C -1 ; WX 278 ; N lacute ; B 2 -9 392 907 ; +C -1 ; WX 500 ; N omacron ; B -3 -13 477 623 ; +C -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ; +C -1 ; WX 278 ; N icircumflex ; B -2 -9 325 690 ; +C -1 ; WX 278 ; N igrave ; B 2 -9 260 697 ; +C -1 ; WX 556 ; N ncommaaccent ; B -6 -324 493 462 ; +C -1 ; WX 278 ; N lcommaaccent ; B -81 -324 290 699 ; +C -1 ; WX 570 ; N plusminus ; B 33 0 537 568 ; +C -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ; +C -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ; +C -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ; +C -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ; +C -1 ; WX 667 ; N Abreve ; B -67 0 593 888 ; +C -1 ; WX 500 ; N kcommaaccent ; B -23 -324 483 699 ; +C -1 ; WX 722 ; N Omacron ; B 27 -18 691 833 ; +C -1 ; WX 278 ; N imacron ; B 2 -9 366 623 ; +C -1 ; WX 444 ; N emacron ; B 5 -13 449 623 ; +C -1 ; WX 500 ; N amacron ; B -21 -14 477 623 ; +C -1 ; WX 278 ; N tcommaaccent ; B -81 -324 281 594 ; +C -1 ; WX 444 ; N ydieresis ; B -94 -205 438 655 ; +C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ; +C -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ; +C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ; +C -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ; +C -1 ; WX 500 ; N eth ; B -3 -13 454 699 ; +C -1 ; WX 556 ; N uring ; B 15 -9 492 754 ; +C -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ; +C -1 ; WX 333 ; N commaaccent ; B -54 -324 130 -40 ; +C -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ; +C -1 ; WX 747 ; N registered ; B 30 -18 718 685 ; +C -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ; +C -1 ; WX 278 ; N idieresis ; B 2 -9 360 655 ; +C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 570 ; N notequal ; B 33 -13 537 519 ; +C -1 ; WX 549 ; N radical ; B -17 -35 535 916 ; +C -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ; +C -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ; +C -1 ; WX 570 ; N lessequal ; B 31 0 539 642 ; +C -1 ; WX 570 ; N greaterequal ; B 31 0 539 642 ; +C -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ; +C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C -1 ; WX 494 ; N partialdiff ; B 16 -20 472 743 ; +C -1 ; WX 722 ; N Ncommaaccent ; B -27 -324 748 669 ; +C -1 ; WX 500 ; N dcroat ; B -21 -13 540 699 ; +C -1 ; WX 220 ; N brokenbar ; B 66 -18 154 685 ; +C -1 ; WX 611 ; N Lcommaaccent ; B -22 -324 590 669 ; +C -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ; +C -1 ; WX 576 ; N mu ; B -60 -207 516 449 ; +C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -61 +KPX A Ccedilla -63 +KPX A G -59 +KPX A O -53 +KPX A Odieresis -53 +KPX A Q -54 +KPX A T -33 +KPX A U -61 +KPX A Uacute -61 +KPX A Ucircumflex -61 +KPX A Udieresis -61 +KPX A Ugrave -61 +KPX A V -110 +KPX A W -107 +KPX A Y -44 +KPX A a -5 +KPX A b -1 +KPX A c -20 +KPX A ccedilla -29 +KPX A comma 0 +KPX A d -5 +KPX A e -25 +KPX A g -20 +KPX A guillemotleft -58 +KPX A guilsinglleft -68 +KPX A hyphen -23 +KPX A o -23 +KPX A period 1 +KPX A q -18 +KPX A quotedblright -78 +KPX A quoteright -101 +KPX A t -4 +KPX A u -18 +KPX A v -51 +KPX A w -56 +KPX A y -67 +KPX Aacute C -61 +KPX Aacute G -59 +KPX Aacute O -53 +KPX Aacute Q -54 +KPX Aacute T -33 +KPX Aacute U -61 +KPX Aacute V -110 +KPX Aacute W -107 +KPX Aacute Y -44 +KPX Aacute a -5 +KPX Aacute b -1 +KPX Aacute c -20 +KPX Aacute comma 0 +KPX Aacute d -5 +KPX Aacute e -25 +KPX Aacute g -20 +KPX Aacute guillemotleft -58 +KPX Aacute guilsinglleft -68 +KPX Aacute hyphen -23 +KPX Aacute o -23 +KPX Aacute period 1 +KPX Aacute q -18 +KPX Aacute quoteright -101 +KPX Aacute t -4 +KPX Aacute u -18 +KPX Aacute v -51 +KPX Aacute w -56 +KPX Aacute y -67 +KPX Acircumflex C -61 +KPX Acircumflex G -59 +KPX Acircumflex O -53 +KPX Acircumflex Q -54 +KPX Acircumflex T -33 +KPX Acircumflex U -61 +KPX Acircumflex V -110 +KPX Acircumflex W -107 +KPX Acircumflex Y -44 +KPX Acircumflex comma 0 +KPX Acircumflex period 1 +KPX Adieresis C -61 +KPX Adieresis G -59 +KPX Adieresis O -53 +KPX Adieresis Q -54 +KPX Adieresis T -33 +KPX Adieresis U -61 +KPX Adieresis V -110 +KPX Adieresis W -107 +KPX Adieresis Y -44 +KPX Adieresis a -5 +KPX Adieresis b -1 +KPX Adieresis c -20 +KPX Adieresis comma 0 +KPX Adieresis d -5 +KPX Adieresis g -20 +KPX Adieresis guillemotleft -58 +KPX Adieresis guilsinglleft -68 +KPX Adieresis hyphen -23 +KPX Adieresis o -23 +KPX Adieresis period 1 +KPX Adieresis q -18 +KPX Adieresis quotedblright -78 +KPX Adieresis quoteright -101 +KPX Adieresis t -4 +KPX Adieresis u -18 +KPX Adieresis v -51 +KPX Adieresis w -56 +KPX Adieresis y -67 +KPX Agrave C -61 +KPX Agrave G -59 +KPX Agrave O -53 +KPX Agrave Q -54 +KPX Agrave T -33 +KPX Agrave U -61 +KPX Agrave V -110 +KPX Agrave W -107 +KPX Agrave Y -44 +KPX Agrave comma 0 +KPX Agrave period 1 +KPX Aring C -61 +KPX Aring G -59 +KPX Aring O -53 +KPX Aring Q -54 +KPX Aring T -33 +KPX Aring U -61 +KPX Aring V -110 +KPX Aring W -107 +KPX Aring Y -44 +KPX Aring a -5 +KPX Aring b -1 +KPX Aring c -20 +KPX Aring comma 0 +KPX Aring d -5 +KPX Aring e -25 +KPX Aring g -20 +KPX Aring guillemotleft -58 +KPX Aring guilsinglleft -68 +KPX Aring hyphen -23 +KPX Aring o -23 +KPX Aring period 1 +KPX Aring q -18 +KPX Aring quotedblright -78 +KPX Aring quoteright -101 +KPX Aring t -4 +KPX Aring u -18 +KPX Aring v -51 +KPX Aring w -56 +KPX Aring y -67 +KPX Atilde C -61 +KPX Atilde G -59 +KPX Atilde O -53 +KPX Atilde Q -54 +KPX Atilde T -33 +KPX Atilde U -61 +KPX Atilde V -110 +KPX Atilde W -107 +KPX Atilde Y -44 +KPX Atilde comma 0 +KPX Atilde period 1 +KPX B A -34 +KPX B AE -40 +KPX B Aacute -34 +KPX B Acircumflex -34 +KPX B Adieresis -34 +KPX B Aring -34 +KPX B Atilde -34 +KPX B O -22 +KPX B OE -20 +KPX B Oacute -22 +KPX B Ocircumflex -22 +KPX B Odieresis -22 +KPX B Ograve -22 +KPX B Oslash -23 +KPX B V -46 +KPX B W -46 +KPX B Y -50 +KPX C A -24 +KPX C AE -31 +KPX C Aacute -24 +KPX C Adieresis -24 +KPX C Aring -24 +KPX C H -26 +KPX C K -28 +KPX C O -25 +KPX C Oacute -25 +KPX C Odieresis -25 +KPX Ccedilla A -30 +KPX D A -54 +KPX D Aacute -54 +KPX D Acircumflex -54 +KPX D Adieresis -54 +KPX D Agrave -54 +KPX D Aring -54 +KPX D Atilde -54 +KPX D J -67 +KPX D T -27 +KPX D V -60 +KPX D W -58 +KPX D X -64 +KPX D Y -64 +KPX F A -101 +KPX F Aacute -101 +KPX F Acircumflex -101 +KPX F Adieresis -101 +KPX F Agrave -101 +KPX F Aring -101 +KPX F Atilde -101 +KPX F J -88 +KPX F O -48 +KPX F Odieresis -48 +KPX F a -75 +KPX F aacute -75 +KPX F adieresis -48 +KPX F ae -83 +KPX F aring -75 +KPX F comma -96 +KPX F e -86 +KPX F eacute -86 +KPX F hyphen -54 +KPX F i -29 +KPX F j -34 +KPX F o -81 +KPX F oacute -82 +KPX F odieresis -45 +KPX F oe -86 +KPX F oslash -79 +KPX F period -98 +KPX F r -38 +KPX F u -42 +KPX G A -14 +KPX G AE -20 +KPX G Aacute -14 +KPX G Acircumflex -14 +KPX G Adieresis -14 +KPX G Agrave -14 +KPX G Aring -14 +KPX G Atilde -14 +KPX G T -42 +KPX G V -27 +KPX G W -27 +KPX G Y -31 +KPX J A -39 +KPX J AE -42 +KPX J Adieresis -39 +KPX J Aring -39 +KPX K C -51 +KPX K G -46 +KPX K O -43 +KPX K OE -42 +KPX K Oacute -43 +KPX K Odieresis -43 +KPX K S -1 +KPX K T 0 +KPX K a 3 +KPX K adieresis 3 +KPX K ae -4 +KPX K aring 3 +KPX K e -16 +KPX K hyphen -30 +KPX K o -13 +KPX K oacute -13 +KPX K odieresis -13 +KPX K u -8 +KPX K udieresis -8 +KPX K y -68 +KPX L A 28 +KPX L AE 25 +KPX L Aacute 28 +KPX L Adieresis 28 +KPX L Aring 28 +KPX L C 0 +KPX L Ccedilla 0 +KPX L G 4 +KPX L O 4 +KPX L Oacute 4 +KPX L Ocircumflex 4 +KPX L Odieresis 4 +KPX L Ograve 4 +KPX L Otilde 4 +KPX L S 1 +KPX L T -30 +KPX L U -17 +KPX L Udieresis -17 +KPX L V -77 +KPX L W -74 +KPX L Y -41 +KPX L hyphen 41 +KPX L quotedblright -45 +KPX L quoteright -67 +KPX L u 5 +KPX L udieresis 5 +KPX L y -23 +KPX N A -39 +KPX N AE -42 +KPX N Aacute -39 +KPX N Adieresis -39 +KPX N Aring -39 +KPX N C -32 +KPX N Ccedilla -30 +KPX N G -26 +KPX N O -32 +KPX N Oacute -32 +KPX N Odieresis -32 +KPX N a -25 +KPX N aacute -27 +KPX N adieresis -27 +KPX N ae -34 +KPX N aring -27 +KPX N comma -24 +KPX N e -37 +KPX N eacute -38 +KPX N o -32 +KPX N oacute -34 +KPX N odieresis -34 +KPX N oslash -32 +KPX N period -26 +KPX N u -33 +KPX N udieresis -33 +KPX O A -57 +KPX O AE -67 +KPX O Aacute -57 +KPX O Adieresis -57 +KPX O Aring -57 +KPX O T -18 +KPX O V -52 +KPX O W -52 +KPX O X -63 +KPX O Y -56 +KPX Oacute A -57 +KPX Oacute T -18 +KPX Oacute V -52 +KPX Oacute W -52 +KPX Oacute Y -56 +KPX Ocircumflex T -18 +KPX Ocircumflex V -52 +KPX Ocircumflex Y -56 +KPX Odieresis A -57 +KPX Odieresis T -18 +KPX Odieresis V -52 +KPX Odieresis W -52 +KPX Odieresis X -63 +KPX Odieresis Y -56 +KPX Ograve T -18 +KPX Ograve V -52 +KPX Ograve Y -56 +KPX Oslash A -57 +KPX Otilde T -18 +KPX Otilde V -52 +KPX Otilde Y -56 +KPX P A -89 +KPX P AE -104 +KPX P Aacute -89 +KPX P Adieresis -89 +KPX P Aring -89 +KPX P J -105 +KPX P a -50 +KPX P aacute -50 +KPX P adieresis -38 +KPX P ae -58 +KPX P aring -50 +KPX P comma -107 +KPX P e -57 +KPX P eacute -57 +KPX P hyphen -54 +KPX P o -52 +KPX P oacute -52 +KPX P odieresis -35 +KPX P oe -57 +KPX P oslash -47 +KPX P period -109 +KPX R C -33 +KPX R Ccedilla -32 +KPX R G -28 +KPX R O -34 +KPX R OE -32 +KPX R Oacute -34 +KPX R Odieresis -34 +KPX R T -24 +KPX R U -44 +KPX R Udieresis -44 +KPX R V -46 +KPX R W -46 +KPX R Y -40 +KPX R a -1 +KPX R aacute -1 +KPX R adieresis -1 +KPX R ae -9 +KPX R aring -1 +KPX R e -21 +KPX R eacute -21 +KPX R hyphen -30 +KPX R o -18 +KPX R oacute -18 +KPX R odieresis -18 +KPX R oe -23 +KPX R u -13 +KPX R uacute -13 +KPX R udieresis -13 +KPX R y -12 +KPX S A -11 +KPX S AE -17 +KPX S Aacute -11 +KPX S Adieresis -11 +KPX S Aring -11 +KPX S T -34 +KPX S V -20 +KPX S W -20 +KPX S Y -24 +KPX S t -6 +KPX T A -52 +KPX T AE -54 +KPX T Aacute -52 +KPX T Acircumflex -52 +KPX T Adieresis -52 +KPX T Agrave -52 +KPX T Aring -52 +KPX T Atilde -52 +KPX T C -15 +KPX T G -9 +KPX T J -63 +KPX T O -22 +KPX T OE -18 +KPX T Oacute -22 +KPX T Ocircumflex -22 +KPX T Odieresis -22 +KPX T Ograve -22 +KPX T Oslash -22 +KPX T Otilde -22 +KPX T S -16 +KPX T V 15 +KPX T W 15 +KPX T Y 11 +KPX T a -83 +KPX T ae -91 +KPX T c -89 +KPX T colon -98 +KPX T comma -77 +KPX T e -94 +KPX T g -95 +KPX T guillemotleft -110 +KPX T guilsinglleft -120 +KPX T hyphen -74 +KPX T i -19 +KPX T j -27 +KPX T o -90 +KPX T oslash -90 +KPX T period -79 +KPX T r -76 +KPX T s -78 +KPX T semicolon -98 +KPX T u -91 +KPX T v -89 +KPX T w -89 +KPX T y -86 +KPX U A -65 +KPX U AE -71 +KPX U Aacute -65 +KPX U Acircumflex -65 +KPX U Adieresis -65 +KPX U Aring -65 +KPX U Atilde -65 +KPX U comma -40 +KPX U m -35 +KPX U n -39 +KPX U p -30 +KPX U period -41 +KPX U r -32 +KPX Uacute A -65 +KPX Uacute comma -40 +KPX Uacute m -35 +KPX Uacute n -39 +KPX Uacute p -30 +KPX Uacute period -41 +KPX Uacute r -32 +KPX Ucircumflex A -65 +KPX Udieresis A -65 +KPX Udieresis b 1 +KPX Udieresis comma -40 +KPX Udieresis m -35 +KPX Udieresis n -39 +KPX Udieresis p -30 +KPX Udieresis period -41 +KPX Udieresis r -32 +KPX Ugrave A -65 +KPX V A -100 +KPX V AE -111 +KPX V Aacute -100 +KPX V Acircumflex -100 +KPX V Adieresis -100 +KPX V Agrave -100 +KPX V Aring -100 +KPX V Atilde -100 +KPX V C -60 +KPX V G -53 +KPX V O -64 +KPX V Oacute -64 +KPX V Ocircumflex -64 +KPX V Odieresis -64 +KPX V Ograve -64 +KPX V Oslash -64 +KPX V Otilde -64 +KPX V S -25 +KPX V T 7 +KPX V a -76 +KPX V ae -84 +KPX V colon -96 +KPX V comma -96 +KPX V e -87 +KPX V g -83 +KPX V guillemotleft -99 +KPX V guilsinglleft -109 +KPX V hyphen -62 +KPX V i -12 +KPX V o -83 +KPX V oslash -81 +KPX V period -97 +KPX V r -44 +KPX V semicolon -96 +KPX V u -47 +KPX V y -34 +KPX W A -83 +KPX W AE -87 +KPX W Aacute -83 +KPX W Acircumflex -83 +KPX W Adieresis -83 +KPX W Agrave -83 +KPX W Aring -83 +KPX W Atilde -83 +KPX W C -46 +KPX W G -41 +KPX W O -47 +KPX W Oacute -47 +KPX W Ocircumflex -47 +KPX W Odieresis -47 +KPX W Ograve -47 +KPX W Oslash -48 +KPX W Otilde -47 +KPX W S -24 +KPX W T 8 +KPX W a -51 +KPX W ae -60 +KPX W colon -78 +KPX W comma -62 +KPX W e -62 +KPX W g -63 +KPX W guillemotleft -74 +KPX W guilsinglleft -84 +KPX W hyphen -37 +KPX W i -11 +KPX W o -58 +KPX W oslash -57 +KPX W period -64 +KPX W r -34 +KPX W semicolon -79 +KPX W u -38 +KPX W y -25 +KPX X C -58 +KPX X O -56 +KPX X Odieresis -56 +KPX X Q -58 +KPX X a -9 +KPX X e -29 +KPX X hyphen -46 +KPX X o -26 +KPX X u -21 +KPX X y -81 +KPX Y A -45 +KPX Y AE -47 +KPX Y Aacute -45 +KPX Y Acircumflex -45 +KPX Y Adieresis -45 +KPX Y Agrave -45 +KPX Y Aring -45 +KPX Y Atilde -45 +KPX Y C -59 +KPX Y G -54 +KPX Y O -61 +KPX Y Oacute -61 +KPX Y Ocircumflex -61 +KPX Y Odieresis -61 +KPX Y Ograve -61 +KPX Y Oslash -61 +KPX Y Otilde -61 +KPX Y S -25 +KPX Y T 7 +KPX Y a -69 +KPX Y ae -77 +KPX Y colon -91 +KPX Y comma -67 +KPX Y e -80 +KPX Y g -81 +KPX Y guillemotleft -97 +KPX Y guilsinglleft -107 +KPX Y hyphen -63 +KPX Y i -12 +KPX Y o -76 +KPX Y oslash -75 +KPX Y p -54 +KPX Y period -69 +KPX Y semicolon -91 +KPX Y u -59 +KPX Y v -54 +KPX Z v -29 +KPX Z y -39 +KPX a j -2 +KPX a quoteright -22 +KPX a v -5 +KPX a w -5 +KPX a y -3 +KPX aacute v -5 +KPX aacute w -5 +KPX aacute y -3 +KPX adieresis v -5 +KPX adieresis w -5 +KPX adieresis y -3 +KPX ae v -5 +KPX ae w -5 +KPX ae y -8 +KPX agrave v -5 +KPX agrave w -5 +KPX agrave y -3 +KPX aring v -5 +KPX aring w -5 +KPX aring y -3 +KPX b v -12 +KPX b w -12 +KPX b y -17 +KPX c h -20 +KPX c k -16 +KPX comma one -26 +KPX comma quotedblright -1 +KPX comma quoteright -23 +KPX e quoteright -12 +KPX e t -3 +KPX e v -3 +KPX e w -3 +KPX e x -15 +KPX e y -6 +KPX eacute v -3 +KPX eacute w -3 +KPX eacute y -6 +KPX ecircumflex v -3 +KPX ecircumflex w -3 +KPX ecircumflex y -6 +KPX eight four -4 +KPX eight one -52 +KPX eight seven -13 +KPX f a -23 +KPX f aacute -24 +KPX f adieresis 17 +KPX f ae -32 +KPX f aring -20 +KPX f e -35 +KPX f eacute -36 +KPX f f 2 +KPX f i 20 +KPX f j 12 +KPX f l 43 +KPX f o -30 +KPX f oacute -31 +KPX f odieresis 20 +KPX f oe -35 +KPX f oslash -29 +KPX f quoteright 12 +KPX f s -14 +KPX f t 9 +KPX five four -13 +KPX five one -56 +KPX five seven -37 +KPX four four 1 +KPX four one -50 +KPX four seven -21 +KPX g a -25 +KPX g adieresis -25 +KPX g ae -34 +KPX g aring -25 +KPX g e -32 +KPX g eacute -32 +KPX g l -21 +KPX g oacute -27 +KPX g odieresis -27 +KPX g r 3 +KPX guillemotright A -30 +KPX guillemotright AE -39 +KPX guillemotright Aacute -30 +KPX guillemotright Adieresis -30 +KPX guillemotright Aring -30 +KPX guillemotright T -76 +KPX guillemotright V -79 +KPX guillemotright W -75 +KPX guillemotright Y -83 +KPX guilsinglright A -40 +KPX guilsinglright AE -49 +KPX guilsinglright Aacute -40 +KPX guilsinglright Adieresis -40 +KPX guilsinglright Aring -40 +KPX guilsinglright T -86 +KPX guilsinglright V -89 +KPX guilsinglright W -85 +KPX guilsinglright Y -93 +KPX h quoteright -32 +KPX h y -20 +KPX hyphen A -13 +KPX hyphen AE -22 +KPX hyphen Aacute -13 +KPX hyphen Adieresis -13 +KPX hyphen Aring -13 +KPX hyphen T -59 +KPX hyphen V -62 +KPX hyphen W -59 +KPX hyphen Y -69 +KPX i T -20 +KPX i j -5 +KPX k a 10 +KPX k aacute 10 +KPX k adieresis 10 +KPX k ae 2 +KPX k aring 10 +KPX k comma 19 +KPX k e -2 +KPX k eacute -2 +KPX k g -14 +KPX k hyphen 1 +KPX k o 1 +KPX k oacute 1 +KPX k odieresis 1 +KPX k period 17 +KPX k s 1 +KPX k u 2 +KPX k udieresis 2 +KPX l v -12 +KPX l y -8 +KPX m p -1 +KPX m v -16 +KPX m w -16 +KPX m y -16 +KPX n T -59 +KPX n p -4 +KPX n quoteright -32 +KPX n v -20 +KPX n w -20 +KPX n y -20 +KPX nine four -18 +KPX nine one -67 +KPX nine seven -12 +KPX o T -75 +KPX o quoteright -22 +KPX o t -2 +KPX o v -21 +KPX o w -21 +KPX o x -26 +KPX o y -29 +KPX oacute v -21 +KPX oacute w -21 +KPX oacute y -29 +KPX ocircumflex t -4 +KPX odieresis t -4 +KPX odieresis v -21 +KPX odieresis w -21 +KPX odieresis x -26 +KPX odieresis y -29 +KPX ograve v -21 +KPX ograve w -21 +KPX ograve y -29 +KPX one comma -38 +KPX one eight -56 +KPX one five -45 +KPX one four -75 +KPX one nine -40 +KPX one one -48 +KPX one period -39 +KPX one seven -65 +KPX one six -62 +KPX one three -43 +KPX one two -32 +KPX one zero -48 +KPX p t -2 +KPX p y -13 +KPX period one -32 +KPX period quotedblright -5 +KPX period quoteright -27 +KPX q c -6 +KPX q u -5 +KPX quotedblbase A 24 +KPX quotedblbase AE 19 +KPX quotedblbase T -37 +KPX quotedblbase V -79 +KPX quotedblbase W -74 +KPX quotedblbase Y -48 +KPX quotedblleft A -76 +KPX quotedblleft AE -98 +KPX quotedblleft Aacute -76 +KPX quotedblleft Adieresis -76 +KPX quotedblleft Aring -76 +KPX quotedblleft T -11 +KPX quotedblleft V 3 +KPX quotedblleft W 3 +KPX quotedblleft Y 0 +KPX quotedblright A -72 +KPX quotedblright AE -94 +KPX quotedblright Aacute -72 +KPX quotedblright Adieresis -72 +KPX quotedblright Aring -72 +KPX quotedblright T -1 +KPX quotedblright V 6 +KPX quotedblright W 6 +KPX quotedblright Y 2 +KPX quoteleft A -83 +KPX quoteleft AE -105 +KPX quoteleft Aacute -83 +KPX quoteleft Adieresis -83 +KPX quoteleft Aring -83 +KPX quoteleft T -18 +KPX quoteleft V -3 +KPX quoteleft W -3 +KPX quoteleft Y -7 +KPX quoteright A -94 +KPX quoteright AE -116 +KPX quoteright Aacute -94 +KPX quoteright Adieresis -94 +KPX quoteright Aring -94 +KPX quoteright comma -57 +KPX quoteright d -50 +KPX quoteright o -50 +KPX quoteright period -59 +KPX quoteright r -26 +KPX quoteright s -26 +KPX quoteright t -19 +KPX quoteright v -23 +KPX quoteright w -23 +KPX quoteright y -18 +KPX r a -13 +KPX r aacute -13 +KPX r acircumflex -13 +KPX r adieresis -13 +KPX r ae -22 +KPX r agrave -13 +KPX r aring -13 +KPX r c -15 +KPX r ccedilla -8 +KPX r colon -30 +KPX r comma -67 +KPX r d -14 +KPX r e -20 +KPX r eacute -20 +KPX r ecircumflex -20 +KPX r egrave -20 +KPX r f 8 +KPX r g -4 +KPX r h -16 +KPX r hyphen -13 +KPX r i 17 +KPX r j 12 +KPX r k -11 +KPX r l -12 +KPX r m 10 +KPX r n 6 +KPX r o -15 +KPX r oacute -15 +KPX r ocircumflex -15 +KPX r odieresis -15 +KPX r oe -19 +KPX r ograve -15 +KPX r oslash -12 +KPX r p 16 +KPX r period -69 +KPX r q -19 +KPX r quoteright 0 +KPX r r 14 +KPX r s 1 +KPX r semicolon -30 +KPX r t 12 +KPX r u 11 +KPX r v 20 +KPX r w 20 +KPX r x 7 +KPX r y 20 +KPX r z 10 +KPX s quoteright -22 +KPX s t -6 +KPX seven colon -90 +KPX seven comma -80 +KPX seven eight -46 +KPX seven five -60 +KPX seven four -79 +KPX seven one -43 +KPX seven period -81 +KPX seven seven -27 +KPX seven six -60 +KPX seven three -42 +KPX seven two -30 +KPX six four 2 +KPX six one -52 +KPX six seven -32 +KPX t S -11 +KPX t a 10 +KPX t aacute 10 +KPX t adieresis 10 +KPX t ae 2 +KPX t aring 10 +KPX t colon -22 +KPX t e -2 +KPX t eacute -2 +KPX t h -5 +KPX t o 1 +KPX t oacute 1 +KPX t odieresis 1 +KPX t quoteright -19 +KPX t semicolon -23 +KPX three four -15 +KPX three one -67 +KPX three seven -27 +KPX two four -8 +KPX two one -48 +KPX two seven -27 +KPX u quoteright -33 +KPX v a -20 +KPX v aacute -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v ae -28 +KPX v agrave -20 +KPX v aring -20 +KPX v atilde -20 +KPX v c -24 +KPX v colon -51 +KPX v comma -51 +KPX v e -28 +KPX v eacute -28 +KPX v ecircumflex -28 +KPX v egrave -28 +KPX v g -20 +KPX v hyphen -1 +KPX v l -24 +KPX v o -24 +KPX v oacute -24 +KPX v odieresis -24 +KPX v ograve -24 +KPX v oslash -22 +KPX v period -51 +KPX v s -19 +KPX v semicolon -51 +KPX w a -24 +KPX w aacute -24 +KPX w acircumflex -24 +KPX w adieresis -24 +KPX w ae -32 +KPX w agrave -24 +KPX w aring -24 +KPX w atilde -24 +KPX w c -30 +KPX w colon -56 +KPX w comma -53 +KPX w e -34 +KPX w eacute -34 +KPX w ecircumflex -34 +KPX w egrave -34 +KPX w g -26 +KPX w hyphen -7 +KPX w l -28 +KPX w o -30 +KPX w oacute -30 +KPX w odieresis -30 +KPX w ograve -30 +KPX w oslash -28 +KPX w period -53 +KPX w s -24 +KPX w semicolon -56 +KPX x a -1 +KPX x c -10 +KPX x e -14 +KPX x eacute -14 +KPX x o -11 +KPX x q -12 +KPX y a -11 +KPX y aacute -12 +KPX y acircumflex -12 +KPX y adieresis -12 +KPX y ae -19 +KPX y agrave -12 +KPX y aring -12 +KPX y atilde -12 +KPX y c -17 +KPX y colon -43 +KPX y comma -25 +KPX y e -22 +KPX y eacute -23 +KPX y ecircumflex -23 +KPX y egrave -23 +KPX y g -23 +KPX y hyphen 2 +KPX y l -16 +KPX y o -17 +KPX y oacute -19 +KPX y odieresis -19 +KPX y ograve -19 +KPX y oslash -17 +KPX y period -26 +KPX y s -13 +KPX y semicolon -44 +KPX zero four -1 +KPX zero one -50 +KPX zero seven -12 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n021024l.pfb b/pdf2swf/fonts/n021024l.pfb new file mode 100644 index 00000000..2d19d942 Binary files /dev/null and b/pdf2swf/fonts/n021024l.pfb differ diff --git a/pdf2swf/fonts/n022003l.afm b/pdf2swf/fonts/n022003l.afm new file mode 100644 index 00000000..2ebe8d24 --- /dev/null +++ b/pdf2swf/fonts/n022003l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusMonL-Regu +FullName Nimbus Mono L Regular +FamilyName Nimbus Mono L +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -12 -237 650 811 +CapHeight 563 +XHeight 417 +Descender -186 +Ascender 604 +StartCharMetrics 316 +C 32 ; WX 600 ; N space ; B 295 0 295 0 ; +C 33 ; WX 600 ; N exclam ; B 240 -15 360 618 ; +C 34 ; WX 600 ; N quotedbl ; B 146 315 454 604 ; +C 35 ; WX 600 ; N numbersign ; B 92 -62 508 647 ; +C 36 ; WX 600 ; N dollar ; B 113 -92 487 655 ; +C 37 ; WX 600 ; N percent ; B 87 -12 513 611 ; +C 38 ; WX 600 ; N ampersand ; B 105 -16 478 519 ; +C 39 ; WX 600 ; N quoteright ; B 135 314 340 604 ; +C 40 ; WX 600 ; N parenleft ; B 294 -124 458 604 ; +C 41 ; WX 600 ; N parenright ; B 147 -124 311 604 ; +C 42 ; WX 600 ; N asterisk ; B 113 250 487 604 ; +C 43 ; WX 600 ; N plus ; B 72 32 528 530 ; +C 44 ; WX 600 ; N comma ; B 135 -145 340 145 ; +C 45 ; WX 600 ; N hyphen ; B 72 258 528 299 ; +C 46 ; WX 600 ; N period ; B 226 -15 374 116 ; +C 47 ; WX 600 ; N slash ; B 113 -81 487 668 ; +C 48 ; WX 600 ; N zero ; B 113 -15 487 618 ; +C 49 ; WX 600 ; N one ; B 113 0 487 612 ; +C 50 ; WX 600 ; N two ; B 84 0 478 618 ; +C 51 ; WX 600 ; N three ; B 96 -15 499 618 ; +C 52 ; WX 600 ; N four ; B 105 0 478 604 ; +C 53 ; WX 600 ; N five ; B 96 -15 499 604 ; +C 54 ; WX 600 ; N six ; B 136 -15 510 618 ; +C 55 ; WX 600 ; N seven ; B 105 -1 478 604 ; +C 56 ; WX 600 ; N eight ; B 113 -15 487 618 ; +C 57 ; WX 600 ; N nine ; B 136 -15 510 618 ; +C 58 ; WX 600 ; N colon ; B 226 -15 374 417 ; +C 59 ; WX 600 ; N semicolon ; B 139 -145 350 417 ; +C 60 ; WX 600 ; N less ; B 72 44 522 518 ; +C 61 ; WX 600 ; N equal ; B 51 190 549 375 ; +C 62 ; WX 600 ; N greater ; B 78 44 528 518 ; +C 63 ; WX 600 ; N question ; B 134 -15 487 577 ; +C 64 ; WX 600 ; N at ; B 105 -62 478 624 ; +C 65 ; WX 600 ; N A ; B 9 0 591 563 ; +C 66 ; WX 600 ; N B ; B 43 0 541 563 ; +C 67 ; WX 600 ; N C ; B 63 -16 534 576 ; +C 68 ; WX 600 ; N D ; B 43 0 520 563 ; +C 69 ; WX 600 ; N E ; B 43 0 520 563 ; +C 70 ; WX 600 ; N F ; B 43 0 520 563 ; +C 71 ; WX 600 ; N G ; B 63 -16 562 576 ; +C 72 ; WX 600 ; N H ; B 53 0 551 563 ; +C 73 ; WX 600 ; N I ; B 113 0 487 563 ; +C 74 ; WX 600 ; N J ; B 84 -16 583 563 ; +C 75 ; WX 600 ; N K ; B 43 0 572 563 ; +C 76 ; WX 600 ; N L ; B 63 0 541 563 ; +C 77 ; WX 600 ; N M ; B 11 0 593 563 ; +C 78 ; WX 600 ; N N ; B 22 0 562 563 ; +C 79 ; WX 600 ; N O ; B 51 -16 549 576 ; +C 80 ; WX 600 ; N P ; B 43 0 499 563 ; +C 81 ; WX 600 ; N Q ; B 51 -115 549 576 ; +C 82 ; WX 600 ; N R ; B 43 0 589 563 ; +C 83 ; WX 600 ; N S ; B 92 -16 508 576 ; +C 84 ; WX 600 ; N T ; B 72 0 528 563 ; +C 85 ; WX 600 ; N U ; B 40 -16 560 563 ; +C 86 ; WX 600 ; N V ; B 9 0 591 563 ; +C 87 ; WX 600 ; N W ; B 20 0 580 563 ; +C 88 ; WX 600 ; N X ; B 40 0 560 563 ; +C 89 ; WX 600 ; N Y ; B 51 0 549 563 ; +C 90 ; WX 600 ; N Z ; B 103 0 497 563 ; +C 91 ; WX 600 ; N bracketleft ; B 280 -124 445 604 ; +C 92 ; WX 600 ; N backslash ; B 113 -81 487 668 ; +C 93 ; WX 600 ; N bracketright ; B 155 -124 320 604 ; +C 94 ; WX 600 ; N asciicircum ; B 113 354 487 615 ; +C 95 ; WX 600 ; N underscore ; B -12 -125 612 -75 ; +C 96 ; WX 600 ; N quoteleft ; B 260 343 465 604 ; +C 97 ; WX 600 ; N a ; B 72 -16 541 431 ; +C 98 ; WX 600 ; N b ; B 22 -16 541 604 ; +C 99 ; WX 600 ; N c ; B 84 -16 535 431 ; +C 100 ; WX 600 ; N d ; B 63 -16 583 604 ; +C 101 ; WX 600 ; N e ; B 63 -16 520 431 ; +C 102 ; WX 600 ; N f ; B 105 0 541 604 ; +C 103 ; WX 600 ; N g ; B 63 -186 562 431 ; +C 104 ; WX 600 ; N h ; B 43 0 551 604 ; +C 105 ; WX 600 ; N i ; B 92 0 508 624 ; +C 106 ; WX 600 ; N j ; B 147 -186 458 624 ; +C 107 ; WX 600 ; N k ; B 63 0 541 604 ; +C 108 ; WX 600 ; N l ; B 92 0 508 604 ; +C 109 ; WX 600 ; N m ; B 11 0 593 431 ; +C 110 ; WX 600 ; N n ; B 53 0 541 431 ; +C 111 ; WX 600 ; N o ; B 72 -16 528 431 ; +C 112 ; WX 600 ; N p ; B 22 -186 541 431 ; +C 113 ; WX 600 ; N q ; B 63 -186 583 431 ; +C 114 ; WX 600 ; N r ; B 84 0 541 427 ; +C 115 ; WX 600 ; N s ; B 103 -16 497 431 ; +C 116 ; WX 600 ; N t ; B 43 -16 499 563 ; +C 117 ; WX 600 ; N u ; B 43 -16 541 417 ; +C 118 ; WX 600 ; N v ; B 30 0 570 417 ; +C 119 ; WX 600 ; N w ; B 30 0 570 417 ; +C 120 ; WX 600 ; N x ; B 51 0 549 417 ; +C 121 ; WX 600 ; N y ; B 51 -186 549 417 ; +C 122 ; WX 600 ; N z ; B 115 0 489 417 ; +C 123 ; WX 600 ; N braceleft ; B 197 -124 403 604 ; +C 124 ; WX 600 ; N bar ; B 280 -124 320 604 ; +C 125 ; WX 600 ; N braceright ; B 197 -124 403 604 ; +C 126 ; WX 600 ; N asciitilde ; B 92 212 508 348 ; +C 161 ; WX 600 ; N exclamdown ; B 240 -216 360 417 ; +C 162 ; WX 600 ; N cent ; B 113 -13 469 630 ; +C 163 ; WX 600 ; N sterling ; B 63 0 520 578 ; +C 164 ; WX 600 ; N fraction ; B 50 138 549 470 ; +C 165 ; WX 600 ; N yen ; B 51 0 549 563 ; +C 166 ; WX 600 ; N florin ; B 87 -93 518 618 ; +C 167 ; WX 600 ; N section ; B 66 -62 534 603 ; +C 168 ; WX 600 ; N currency ; B 103 95 497 489 ; +C 169 ; WX 600 ; N quotesingle ; B 236 315 364 604 ; +C 170 ; WX 600 ; N quotedblleft ; B 93 343 507 604 ; +C 171 ; WX 600 ; N guillemotleft ; B 63 0 541 417 ; +C 172 ; WX 600 ; N guilsinglleft ; B 63 0 312 417 ; +C 173 ; WX 600 ; N guilsinglright ; B 293 0 541 417 ; +C 174 ; WX 600 ; N fi ; B 10 0 585 624 ; +C 175 ; WX 600 ; N fl ; B 10 0 587 604 ; +C 177 ; WX 600 ; N endash ; B 72 261 528 302 ; +C 178 ; WX 600 ; N dagger ; B 124 -63 476 604 ; +C 179 ; WX 600 ; N daggerdbl ; B 124 -62 476 604 ; +C 180 ; WX 600 ; N periodcentered ; B 226 217 374 348 ; +C 182 ; WX 600 ; N paragraph ; B 79 -62 525 604 ; +C 183 ; WX 600 ; N bullet ; B 202 141 398 337 ; +C 184 ; WX 600 ; N quotesinglbase ; B 135 -145 340 145 ; +C 185 ; WX 600 ; N quotedblbase ; B 93 -116 507 145 ; +C 186 ; WX 600 ; N quotedblright ; B 93 343 507 604 ; +C 187 ; WX 600 ; N guillemotright ; B 63 0 541 417 ; +C 188 ; WX 600 ; N ellipsis ; B 51 -15 549 84 ; +C 189 ; WX 600 ; N perthousand ; B 34 -9 564 614 ; +C 191 ; WX 600 ; N questiondown ; B 113 -175 466 417 ; +C 193 ; WX 600 ; N grave ; B 155 490 320 639 ; +C 194 ; WX 600 ; N acute ; B 280 490 445 639 ; +C 195 ; WX 600 ; N circumflex ; B 155 490 445 639 ; +C 196 ; WX 600 ; N tilde ; B 145 516 455 605 ; +C 197 ; WX 600 ; N macron ; B 155 536 445 576 ; +C 198 ; WX 600 ; N breve ; B 155 490 445 620 ; +C 199 ; WX 600 ; N dotaccent ; B 250 511 350 611 ; +C 200 ; WX 600 ; N dieresis ; B 140 511 461 611 ; +C 202 ; WX 600 ; N ring ; B 207 480 393 661 ; +C 203 ; WX 600 ; N cedilla ; B 210 -173 377 0 ; +C 205 ; WX 600 ; N hungarumlaut ; B 155 490 445 633 ; +C 206 ; WX 600 ; N ogonek ; B 280 -155 433 0 ; +C 207 ; WX 600 ; N caron ; B 155 490 445 639 ; +C 208 ; WX 600 ; N emdash ; B 1 261 599 302 ; +C 225 ; WX 600 ; N AE ; B 10 0 590 563 ; +C 227 ; WX 600 ; N ordfeminine ; B 155 279 447 574 ; +C 232 ; WX 600 ; N Lslash ; B 43 0 541 563 ; +C 233 ; WX 600 ; N Oslash ; B 40 -43 560 605 ; +C 234 ; WX 600 ; N OE ; B 10 0 590 563 ; +C 235 ; WX 600 ; N ordmasculine ; B 154 284 448 577 ; +C 241 ; WX 600 ; N ae ; B 12 -16 578 431 ; +C 245 ; WX 600 ; N dotlessi ; B 92 0 508 417 ; +C 248 ; WX 600 ; N lslash ; B 92 0 508 604 ; +C 249 ; WX 600 ; N oslash ; B 53 -43 543 458 ; +C 250 ; WX 600 ; N oe ; B 12 -16 578 431 ; +C 251 ; WX 600 ; N germandbls ; B 43 -16 499 604 ; +C -1 ; WX 600 ; N Udieresis ; B 40 -16 560 761 ; +C -1 ; WX 600 ; N Uacute ; B 40 -16 560 789 ; +C -1 ; WX 600 ; N Scedilla ; B 92 -173 508 576 ; +C -1 ; WX 600 ; N Tcaron ; B 72 0 528 789 ; +C -1 ; WX 600 ; N Scaron ; B 92 -16 508 789 ; +C -1 ; WX 600 ; N Rcaron ; B 43 0 589 789 ; +C -1 ; WX 600 ; N Racute ; B 43 0 589 789 ; +C -1 ; WX 600 ; N Sacute ; B 92 -16 508 789 ; +C -1 ; WX 600 ; N Otilde ; B 51 -16 549 755 ; +C -1 ; WX 600 ; N ucircumflex ; B 43 -16 541 639 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 51 -16 549 783 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 40 -16 560 783 ; +C -1 ; WX 600 ; N Yacute ; B 51 0 549 789 ; +C -1 ; WX 600 ; N Eth ; B 0 0 520 563 ; +C -1 ; WX 600 ; N Dcroat ; B 0 0 520 563 ; +C -1 ; WX 600 ; N Zacute ; B 103 0 497 789 ; +C -1 ; WX 600 ; N Uring ; B 40 -16 560 811 ; +C -1 ; WX 600 ; N gbreve ; B 63 -186 562 620 ; +C -1 ; WX 600 ; N eogonek ; B 63 -155 520 431 ; +C -1 ; WX 600 ; N edotaccent ; B 63 -16 520 611 ; +C -1 ; WX 600 ; N ecaron ; B 63 -16 520 639 ; +C -1 ; WX 600 ; N Ugrave ; B 40 -16 560 789 ; +C -1 ; WX 600 ; N Thorn ; B 43 0 499 563 ; +C -1 ; WX 600 ; N eacute ; B 63 -16 520 639 ; +C -1 ; WX 600 ; N edieresis ; B 63 -16 520 611 ; +C -1 ; WX 600 ; N dcaron ; B 63 -16 650 616 ; +C -1 ; WX 600 ; N ccedilla ; B 84 -173 535 431 ; +C -1 ; WX 600 ; N ccaron ; B 84 -16 535 639 ; +C -1 ; WX 600 ; N cacute ; B 84 -16 535 639 ; +C -1 ; WX 600 ; N aogonek ; B 72 -155 556 431 ; +C -1 ; WX 600 ; N aring ; B 72 -16 541 661 ; +C -1 ; WX 600 ; N atilde ; B 72 -16 541 605 ; +C -1 ; WX 600 ; N abreve ; B 72 -16 541 620 ; +C -1 ; WX 600 ; N egrave ; B 63 -16 520 639 ; +C -1 ; WX 600 ; N agrave ; B 72 -16 541 639 ; +C -1 ; WX 600 ; N aacute ; B 72 -16 541 639 ; +C -1 ; WX 600 ; N adieresis ; B 72 -16 541 611 ; +C -1 ; WX 600 ; N Uogonek ; B 40 -155 560 563 ; +C -1 ; WX 600 ; N ugrave ; B 43 -16 541 639 ; +C -1 ; WX 600 ; N uacute ; B 43 -16 541 639 ; +C -1 ; WX 600 ; N udieresis ; B 43 -16 541 611 ; +C -1 ; WX 600 ; N tcaron ; B 43 -16 508 616 ; +C -1 ; WX 600 ; N scommaaccent ; B 103 -237 497 431 ; +C -1 ; WX 600 ; N Zcaron ; B 103 0 497 789 ; +C -1 ; WX 600 ; N ecircumflex ; B 63 -16 520 639 ; +C -1 ; WX 600 ; N Ucircumflex ; B 40 -16 560 789 ; +C -1 ; WX 600 ; N acircumflex ; B 72 -16 541 639 ; +C -1 ; WX 600 ; N Zdotaccent ; B 103 0 497 761 ; +C -1 ; WX 600 ; N scaron ; B 103 -16 497 639 ; +C -1 ; WX 600 ; N Amacron ; B 9 0 591 726 ; +C -1 ; WX 600 ; N sacute ; B 103 -16 497 639 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 72 -237 528 563 ; +C -1 ; WX 600 ; N Ydieresis ; B 51 0 549 761 ; +C -1 ; WX 600 ; N thorn ; B 22 -186 541 590 ; +C -1 ; WX 600 ; N Emacron ; B 43 0 520 726 ; +C -1 ; WX 600 ; N Ograve ; B 51 -16 549 789 ; +C -1 ; WX 600 ; N Oacute ; B 51 -16 549 789 ; +C -1 ; WX 600 ; N Odieresis ; B 51 -16 549 761 ; +C -1 ; WX 600 ; N Ntilde ; B 22 0 562 755 ; +C -1 ; WX 600 ; N Ncaron ; B 22 0 562 789 ; +C -1 ; WX 600 ; N Nacute ; B 22 0 562 789 ; +C -1 ; WX 600 ; N Lcaron ; B 63 0 541 566 ; +C -1 ; WX 600 ; N Lacute ; B 63 0 541 789 ; +C -1 ; WX 600 ; N Idotaccent ; B 113 0 487 761 ; +C -1 ; WX 600 ; N racute ; B 84 0 541 639 ; +C -1 ; WX 600 ; N Icircumflex ; B 113 0 487 789 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 72 -16 528 633 ; +C -1 ; WX 600 ; N otilde ; B 72 -16 528 605 ; +C -1 ; WX 600 ; N Euro ; B 11 -16 534 576 ; +C -1 ; WX 600 ; N ocircumflex ; B 72 -16 528 639 ; +C -1 ; WX 600 ; N onesuperior ; B 191 259 410 612 ; +C -1 ; WX 600 ; N twosuperior ; B 175 259 405 612 ; +C -1 ; WX 600 ; N threesuperior ; B 181 251 416 612 ; +C -1 ; WX 600 ; N Igrave ; B 113 0 487 789 ; +C -1 ; WX 600 ; N Iacute ; B 113 0 487 789 ; +C -1 ; WX 600 ; N Imacron ; B 113 0 487 726 ; +C -1 ; WX 600 ; N Iogonek ; B 113 -155 500 563 ; +C -1 ; WX 600 ; N Idieresis ; B 113 0 487 761 ; +C -1 ; WX 600 ; N Gbreve ; B 63 -16 562 770 ; +C -1 ; WX 600 ; N Umacron ; B 40 -16 560 726 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 43 -237 572 563 ; +C -1 ; WX 600 ; N ograve ; B 72 -16 528 639 ; +C -1 ; WX 600 ; N Scommaaccent ; B 92 -237 508 576 ; +C -1 ; WX 600 ; N Eogonek ; B 43 -155 549 563 ; +C -1 ; WX 600 ; N oacute ; B 72 -16 528 639 ; +C -1 ; WX 600 ; N Edotaccent ; B 43 0 520 761 ; +C -1 ; WX 600 ; N iogonek ; B 92 -155 520 624 ; +C -1 ; WX 600 ; N gcommaaccent ; B 63 -186 562 666 ; +C -1 ; WX 600 ; N odieresis ; B 72 -16 528 611 ; +C -1 ; WX 600 ; N ntilde ; B 53 0 541 605 ; +C -1 ; WX 600 ; N ncaron ; B 53 0 541 639 ; +C -1 ; WX 600 ; N Ecaron ; B 43 0 520 789 ; +C -1 ; WX 600 ; N Ecircumflex ; B 43 0 520 789 ; +C -1 ; WX 600 ; N scedilla ; B 103 -173 497 431 ; +C -1 ; WX 600 ; N rcaron ; B 84 0 541 639 ; +C -1 ; WX 600 ; N Egrave ; B 43 0 520 789 ; +C -1 ; WX 600 ; N Eacute ; B 43 0 520 789 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 63 -237 562 576 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 43 -237 589 563 ; +C -1 ; WX 600 ; N Edieresis ; B 43 0 520 761 ; +C -1 ; WX 600 ; N nacute ; B 53 0 541 639 ; +C -1 ; WX 600 ; N uogonek ; B 43 -155 556 417 ; +C -1 ; WX 600 ; N umacron ; B 43 -16 541 576 ; +C -1 ; WX 600 ; N Dcaron ; B 43 0 520 789 ; +C -1 ; WX 600 ; N lcaron ; B 92 0 508 616 ; +C -1 ; WX 600 ; N Ccaron ; B 63 -16 534 789 ; +C -1 ; WX 600 ; N Cacute ; B 63 -16 534 789 ; +C -1 ; WX 600 ; N Ccedilla ; B 63 -173 534 576 ; +C -1 ; WX 600 ; N degree ; B 155 346 445 636 ; +C -1 ; WX 600 ; N Aogonek ; B 9 -155 600 563 ; +C -1 ; WX 600 ; N minus ; B 72 261 528 302 ; +C -1 ; WX 600 ; N multiply ; B 118 100 482 464 ; +C -1 ; WX 600 ; N divide ; B 72 25 528 540 ; +C -1 ; WX 600 ; N Aring ; B 9 0 591 811 ; +C -1 ; WX 600 ; N trademark ; B 4 243 598 563 ; +C -1 ; WX 600 ; N rcommaaccent ; B 84 -237 541 427 ; +C -1 ; WX 600 ; N lacute ; B 92 0 508 789 ; +C -1 ; WX 600 ; N omacron ; B 72 -16 528 576 ; +C -1 ; WX 600 ; N Atilde ; B 9 0 591 755 ; +C -1 ; WX 600 ; N icircumflex ; B 92 0 508 639 ; +C -1 ; WX 600 ; N igrave ; B 92 0 508 639 ; +C -1 ; WX 600 ; N ncommaaccent ; B 53 -237 541 431 ; +C -1 ; WX 600 ; N lcommaaccent ; B 92 -237 508 604 ; +C -1 ; WX 600 ; N plusminus ; B 72 0 528 529 ; +C -1 ; WX 600 ; N onehalf ; B 23 0 573 612 ; +C -1 ; WX 600 ; N onequarter ; B 16 0 580 612 ; +C -1 ; WX 600 ; N threequarters ; B 6 0 580 612 ; +C -1 ; WX 600 ; N iacute ; B 92 0 508 639 ; +C -1 ; WX 600 ; N Abreve ; B 9 0 591 770 ; +C -1 ; WX 600 ; N kcommaaccent ; B 63 -237 541 604 ; +C -1 ; WX 600 ; N Omacron ; B 51 -16 549 726 ; +C -1 ; WX 600 ; N imacron ; B 92 0 508 576 ; +C -1 ; WX 600 ; N emacron ; B 63 -16 520 576 ; +C -1 ; WX 600 ; N amacron ; B 72 -16 541 576 ; +C -1 ; WX 600 ; N tcommaaccent ; B 43 -237 499 563 ; +C -1 ; WX 600 ; N ydieresis ; B 51 -186 549 611 ; +C -1 ; WX 600 ; N zdotaccent ; B 115 0 489 611 ; +C -1 ; WX 600 ; N zcaron ; B 115 0 489 639 ; +C -1 ; WX 600 ; N zacute ; B 115 0 489 639 ; +C -1 ; WX 600 ; N yacute ; B 51 -186 549 639 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 43 -16 541 633 ; +C -1 ; WX 600 ; N eth ; B 72 -17 528 620 ; +C -1 ; WX 600 ; N uring ; B 43 -16 541 661 ; +C -1 ; WX 600 ; N Ocircumflex ; B 51 -16 549 789 ; +C -1 ; WX 600 ; N commaaccent ; B 234 -237 367 -60 ; +C -1 ; WX 600 ; N copyright ; B 3 -15 596 578 ; +C -1 ; WX 600 ; N registered ; B 3 -15 596 578 ; +C -1 ; WX 600 ; N Acircumflex ; B 9 0 591 789 ; +C -1 ; WX 600 ; N idieresis ; B 92 0 508 611 ; +C -1 ; WX 600 ; N lozenge ; B 89 -11 511 575 ; +C -1 ; WX 600 ; N Delta ; B 43 0 557 563 ; +C -1 ; WX 600 ; N notequal ; B 51 94 549 464 ; +C -1 ; WX 600 ; N radical ; B 27 0 628 699 ; +C -1 ; WX 600 ; N Agrave ; B 9 0 591 789 ; +C -1 ; WX 600 ; N Aacute ; B 9 0 591 789 ; +C -1 ; WX 600 ; N lessequal ; B 53 0 525 535 ; +C -1 ; WX 600 ; N greaterequal ; B 59 0 531 535 ; +C -1 ; WX 600 ; N logicalnot ; B 72 168 528 438 ; +C -1 ; WX 600 ; N summation ; B 113 -127 507 563 ; +C -1 ; WX 600 ; N partialdiff ; B 71 -17 529 582 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 22 -237 562 563 ; +C -1 ; WX 600 ; N dcroat ; B 63 -16 583 604 ; +C -1 ; WX 600 ; N brokenbar ; B 280 -124 320 604 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 63 -237 541 563 ; +C -1 ; WX 600 ; N Adieresis ; B 9 0 591 761 ; +C -1 ; WX 600 ; N mu ; B 43 -200 541 417 ; +C -1 ; WX 600 ; N .notdef ; B 295 0 295 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -33 +KPX A Ccedilla -30 +KPX A G -27 +KPX A O -27 +KPX A Odieresis -27 +KPX A Q -28 +KPX A T -27 +KPX A U -32 +KPX A Uacute -32 +KPX A Ucircumflex -32 +KPX A Udieresis -32 +KPX A Ugrave -32 +KPX A V -74 +KPX A W -12 +KPX A Y -28 +KPX A a 8 +KPX A b 46 +KPX A c -19 +KPX A ccedilla -15 +KPX A comma -39 +KPX A d -10 +KPX A e -14 +KPX A g -23 +KPX A guillemotleft -49 +KPX A guilsinglleft -49 +KPX A hyphen -30 +KPX A o -16 +KPX A period -67 +KPX A q -24 +KPX A quotedblright -78 +KPX A quoteright -98 +KPX A t -26 +KPX A u -15 +KPX A v -55 +KPX A w -19 +KPX A y -60 +KPX Aacute C -33 +KPX Aacute G -27 +KPX Aacute O -27 +KPX Aacute Q -28 +KPX Aacute T -27 +KPX Aacute U -32 +KPX Aacute V -74 +KPX Aacute W -12 +KPX Aacute Y -28 +KPX Aacute a 8 +KPX Aacute b 46 +KPX Aacute c -19 +KPX Aacute comma -39 +KPX Aacute d -10 +KPX Aacute e -14 +KPX Aacute g -23 +KPX Aacute guillemotleft -49 +KPX Aacute guilsinglleft -49 +KPX Aacute hyphen -30 +KPX Aacute o -16 +KPX Aacute period -67 +KPX Aacute q -24 +KPX Aacute quoteright -98 +KPX Aacute t -26 +KPX Aacute u -15 +KPX Aacute v -55 +KPX Aacute w -19 +KPX Aacute y -60 +KPX Acircumflex C -33 +KPX Acircumflex G -27 +KPX Acircumflex O -27 +KPX Acircumflex Q -28 +KPX Acircumflex T -27 +KPX Acircumflex U -32 +KPX Acircumflex V -74 +KPX Acircumflex W -12 +KPX Acircumflex Y -28 +KPX Acircumflex comma -39 +KPX Acircumflex period -67 +KPX Adieresis C -33 +KPX Adieresis G -27 +KPX Adieresis O -27 +KPX Adieresis Q -28 +KPX Adieresis T -27 +KPX Adieresis U -32 +KPX Adieresis V -74 +KPX Adieresis W -12 +KPX Adieresis Y -28 +KPX Adieresis a 8 +KPX Adieresis b 46 +KPX Adieresis c -19 +KPX Adieresis comma -39 +KPX Adieresis d -10 +KPX Adieresis g -23 +KPX Adieresis guillemotleft -49 +KPX Adieresis guilsinglleft -49 +KPX Adieresis hyphen -30 +KPX Adieresis o -16 +KPX Adieresis period -67 +KPX Adieresis q -24 +KPX Adieresis quotedblright -78 +KPX Adieresis quoteright -98 +KPX Adieresis t -26 +KPX Adieresis u -15 +KPX Adieresis v -55 +KPX Adieresis w -19 +KPX Adieresis y -60 +KPX Agrave C -33 +KPX Agrave G -27 +KPX Agrave O -27 +KPX Agrave Q -28 +KPX Agrave T -27 +KPX Agrave U -32 +KPX Agrave V -74 +KPX Agrave W -12 +KPX Agrave Y -28 +KPX Agrave comma -39 +KPX Agrave period -67 +KPX Aring C -33 +KPX Aring G -27 +KPX Aring O -27 +KPX Aring Q -28 +KPX Aring T -27 +KPX Aring U -32 +KPX Aring V -74 +KPX Aring W -12 +KPX Aring Y -28 +KPX Aring a 8 +KPX Aring b 46 +KPX Aring c -19 +KPX Aring comma -39 +KPX Aring d -10 +KPX Aring e -14 +KPX Aring g -23 +KPX Aring guillemotleft -49 +KPX Aring guilsinglleft -49 +KPX Aring hyphen -30 +KPX Aring o -16 +KPX Aring period -67 +KPX Aring q -24 +KPX Aring quotedblright -78 +KPX Aring quoteright -98 +KPX Aring t -26 +KPX Aring u -15 +KPX Aring v -55 +KPX Aring w -19 +KPX Aring y -60 +KPX Atilde C -33 +KPX Atilde G -27 +KPX Atilde O -27 +KPX Atilde Q -28 +KPX Atilde T -27 +KPX Atilde U -32 +KPX Atilde V -74 +KPX Atilde W -12 +KPX Atilde Y -28 +KPX Atilde comma -39 +KPX Atilde period -67 +KPX B A -9 +KPX B AE -9 +KPX B Aacute -9 +KPX B Acircumflex -9 +KPX B Adieresis -9 +KPX B Aring -9 +KPX B Atilde -9 +KPX B O -10 +KPX B OE 10 +KPX B Oacute -10 +KPX B Ocircumflex -10 +KPX B Odieresis -10 +KPX B Ograve -10 +KPX B Oslash -8 +KPX B V -29 +KPX B W -12 +KPX B Y -50 +KPX C A -9 +KPX C AE -9 +KPX C Aacute -9 +KPX C Adieresis -9 +KPX C Aring -9 +KPX C H -26 +KPX C K -11 +KPX C O -21 +KPX C Oacute -21 +KPX C Odieresis -21 +KPX Ccedilla A -5 +KPX D A -42 +KPX D Aacute -42 +KPX D Acircumflex -42 +KPX D Adieresis -42 +KPX D Agrave -42 +KPX D Aring -42 +KPX D Atilde -42 +KPX D J -31 +KPX D T -40 +KPX D V -42 +KPX D W -17 +KPX D X -55 +KPX D Y -63 +KPX F A -38 +KPX F Aacute -38 +KPX F Acircumflex -38 +KPX F Adieresis -38 +KPX F Agrave -38 +KPX F Aring -38 +KPX F Atilde -38 +KPX F J -95 +KPX F O -27 +KPX F Odieresis -27 +KPX F a -47 +KPX F aacute -47 +KPX F adieresis -43 +KPX F ae -20 +KPX F aring -47 +KPX F comma -168 +KPX F e -56 +KPX F eacute -56 +KPX F hyphen -67 +KPX F i -47 +KPX F j -54 +KPX F o -63 +KPX F oacute -63 +KPX F odieresis -48 +KPX F oe -21 +KPX F oslash -63 +KPX F period -193 +KPX F r -32 +KPX F u -1 +KPX G A 6 +KPX G AE 5 +KPX G Aacute 6 +KPX G Acircumflex 6 +KPX G Adieresis 6 +KPX G Agrave 6 +KPX G Aring 6 +KPX G Atilde 6 +KPX G T -25 +KPX G V 6 +KPX G W 1 +KPX G Y -14 +KPX J A -7 +KPX J AE -16 +KPX J Adieresis -7 +KPX J Aring -7 +KPX K C -42 +KPX K G -36 +KPX K O -37 +KPX K OE -19 +KPX K Oacute -37 +KPX K Odieresis -37 +KPX K S -9 +KPX K T -12 +KPX K a -1 +KPX K adieresis -1 +KPX K ae 26 +KPX K aring -1 +KPX K e -24 +KPX K hyphen -61 +KPX K o -25 +KPX K oacute -25 +KPX K odieresis -25 +KPX K u -25 +KPX K udieresis -25 +KPX K y -67 +KPX L A 17 +KPX L AE 16 +KPX L Aacute 17 +KPX L Adieresis 17 +KPX L Aring 17 +KPX L C -11 +KPX L Ccedilla -10 +KPX L G -10 +KPX L O -6 +KPX L Oacute -6 +KPX L Ocircumflex -6 +KPX L Odieresis -6 +KPX L Ograve -6 +KPX L Otilde -6 +KPX L S -24 +KPX L T -52 +KPX L U -29 +KPX L Udieresis -29 +KPX L V -66 +KPX L W -27 +KPX L Y -53 +KPX L hyphen 3 +KPX L quotedblright -66 +KPX L quoteright -73 +KPX L u -16 +KPX L udieresis -16 +KPX L y -45 +KPX N A -3 +KPX N AE -3 +KPX N Aacute -3 +KPX N Adieresis -3 +KPX N Aring -3 +KPX N C -12 +KPX N Ccedilla -12 +KPX N G -11 +KPX N O -9 +KPX N Oacute -9 +KPX N Odieresis -9 +KPX N a -19 +KPX N aacute -19 +KPX N adieresis -19 +KPX N ae 11 +KPX N aring -19 +KPX N comma -58 +KPX N e -6 +KPX N eacute -6 +KPX N o -10 +KPX N oacute -10 +KPX N odieresis -10 +KPX N oslash -7 +KPX N period -83 +KPX N u -9 +KPX N udieresis -9 +KPX O A -27 +KPX O AE -26 +KPX O Aacute -27 +KPX O Adieresis -27 +KPX O Aring -27 +KPX O T -30 +KPX O V -31 +KPX O W -5 +KPX O X -43 +KPX O Y -52 +KPX Oacute A -27 +KPX Oacute T -30 +KPX Oacute V -31 +KPX Oacute W -5 +KPX Oacute Y -52 +KPX Ocircumflex T -30 +KPX Ocircumflex V -31 +KPX Ocircumflex Y -52 +KPX Odieresis A -27 +KPX Odieresis T -30 +KPX Odieresis V -31 +KPX Odieresis W -5 +KPX Odieresis X -43 +KPX Odieresis Y -52 +KPX Ograve T -30 +KPX Ograve V -31 +KPX Ograve Y -52 +KPX Oslash A -26 +KPX Otilde T -30 +KPX Otilde V -31 +KPX Otilde Y -52 +KPX P A -79 +KPX P AE -76 +KPX P Aacute -79 +KPX P Adieresis -79 +KPX P Aring -79 +KPX P J -82 +KPX P a -52 +KPX P aacute -52 +KPX P adieresis -52 +KPX P ae -25 +KPX P aring -52 +KPX P comma -156 +KPX P e -42 +KPX P eacute -42 +KPX P hyphen -46 +KPX P o -48 +KPX P oacute -48 +KPX P odieresis -48 +KPX P oe -13 +KPX P oslash -48 +KPX P period -181 +KPX R C -27 +KPX R Ccedilla -28 +KPX R G -26 +KPX R O -25 +KPX R OE -4 +KPX R Oacute -25 +KPX R Odieresis -25 +KPX R T -28 +KPX R U -32 +KPX R Udieresis -32 +KPX R V -33 +KPX R W -13 +KPX R Y -29 +KPX R a 7 +KPX R aacute 7 +KPX R adieresis 7 +KPX R ae 35 +KPX R aring 7 +KPX R e -15 +KPX R eacute -15 +KPX R hyphen -48 +KPX R o -17 +KPX R oacute -17 +KPX R odieresis -17 +KPX R oe 22 +KPX R u -11 +KPX R uacute -11 +KPX R udieresis -11 +KPX R y -15 +KPX S A -22 +KPX S AE -22 +KPX S Aacute -22 +KPX S Adieresis -22 +KPX S Aring -22 +KPX S T -42 +KPX S V -10 +KPX S W -16 +KPX S Y -31 +KPX S t -18 +KPX T A -27 +KPX T AE -27 +KPX T Aacute -27 +KPX T Acircumflex -27 +KPX T Adieresis -27 +KPX T Agrave -27 +KPX T Aring -27 +KPX T Atilde -27 +KPX T C -29 +KPX T G -30 +KPX T J -79 +KPX T O -29 +KPX T OE -7 +KPX T Oacute -29 +KPX T Ocircumflex -29 +KPX T Odieresis -29 +KPX T Ograve -29 +KPX T Oslash -29 +KPX T Otilde -29 +KPX T S -43 +KPX T V 10 +KPX T W 5 +KPX T Y -10 +KPX T a -60 +KPX T ae -33 +KPX T c -88 +KPX T colon -136 +KPX T comma -108 +KPX T e -83 +KPX T g -92 +KPX T guillemotleft -122 +KPX T guilsinglleft -122 +KPX T hyphen -94 +KPX T i -58 +KPX T j -80 +KPX T o -85 +KPX T oslash -54 +KPX T period -136 +KPX T r -54 +KPX T s -63 +KPX T semicolon -111 +KPX T u -84 +KPX T v -93 +KPX T w -88 +KPX T y -103 +KPX U A -18 +KPX U AE -27 +KPX U Aacute -18 +KPX U Acircumflex -18 +KPX U Adieresis -18 +KPX U Aring -18 +KPX U Atilde -18 +KPX U comma -76 +KPX U m 6 +KPX U n -19 +KPX U p 0 +KPX U period -101 +KPX U r -41 +KPX Uacute A -18 +KPX Uacute comma -76 +KPX Uacute m 6 +KPX Uacute n -19 +KPX Uacute p 0 +KPX Uacute period -101 +KPX Uacute r -41 +KPX Ucircumflex A -18 +KPX Udieresis A -18 +KPX Udieresis b 25 +KPX Udieresis comma -76 +KPX Udieresis m 6 +KPX Udieresis n -19 +KPX Udieresis p 0 +KPX Udieresis period -101 +KPX Udieresis r -41 +KPX Ugrave A -18 +KPX V A -3 +KPX V AE -12 +KPX V Aacute -3 +KPX V Acircumflex -3 +KPX V Adieresis -3 +KPX V Agrave -3 +KPX V Aring -3 +KPX V Atilde -3 +KPX V C -29 +KPX V G -31 +KPX V O -31 +KPX V Oacute -31 +KPX V Ocircumflex -31 +KPX V Odieresis -31 +KPX V Ograve -31 +KPX V Oslash -31 +KPX V Otilde -31 +KPX V S -34 +KPX V T 10 +KPX V a -60 +KPX V ae -33 +KPX V colon -124 +KPX V comma -129 +KPX V e -52 +KPX V g -53 +KPX V guillemotleft -75 +KPX V guilsinglleft -75 +KPX V hyphen -43 +KPX V i -60 +KPX V o -56 +KPX V oslash -53 +KPX V period -154 +KPX V r -46 +KPX V semicolon -114 +KPX V u -15 +KPX V y -19 +KPX W A -8 +KPX W AE -14 +KPX W Aacute -8 +KPX W Acircumflex -8 +KPX W Adieresis -8 +KPX W Agrave -8 +KPX W Aring -8 +KPX W Atilde -8 +KPX W C -8 +KPX W G -7 +KPX W O -5 +KPX W Oacute -5 +KPX W Ocircumflex -5 +KPX W Odieresis -5 +KPX W Ograve -5 +KPX W Oslash -2 +KPX W Otilde -5 +KPX W S -24 +KPX W T 5 +KPX W a -20 +KPX W ae 10 +KPX W colon -88 +KPX W comma -66 +KPX W e -6 +KPX W g -7 +KPX W guillemotleft -31 +KPX W guilsinglleft -31 +KPX W hyphen -2 +KPX W i -43 +KPX W o -10 +KPX W oslash -7 +KPX W period -90 +KPX W r -29 +KPX W semicolon -69 +KPX W u 2 +KPX W y -2 +KPX X C -46 +KPX X O -43 +KPX X Odieresis -43 +KPX X Q -44 +KPX X a -7 +KPX X e -30 +KPX X hyphen -75 +KPX X o -31 +KPX X u -31 +KPX X y -53 +KPX Y A -24 +KPX Y AE -27 +KPX Y Aacute -24 +KPX Y Acircumflex -24 +KPX Y Adieresis -24 +KPX Y Agrave -24 +KPX Y Aring -24 +KPX Y Atilde -24 +KPX Y C -51 +KPX Y G -52 +KPX Y O -53 +KPX Y Oacute -53 +KPX Y Ocircumflex -53 +KPX Y Odieresis -53 +KPX Y Ograve -53 +KPX Y Oslash -53 +KPX Y Otilde -53 +KPX Y S -55 +KPX Y T -10 +KPX Y a -60 +KPX Y ae -32 +KPX Y colon -135 +KPX Y comma -107 +KPX Y e -78 +KPX Y g -81 +KPX Y guillemotleft -115 +KPX Y guilsinglleft -115 +KPX Y hyphen -91 +KPX Y i -57 +KPX Y o -83 +KPX Y oslash -54 +KPX Y p -35 +KPX Y period -135 +KPX Y semicolon -110 +KPX Y u -46 +KPX Y v -39 +KPX Z v -50 +KPX Z y -61 +KPX a j -87 +KPX a quoteright -56 +KPX a v -28 +KPX a w -21 +KPX a y -38 +KPX aacute v -28 +KPX aacute w -21 +KPX aacute y -38 +KPX adieresis v -28 +KPX adieresis w -21 +KPX adieresis y -38 +KPX ae v 21 +KPX ae w 21 +KPX ae y 10 +KPX agrave v -28 +KPX agrave w -21 +KPX agrave y -38 +KPX aring v -28 +KPX aring w -21 +KPX aring y -38 +KPX b v -12 +KPX b w 1 +KPX b y -22 +KPX c h -3 +KPX c k -9 +KPX comma one -144 +KPX comma quotedblright -119 +KPX comma quoteright -136 +KPX e quoteright -41 +KPX e t -29 +KPX e v -22 +KPX e w -19 +KPX e x -2 +KPX e y -33 +KPX eacute v -22 +KPX eacute w -19 +KPX eacute y -33 +KPX ecircumflex v -22 +KPX ecircumflex w -19 +KPX ecircumflex y -33 +KPX eight four -58 +KPX eight one -75 +KPX eight seven -68 +KPX f a -38 +KPX f aacute -38 +KPX f adieresis -22 +KPX f ae -11 +KPX f aring -38 +KPX f e -55 +KPX f eacute -55 +KPX f f -42 +KPX f i -36 +KPX f j -59 +KPX f l -25 +KPX f o -62 +KPX f oacute -62 +KPX f odieresis -27 +KPX f oe -20 +KPX f oslash -32 +KPX f quoteright -56 +KPX f s -41 +KPX f t -6 +KPX five four -52 +KPX five one -86 +KPX five seven -72 +KPX four four -62 +KPX four one -66 +KPX four seven -93 +KPX g a -10 +KPX g adieresis -10 +KPX g ae 16 +KPX g aring -10 +KPX g e -4 +KPX g eacute -4 +KPX g l -33 +KPX g oacute -8 +KPX g odieresis -8 +KPX g r 0 +KPX guillemotright A -43 +KPX guillemotright AE -39 +KPX guillemotright Aacute -43 +KPX guillemotright Adieresis -43 +KPX guillemotright Aring -43 +KPX guillemotright T -121 +KPX guillemotright V -71 +KPX guillemotright W -29 +KPX guillemotright Y -114 +KPX guilsinglright A -43 +KPX guilsinglright AE -39 +KPX guilsinglright Aacute -43 +KPX guilsinglright Adieresis -43 +KPX guilsinglright Aring -43 +KPX guilsinglright T -121 +KPX guilsinglright V -71 +KPX guilsinglright W -29 +KPX guilsinglright Y -114 +KPX h quoteright -49 +KPX h y -32 +KPX hyphen A -26 +KPX hyphen AE -20 +KPX hyphen Aacute -26 +KPX hyphen Adieresis -26 +KPX hyphen Aring -26 +KPX hyphen T -95 +KPX hyphen V -41 +KPX hyphen W -1 +KPX hyphen Y -92 +KPX i T -58 +KPX i j -142 +KPX k a -6 +KPX k aacute -6 +KPX k adieresis -6 +KPX k ae 21 +KPX k aring -6 +KPX k comma -53 +KPX k e -29 +KPX k eacute -29 +KPX k g -38 +KPX k hyphen -99 +KPX k o -30 +KPX k oacute -30 +KPX k odieresis -30 +KPX k period -81 +KPX k s -9 +KPX k u -3 +KPX k udieresis -3 +KPX l v -83 +KPX l y -93 +KPX m p 22 +KPX m v 14 +KPX m w 15 +KPX m y 3 +KPX n T -42 +KPX n p -5 +KPX n quoteright -47 +KPX n v -21 +KPX n w -12 +KPX n y -31 +KPX nine four -51 +KPX nine one -75 +KPX nine seven -66 +KPX o T -85 +KPX o quoteright -39 +KPX o t -22 +KPX o v -21 +KPX o w -6 +KPX o x -26 +KPX o y -31 +KPX oacute v -21 +KPX oacute w -6 +KPX oacute y -31 +KPX ocircumflex t -22 +KPX odieresis t -22 +KPX odieresis v -21 +KPX odieresis w -6 +KPX odieresis x -26 +KPX odieresis y -31 +KPX ograve v -21 +KPX ograve w -6 +KPX ograve y -31 +KPX one comma -91 +KPX one eight -86 +KPX one five -67 +KPX one four -119 +KPX one nine -75 +KPX one one -62 +KPX one period -119 +KPX one seven -141 +KPX one six -111 +KPX one three -61 +KPX one two -47 +KPX one zero -94 +KPX p t -15 +KPX p y -19 +KPX period one -119 +KPX period quotedblright -108 +KPX period quoteright -125 +KPX q c -2 +KPX q u 42 +KPX quotedblbase A -3 +KPX quotedblbase AE -3 +KPX quotedblbase T -78 +KPX quotedblbase V -83 +KPX quotedblbase W -23 +KPX quotedblbase Y -79 +KPX quotedblleft A -59 +KPX quotedblleft AE -52 +KPX quotedblleft Aacute -59 +KPX quotedblleft Adieresis -59 +KPX quotedblleft Aring -59 +KPX quotedblleft T -37 +KPX quotedblleft V -14 +KPX quotedblleft W -3 +KPX quotedblleft Y -35 +KPX quotedblright A -59 +KPX quotedblright AE -68 +KPX quotedblright Aacute -59 +KPX quotedblright Adieresis -59 +KPX quotedblright Aring -59 +KPX quotedblright T -45 +KPX quotedblright V -14 +KPX quotedblright W -20 +KPX quotedblright Y -35 +KPX quoteleft A -80 +KPX quoteleft AE -73 +KPX quoteleft Aacute -80 +KPX quoteleft Adieresis -80 +KPX quoteleft Aring -80 +KPX quoteleft T -59 +KPX quoteleft V -36 +KPX quoteleft W -24 +KPX quoteleft Y -56 +KPX quoteright A -140 +KPX quoteright AE -149 +KPX quoteright Aacute -140 +KPX quoteright Adieresis -140 +KPX quoteright Aring -140 +KPX quoteright comma -196 +KPX quoteright d -126 +KPX quoteright o -131 +KPX quoteright period -220 +KPX quoteright r -145 +KPX quoteright s -140 +KPX quoteright t -114 +KPX quoteright v -108 +KPX quoteright w -105 +KPX quoteright y -118 +KPX r a -20 +KPX r aacute -20 +KPX r acircumflex -20 +KPX r adieresis -20 +KPX r ae 7 +KPX r agrave -20 +KPX r aring -20 +KPX r c -24 +KPX r ccedilla -28 +KPX r colon -81 +KPX r comma -97 +KPX r d -14 +KPX r e -12 +KPX r eacute -12 +KPX r ecircumflex -12 +KPX r egrave -12 +KPX r f -18 +KPX r g -11 +KPX r h -19 +KPX r hyphen -120 +KPX r i -28 +KPX r j -35 +KPX r k -29 +KPX r l -47 +KPX r m 33 +KPX r n 6 +KPX r o -19 +KPX r oacute -19 +KPX r ocircumflex -19 +KPX r odieresis -19 +KPX r oe 18 +KPX r ograve -19 +KPX r oslash -19 +KPX r p 28 +KPX r period -125 +KPX r q -11 +KPX r quoteright -37 +KPX r r -13 +KPX r s -24 +KPX r semicolon -69 +KPX r t 17 +KPX r u 17 +KPX r v 24 +KPX r w 24 +KPX r x 2 +KPX r y 13 +KPX r z -19 +KPX s quoteright -48 +KPX s t -13 +KPX seven colon -148 +KPX seven comma -140 +KPX seven eight -79 +KPX seven five -84 +KPX seven four -111 +KPX seven one -67 +KPX seven period -165 +KPX seven seven -62 +KPX seven six -99 +KPX seven three -72 +KPX seven two -69 +KPX six four -46 +KPX six one -61 +KPX six seven -48 +KPX t S -35 +KPX t a -20 +KPX t aacute -20 +KPX t adieresis -20 +KPX t ae 8 +KPX t aring -20 +KPX t colon -102 +KPX t e -37 +KPX t eacute -37 +KPX t h -7 +KPX t o -39 +KPX t oacute -39 +KPX t odieresis -39 +KPX t quoteright -94 +KPX t semicolon -80 +KPX three four -52 +KPX three one -74 +KPX three seven -67 +KPX two four -92 +KPX two one -66 +KPX two seven -71 +KPX u quoteright -38 +KPX v a -6 +KPX v aacute -6 +KPX v acircumflex -6 +KPX v adieresis -6 +KPX v ae 20 +KPX v agrave -6 +KPX v aring -6 +KPX v atilde -6 +KPX v c -25 +KPX v colon -71 +KPX v comma -113 +KPX v e -13 +KPX v eacute -13 +KPX v ecircumflex -13 +KPX v egrave -13 +KPX v g -11 +KPX v hyphen -24 +KPX v l -82 +KPX v o -21 +KPX v oacute -21 +KPX v odieresis -21 +KPX v ograve -21 +KPX v oslash -21 +KPX v period -139 +KPX v s -19 +KPX v semicolon -62 +KPX w a -6 +KPX w aacute -6 +KPX w acircumflex -6 +KPX w adieresis -6 +KPX w ae 20 +KPX w agrave -6 +KPX w aring -6 +KPX w atilde -6 +KPX w c -10 +KPX w colon -71 +KPX w comma -70 +KPX w e -1 +KPX w eacute -1 +KPX w ecircumflex -1 +KPX w egrave -1 +KPX w g -3 +KPX w hyphen 1 +KPX w l -50 +KPX w o -6 +KPX w oacute -6 +KPX w odieresis -6 +KPX w ograve -6 +KPX w oslash -3 +KPX w period -95 +KPX w s -18 +KPX w semicolon -62 +KPX x a -2 +KPX x c -29 +KPX x e -25 +KPX x eacute -25 +KPX x o -26 +KPX x q -30 +KPX y a -17 +KPX y aacute -17 +KPX y acircumflex -17 +KPX y adieresis -17 +KPX y ae 10 +KPX y agrave -17 +KPX y aring -17 +KPX y atilde -17 +KPX y c -35 +KPX y colon -81 +KPX y comma -117 +KPX y e -24 +KPX y eacute -24 +KPX y ecircumflex -24 +KPX y egrave -24 +KPX y g -21 +KPX y hyphen -24 +KPX y l -93 +KPX y o -31 +KPX y oacute -31 +KPX y odieresis -31 +KPX y ograve -31 +KPX y oslash -31 +KPX y period -144 +KPX y s -30 +KPX y semicolon -72 +KPX zero four -58 +KPX zero one -81 +KPX zero seven -73 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n022003l.pfb b/pdf2swf/fonts/n022003l.pfb new file mode 100644 index 00000000..0cadce7d Binary files /dev/null and b/pdf2swf/fonts/n022003l.pfb differ diff --git a/pdf2swf/fonts/n022004l.afm b/pdf2swf/fonts/n022004l.afm new file mode 100644 index 00000000..0bafed51 --- /dev/null +++ b/pdf2swf/fonts/n022004l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusMonL-Bold +FullName Nimbus Mono L Bold +FamilyName Nimbus Mono L +Weight Bold +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -43 -278 681 871 +CapHeight 583 +XHeight 437 +Descender -205 +Ascender 624 +StartCharMetrics 316 +C 32 ; WX 600 ; N space ; B 375 0 375 0 ; +C 33 ; WX 600 ; N exclam ; B 220 -15 381 638 ; +C 34 ; WX 600 ; N quotedbl ; B 136 312 464 602 ; +C 35 ; WX 600 ; N numbersign ; B 62 -92 538 675 ; +C 36 ; WX 600 ; N dollar ; B 83 -123 517 684 ; +C 37 ; WX 600 ; N percent ; B 80 -15 521 617 ; +C 38 ; WX 600 ; N ampersand ; B 75 -14 508 550 ; +C 39 ; WX 600 ; N quoteright ; B 147 331 351 623 ; +C 40 ; WX 600 ; N parenleft ; B 264 -153 488 632 ; +C 41 ; WX 600 ; N parenright ; B 117 -153 341 632 ; +C 42 ; WX 600 ; N asterisk ; B 83 208 517 622 ; +C 43 ; WX 600 ; N plus ; B 42 0 558 560 ; +C 44 ; WX 600 ; N comma ; B 147 -158 351 134 ; +C 45 ; WX 600 ; N hyphen ; B 42 229 558 329 ; +C 46 ; WX 600 ; N period ; B 225 -15 375 117 ; +C 47 ; WX 600 ; N slash ; B 83 -113 517 695 ; +C 48 ; WX 600 ; N zero ; B 83 -15 517 638 ; +C 49 ; WX 600 ; N one ; B 83 0 517 638 ; +C 50 ; WX 600 ; N two ; B 54 0 508 638 ; +C 51 ; WX 600 ; N three ; B 66 -15 529 638 ; +C 52 ; WX 600 ; N four ; B 75 0 508 622 ; +C 53 ; WX 600 ; N five ; B 66 -15 529 622 ; +C 54 ; WX 600 ; N six ; B 105 -15 540 638 ; +C 55 ; WX 600 ; N seven ; B 75 -1 508 622 ; +C 56 ; WX 600 ; N eight ; B 83 -15 517 638 ; +C 57 ; WX 600 ; N nine ; B 106 -15 541 638 ; +C 58 ; WX 600 ; N colon ; B 225 -15 375 437 ; +C 59 ; WX 600 ; N semicolon ; B 147 -158 351 437 ; +C 60 ; WX 600 ; N less ; B 42 54 544 501 ; +C 61 ; WX 600 ; N equal ; B 42 138 558 422 ; +C 62 ; WX 600 ; N greater ; B 56 53 558 500 ; +C 63 ; WX 600 ; N question ; B 104 -15 517 598 ; +C 64 ; WX 600 ; N at ; B 76 -152 509 620 ; +C 65 ; WX 600 ; N A ; B -21 0 621 583 ; +C 66 ; WX 600 ; N B ; B 13 0 571 583 ; +C 67 ; WX 600 ; N C ; B 33 -14 564 597 ; +C 68 ; WX 600 ; N D ; B 13 0 550 583 ; +C 69 ; WX 600 ; N E ; B 13 0 550 583 ; +C 70 ; WX 600 ; N F ; B 13 0 550 583 ; +C 71 ; WX 600 ; N G ; B 33 -14 592 597 ; +C 72 ; WX 600 ; N H ; B 23 0 581 583 ; +C 73 ; WX 600 ; N I ; B 83 0 517 583 ; +C 74 ; WX 600 ; N J ; B 54 -14 613 583 ; +C 75 ; WX 600 ; N K ; B 13 0 602 583 ; +C 76 ; WX 600 ; N L ; B 33 0 571 583 ; +C 77 ; WX 600 ; N M ; B -19 0 623 584 ; +C 78 ; WX 600 ; N N ; B -8 0 592 583 ; +C 79 ; WX 600 ; N O ; B 21 -14 579 597 ; +C 80 ; WX 600 ; N P ; B 13 0 529 583 ; +C 81 ; WX 600 ; N Q ; B 21 -145 579 597 ; +C 82 ; WX 600 ; N R ; B 13 0 619 583 ; +C 83 ; WX 600 ; N S ; B 62 -14 538 597 ; +C 84 ; WX 600 ; N T ; B 42 0 558 583 ; +C 85 ; WX 600 ; N U ; B 10 -14 590 583 ; +C 86 ; WX 600 ; N V ; B -21 0 621 583 ; +C 87 ; WX 600 ; N W ; B -10 0 610 583 ; +C 88 ; WX 600 ; N X ; B 10 0 590 583 ; +C 89 ; WX 600 ; N Y ; B 21 0 579 583 ; +C 90 ; WX 600 ; N Z ; B 73 0 527 583 ; +C 91 ; WX 600 ; N bracketleft ; B 250 -148 475 627 ; +C 92 ; WX 600 ; N backslash ; B 83 -113 517 695 ; +C 93 ; WX 600 ; N bracketright ; B 125 -148 350 627 ; +C 94 ; WX 600 ; N asciicircum ; B 83 325 517 652 ; +C 95 ; WX 600 ; N underscore ; B -12 -125 612 -75 ; +C 96 ; WX 600 ; N quoteleft ; B 249 348 453 602 ; +C 97 ; WX 600 ; N a ; B 42 -16 571 450 ; +C 98 ; WX 600 ; N b ; B -8 -14 571 624 ; +C 99 ; WX 600 ; N c ; B 54 -16 565 450 ; +C 100 ; WX 600 ; N d ; B 33 -14 613 624 ; +C 101 ; WX 600 ; N e ; B 33 -16 550 450 ; +C 102 ; WX 600 ; N f ; B 75 0 571 623 ; +C 103 ; WX 600 ; N g ; B 33 -205 592 451 ; +C 104 ; WX 600 ; N h ; B 13 0 581 624 ; +C 105 ; WX 600 ; N i ; B 62 0 538 623 ; +C 106 ; WX 600 ; N j ; B 117 -205 488 623 ; +C 107 ; WX 600 ; N k ; B 33 0 571 624 ; +C 108 ; WX 600 ; N l ; B 62 0 538 624 ; +C 109 ; WX 600 ; N m ; B -19 0 623 450 ; +C 110 ; WX 600 ; N n ; B 23 0 571 450 ; +C 111 ; WX 600 ; N o ; B 42 -16 558 450 ; +C 112 ; WX 600 ; N p ; B -8 -205 571 450 ; +C 113 ; WX 600 ; N q ; B 33 -205 613 450 ; +C 114 ; WX 600 ; N r ; B 54 0 571 449 ; +C 115 ; WX 600 ; N s ; B 73 -16 527 450 ; +C 116 ; WX 600 ; N t ; B 13 -16 529 591 ; +C 117 ; WX 600 ; N u ; B 13 -13 571 437 ; +C 118 ; WX 600 ; N v ; B 0 0 600 437 ; +C 119 ; WX 600 ; N w ; B 0 0 600 437 ; +C 120 ; WX 600 ; N x ; B 21 0 579 437 ; +C 121 ; WX 600 ; N y ; B 21 -205 579 437 ; +C 122 ; WX 600 ; N z ; B 85 0 519 437 ; +C 123 ; WX 600 ; N braceleft ; B 167 -153 433 623 ; +C 124 ; WX 600 ; N bar ; B 250 -153 350 622 ; +C 125 ; WX 600 ; N braceright ; B 167 -153 433 623 ; +C 126 ; WX 600 ; N asciitilde ; B 62 179 538 385 ; +C 161 ; WX 600 ; N exclamdown ; B 220 -227 381 426 ; +C 162 ; WX 600 ; N cent ; B 83 -44 499 661 ; +C 163 ; WX 600 ; N sterling ; B 33 0 550 598 ; +C 164 ; WX 600 ; N fraction ; B 21 102 580 500 ; +C 165 ; WX 600 ; N yen ; B 21 0 579 580 ; +C 166 ; WX 600 ; N florin ; B 57 -123 548 638 ; +C 167 ; WX 600 ; N section ; B 36 -170 564 583 ; +C 168 ; WX 600 ; N currency ; B 73 64 527 519 ; +C 169 ; WX 600 ; N quotesingle ; B 236 312 364 602 ; +C 170 ; WX 600 ; N quotedblleft ; B 98 348 502 602 ; +C 171 ; WX 600 ; N guillemotleft ; B 33 20 571 415 ; +C 172 ; WX 600 ; N guilsinglleft ; B 33 20 342 415 ; +C 173 ; WX 600 ; N guilsinglright ; B 263 20 571 415 ; +C 174 ; WX 600 ; N fi ; B -14 0 619 624 ; +C 175 ; WX 600 ; N fl ; B -17 0 617 623 ; +C 177 ; WX 600 ; N endash ; B 42 229 558 329 ; +C 178 ; WX 600 ; N dagger ; B 94 -92 506 622 ; +C 179 ; WX 600 ; N daggerdbl ; B 94 -92 506 622 ; +C 180 ; WX 600 ; N periodcentered ; B 225 214 375 346 ; +C 182 ; WX 600 ; N paragraph ; B 49 -174 558 583 ; +C 183 ; WX 600 ; N bullet ; B 150 154 449 453 ; +C 184 ; WX 600 ; N quotesinglbase ; B 147 -158 351 134 ; +C 185 ; WX 600 ; N quotedblbase ; B 87 -120 491 134 ; +C 186 ; WX 600 ; N quotedblright ; B 87 348 491 602 ; +C 187 ; WX 600 ; N guillemotright ; B 33 20 571 415 ; +C 188 ; WX 600 ; N ellipsis ; B 25 -15 575 117 ; +C 189 ; WX 600 ; N perthousand ; B 0 0 600 618 ; +C 191 ; WX 600 ; N questiondown ; B 83 -227 496 386 ; +C 193 ; WX 600 ; N grave ; B 125 496 350 696 ; +C 194 ; WX 600 ; N acute ; B 250 496 475 696 ; +C 195 ; WX 600 ; N circumflex ; B 125 497 476 696 ; +C 196 ; WX 600 ; N tilde ; B 115 523 485 656 ; +C 197 ; WX 600 ; N macron ; B 125 546 475 626 ; +C 198 ; WX 600 ; N breve ; B 125 503 475 687 ; +C 199 ; WX 600 ; N dotaccent ; B 240 534 360 654 ; +C 200 ; WX 600 ; N dieresis ; B 136 534 464 654 ; +C 202 ; WX 600 ; N ring ; B 177 486 423 727 ; +C 203 ; WX 600 ; N cedilla ; B 180 -229 407 0 ; +C 205 ; WX 600 ; N hungarumlaut ; B 125 496 475 694 ; +C 206 ; WX 600 ; N ogonek ; B 250 -208 463 0 ; +C 207 ; WX 600 ; N caron ; B 125 497 476 696 ; +C 208 ; WX 600 ; N emdash ; B -29 229 629 329 ; +C 225 ; WX 600 ; N AE ; B -20 0 614 583 ; +C 227 ; WX 600 ; N ordfeminine ; B 118 182 489 595 ; +C 232 ; WX 600 ; N Lslash ; B 12 0 571 583 ; +C 233 ; WX 600 ; N Oslash ; B 9 -70 590 638 ; +C 234 ; WX 600 ; N OE ; B -20 0 612 583 ; +C 235 ; WX 600 ; N ordmasculine ; B 122 182 480 595 ; +C 241 ; WX 600 ; N ae ; B -13 -16 612 450 ; +C 245 ; WX 600 ; N dotlessi ; B 62 0 538 437 ; +C 248 ; WX 600 ; N lslash ; B 62 0 538 624 ; +C 249 ; WX 600 ; N oslash ; B 23 -70 573 494 ; +C 250 ; WX 600 ; N oe ; B -11 -16 613 450 ; +C 251 ; WX 600 ; N germandbls ; B 13 -16 529 623 ; +C -1 ; WX 600 ; N Udieresis ; B 10 -14 590 798 ; +C -1 ; WX 600 ; N Uacute ; B 10 -14 590 839 ; +C -1 ; WX 600 ; N Scedilla ; B 62 -229 538 597 ; +C -1 ; WX 600 ; N Tcaron ; B 42 0 558 839 ; +C -1 ; WX 600 ; N Scaron ; B 62 -14 538 839 ; +C -1 ; WX 600 ; N Rcaron ; B 13 0 619 839 ; +C -1 ; WX 600 ; N Racute ; B 13 0 619 839 ; +C -1 ; WX 600 ; N Sacute ; B 62 -14 538 839 ; +C -1 ; WX 600 ; N Otilde ; B 21 -14 579 799 ; +C -1 ; WX 600 ; N ucircumflex ; B 13 -13 571 696 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 21 -14 579 838 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 10 -14 590 838 ; +C -1 ; WX 600 ; N Yacute ; B 21 0 579 839 ; +C -1 ; WX 600 ; N Eth ; B 0 0 550 583 ; +C -1 ; WX 600 ; N Dcroat ; B 0 0 550 583 ; +C -1 ; WX 600 ; N Zacute ; B 73 0 527 839 ; +C -1 ; WX 600 ; N Uring ; B 10 -14 590 871 ; +C -1 ; WX 600 ; N gbreve ; B 33 -205 592 687 ; +C -1 ; WX 600 ; N eogonek ; B 33 -208 550 450 ; +C -1 ; WX 600 ; N edotaccent ; B 33 -16 550 654 ; +C -1 ; WX 600 ; N ecaron ; B 33 -16 550 696 ; +C -1 ; WX 600 ; N Ugrave ; B 10 -14 590 839 ; +C -1 ; WX 600 ; N Thorn ; B 14 0 523 583 ; +C -1 ; WX 600 ; N eacute ; B 33 -16 550 696 ; +C -1 ; WX 600 ; N edieresis ; B 33 -16 550 654 ; +C -1 ; WX 600 ; N dcaron ; B 33 -14 681 637 ; +C -1 ; WX 600 ; N ccedilla ; B 54 -229 565 450 ; +C -1 ; WX 600 ; N ccaron ; B 54 -16 565 696 ; +C -1 ; WX 600 ; N cacute ; B 54 -16 565 696 ; +C -1 ; WX 600 ; N aogonek ; B 42 -208 580 450 ; +C -1 ; WX 600 ; N aring ; B 42 -16 571 727 ; +C -1 ; WX 600 ; N atilde ; B 42 -16 571 656 ; +C -1 ; WX 600 ; N abreve ; B 42 -16 571 687 ; +C -1 ; WX 600 ; N egrave ; B 33 -16 550 696 ; +C -1 ; WX 600 ; N agrave ; B 42 -16 571 696 ; +C -1 ; WX 600 ; N aacute ; B 42 -16 571 696 ; +C -1 ; WX 600 ; N adieresis ; B 42 -16 571 654 ; +C -1 ; WX 600 ; N Uogonek ; B 10 -208 590 583 ; +C -1 ; WX 600 ; N ugrave ; B 13 -13 571 696 ; +C -1 ; WX 600 ; N uacute ; B 13 -13 571 696 ; +C -1 ; WX 600 ; N udieresis ; B 13 -13 571 654 ; +C -1 ; WX 600 ; N tcaron ; B 13 -16 530 637 ; +C -1 ; WX 600 ; N scommaaccent ; B 73 -278 527 450 ; +C -1 ; WX 600 ; N Zcaron ; B 73 0 527 839 ; +C -1 ; WX 600 ; N ecircumflex ; B 33 -16 550 696 ; +C -1 ; WX 600 ; N Ucircumflex ; B 10 -14 590 839 ; +C -1 ; WX 600 ; N acircumflex ; B 42 -16 571 696 ; +C -1 ; WX 600 ; N Zdotaccent ; B 73 0 527 798 ; +C -1 ; WX 600 ; N scaron ; B 73 -16 527 696 ; +C -1 ; WX 600 ; N Amacron ; B -21 0 621 769 ; +C -1 ; WX 600 ; N sacute ; B 73 -16 527 696 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 42 -278 558 583 ; +C -1 ; WX 600 ; N Ydieresis ; B 21 0 579 798 ; +C -1 ; WX 600 ; N thorn ; B -8 -205 571 624 ; +C -1 ; WX 600 ; N Emacron ; B 13 0 550 769 ; +C -1 ; WX 600 ; N Ograve ; B 21 -14 579 839 ; +C -1 ; WX 600 ; N Oacute ; B 21 -14 579 839 ; +C -1 ; WX 600 ; N Odieresis ; B 21 -14 579 798 ; +C -1 ; WX 600 ; N Ntilde ; B -8 0 592 799 ; +C -1 ; WX 600 ; N Ncaron ; B -8 0 592 839 ; +C -1 ; WX 600 ; N Nacute ; B -8 0 592 839 ; +C -1 ; WX 600 ; N Lcaron ; B 33 0 571 598 ; +C -1 ; WX 600 ; N Lacute ; B 33 0 571 839 ; +C -1 ; WX 600 ; N Idotaccent ; B 83 0 517 798 ; +C -1 ; WX 600 ; N racute ; B 54 0 571 696 ; +C -1 ; WX 600 ; N Icircumflex ; B 83 0 517 839 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 42 -16 558 694 ; +C -1 ; WX 600 ; N otilde ; B 42 -16 558 656 ; +C -1 ; WX 600 ; N Euro ; B 4 -14 538 597 ; +C -1 ; WX 600 ; N ocircumflex ; B 42 -16 558 696 ; +C -1 ; WX 600 ; N onesuperior ; B 166 247 434 638 ; +C -1 ; WX 600 ; N twosuperior ; B 149 247 429 637 ; +C -1 ; WX 600 ; N threesuperior ; B 157 238 442 637 ; +C -1 ; WX 600 ; N Igrave ; B 83 0 517 839 ; +C -1 ; WX 600 ; N Iacute ; B 83 0 517 839 ; +C -1 ; WX 600 ; N Imacron ; B 83 0 517 769 ; +C -1 ; WX 600 ; N Iogonek ; B 83 -208 517 583 ; +C -1 ; WX 600 ; N Idieresis ; B 83 0 517 798 ; +C -1 ; WX 600 ; N Gbreve ; B 33 -14 592 831 ; +C -1 ; WX 600 ; N Umacron ; B 10 -14 590 769 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 13 -278 602 583 ; +C -1 ; WX 600 ; N ograve ; B 42 -16 558 696 ; +C -1 ; WX 600 ; N Scommaaccent ; B 62 -278 538 597 ; +C -1 ; WX 600 ; N Eogonek ; B 13 -208 587 583 ; +C -1 ; WX 600 ; N oacute ; B 42 -16 558 696 ; +C -1 ; WX 600 ; N Edotaccent ; B 13 0 550 798 ; +C -1 ; WX 600 ; N iogonek ; B 62 -208 540 623 ; +C -1 ; WX 600 ; N gcommaaccent ; B 33 -205 592 721 ; +C -1 ; WX 600 ; N odieresis ; B 42 -16 558 654 ; +C -1 ; WX 600 ; N ntilde ; B 23 0 571 656 ; +C -1 ; WX 600 ; N ncaron ; B 23 0 571 696 ; +C -1 ; WX 600 ; N Ecaron ; B 13 0 550 839 ; +C -1 ; WX 600 ; N Ecircumflex ; B 13 0 550 839 ; +C -1 ; WX 600 ; N scedilla ; B 73 -229 527 450 ; +C -1 ; WX 600 ; N rcaron ; B 54 0 571 696 ; +C -1 ; WX 600 ; N Egrave ; B 13 0 550 839 ; +C -1 ; WX 600 ; N Eacute ; B 13 0 550 839 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 33 -278 592 597 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 13 -278 619 583 ; +C -1 ; WX 600 ; N Edieresis ; B 13 0 550 798 ; +C -1 ; WX 600 ; N nacute ; B 23 0 571 696 ; +C -1 ; WX 600 ; N uogonek ; B 13 -208 571 437 ; +C -1 ; WX 600 ; N umacron ; B 13 -13 571 626 ; +C -1 ; WX 600 ; N Dcaron ; B 13 0 550 839 ; +C -1 ; WX 600 ; N lcaron ; B 62 0 538 637 ; +C -1 ; WX 600 ; N Ccaron ; B 33 -14 564 839 ; +C -1 ; WX 600 ; N Cacute ; B 33 -14 564 839 ; +C -1 ; WX 600 ; N Ccedilla ; B 33 -229 564 597 ; +C -1 ; WX 600 ; N degree ; B 125 243 475 596 ; +C -1 ; WX 600 ; N Aogonek ; B -21 -208 621 583 ; +C -1 ; WX 600 ; N minus ; B 42 230 558 330 ; +C -1 ; WX 600 ; N multiply ; B 100 80 500 480 ; +C -1 ; WX 600 ; N divide ; B 42 28 558 532 ; +C -1 ; WX 600 ; N Aring ; B -21 0 621 871 ; +C -1 ; WX 600 ; N trademark ; B -33 220 620 583 ; +C -1 ; WX 600 ; N rcommaaccent ; B 54 -278 571 449 ; +C -1 ; WX 600 ; N lacute ; B 62 0 538 840 ; +C -1 ; WX 600 ; N omacron ; B 42 -16 558 626 ; +C -1 ; WX 600 ; N Atilde ; B -21 0 621 799 ; +C -1 ; WX 600 ; N icircumflex ; B 62 0 538 696 ; +C -1 ; WX 600 ; N igrave ; B 62 0 538 696 ; +C -1 ; WX 600 ; N ncommaaccent ; B 23 -278 571 450 ; +C -1 ; WX 600 ; N lcommaaccent ; B 62 -278 538 624 ; +C -1 ; WX 600 ; N plusminus ; B 42 0 558 624 ; +C -1 ; WX 600 ; N onehalf ; B -34 0 629 638 ; +C -1 ; WX 600 ; N onequarter ; B -34 0 629 638 ; +C -1 ; WX 600 ; N threequarters ; B -43 0 630 637 ; +C -1 ; WX 600 ; N iacute ; B 62 0 538 696 ; +C -1 ; WX 600 ; N Abreve ; B -21 0 621 831 ; +C -1 ; WX 600 ; N kcommaaccent ; B 33 -278 571 624 ; +C -1 ; WX 600 ; N Omacron ; B 21 -14 579 769 ; +C -1 ; WX 600 ; N imacron ; B 62 0 538 626 ; +C -1 ; WX 600 ; N emacron ; B 33 -16 550 626 ; +C -1 ; WX 600 ; N amacron ; B 42 -16 571 626 ; +C -1 ; WX 600 ; N tcommaaccent ; B 13 -278 529 591 ; +C -1 ; WX 600 ; N ydieresis ; B 21 -205 579 654 ; +C -1 ; WX 600 ; N zdotaccent ; B 85 0 519 654 ; +C -1 ; WX 600 ; N zcaron ; B 85 0 519 696 ; +C -1 ; WX 600 ; N zacute ; B 85 0 519 696 ; +C -1 ; WX 600 ; N yacute ; B 21 -205 579 696 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 13 -13 571 694 ; +C -1 ; WX 600 ; N eth ; B 42 -16 558 646 ; +C -1 ; WX 600 ; N uring ; B 13 -13 571 727 ; +C -1 ; WX 600 ; N Ocircumflex ; B 21 -14 579 839 ; +C -1 ; WX 600 ; N commaaccent ; B 183 -278 351 -59 ; +C -1 ; WX 600 ; N copyright ; B -7 -15 606 598 ; +C -1 ; WX 600 ; N registered ; B -7 -15 606 598 ; +C -1 ; WX 600 ; N Acircumflex ; B -21 0 621 839 ; +C -1 ; WX 600 ; N idieresis ; B 62 0 538 654 ; +C -1 ; WX 600 ; N lozenge ; B 72 -19 529 593 ; +C -1 ; WX 600 ; N Delta ; B 15 0 585 583 ; +C -1 ; WX 600 ; N notequal ; B 42 22 558 525 ; +C -1 ; WX 600 ; N radical ; B 12 -60 642 697 ; +C -1 ; WX 600 ; N Agrave ; B -21 0 621 839 ; +C -1 ; WX 600 ; N Aacute ; B -21 0 621 839 ; +C -1 ; WX 600 ; N lessequal ; B 3 0 549 591 ; +C -1 ; WX 600 ; N greaterequal ; B 35 0 582 591 ; +C -1 ; WX 600 ; N logicalnot ; B 42 115 465 445 ; +C -1 ; WX 600 ; N summation ; B 45 -97 538 671 ; +C -1 ; WX 600 ; N partialdiff ; B 102 -16 524 590 ; +C -1 ; WX 600 ; N Ncommaaccent ; B -8 -278 592 583 ; +C -1 ; WX 600 ; N dcroat ; B 33 -16 613 624 ; +C -1 ; WX 600 ; N brokenbar ; B 250 -153 350 622 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 33 -278 571 583 ; +C -1 ; WX 600 ; N Adieresis ; B -21 0 621 798 ; +C -1 ; WX 600 ; N mu ; B 13 -153 571 437 ; +C -1 ; WX 600 ; N .notdef ; B 375 0 375 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -14 +KPX A Ccedilla -22 +KPX A G -10 +KPX A O -15 +KPX A Odieresis -15 +KPX A Q -16 +KPX A T -27 +KPX A U -23 +KPX A Uacute -23 +KPX A Ucircumflex -23 +KPX A Udieresis -23 +KPX A Ugrave -23 +KPX A V -59 +KPX A W -13 +KPX A Y -27 +KPX A a 15 +KPX A b 45 +KPX A c -4 +KPX A ccedilla -8 +KPX A comma -47 +KPX A d 4 +KPX A e 2 +KPX A g 0 +KPX A guillemotleft -40 +KPX A guilsinglleft -40 +KPX A hyphen -19 +KPX A o -3 +KPX A period -62 +KPX A q -4 +KPX A quotedblright -84 +KPX A quoteright -113 +KPX A t -20 +KPX A u -12 +KPX A v -39 +KPX A w -13 +KPX A y -39 +KPX Aacute C -14 +KPX Aacute G -10 +KPX Aacute O -15 +KPX Aacute Q -16 +KPX Aacute T -27 +KPX Aacute U -23 +KPX Aacute V -59 +KPX Aacute W -13 +KPX Aacute Y -27 +KPX Aacute a 15 +KPX Aacute b 45 +KPX Aacute c -4 +KPX Aacute comma -47 +KPX Aacute d 4 +KPX Aacute e 2 +KPX Aacute g 0 +KPX Aacute guillemotleft -40 +KPX Aacute guilsinglleft -40 +KPX Aacute hyphen -19 +KPX Aacute o -3 +KPX Aacute period -62 +KPX Aacute q -4 +KPX Aacute quoteright -113 +KPX Aacute t -20 +KPX Aacute u -12 +KPX Aacute v -39 +KPX Aacute w -13 +KPX Aacute y -39 +KPX Acircumflex C -14 +KPX Acircumflex G -10 +KPX Acircumflex O -15 +KPX Acircumflex Q -16 +KPX Acircumflex T -27 +KPX Acircumflex U -23 +KPX Acircumflex V -59 +KPX Acircumflex W -13 +KPX Acircumflex Y -27 +KPX Acircumflex comma -47 +KPX Acircumflex period -62 +KPX Adieresis C -14 +KPX Adieresis G -10 +KPX Adieresis O -15 +KPX Adieresis Q -16 +KPX Adieresis T -27 +KPX Adieresis U -23 +KPX Adieresis V -59 +KPX Adieresis W -13 +KPX Adieresis Y -27 +KPX Adieresis a 15 +KPX Adieresis b 45 +KPX Adieresis c -4 +KPX Adieresis comma -47 +KPX Adieresis d 4 +KPX Adieresis g 0 +KPX Adieresis guillemotleft -40 +KPX Adieresis guilsinglleft -40 +KPX Adieresis hyphen -19 +KPX Adieresis o -3 +KPX Adieresis period -62 +KPX Adieresis q -4 +KPX Adieresis quotedblright -84 +KPX Adieresis quoteright -113 +KPX Adieresis t -20 +KPX Adieresis u -12 +KPX Adieresis v -39 +KPX Adieresis w -13 +KPX Adieresis y -39 +KPX Agrave C -14 +KPX Agrave G -10 +KPX Agrave O -15 +KPX Agrave Q -16 +KPX Agrave T -27 +KPX Agrave U -23 +KPX Agrave V -59 +KPX Agrave W -13 +KPX Agrave Y -27 +KPX Agrave comma -47 +KPX Agrave period -62 +KPX Aring C -14 +KPX Aring G -10 +KPX Aring O -15 +KPX Aring Q -16 +KPX Aring T -27 +KPX Aring U -23 +KPX Aring V -59 +KPX Aring W -13 +KPX Aring Y -27 +KPX Aring a 15 +KPX Aring b 45 +KPX Aring c -4 +KPX Aring comma -47 +KPX Aring d 4 +KPX Aring e 2 +KPX Aring g 0 +KPX Aring guillemotleft -40 +KPX Aring guilsinglleft -40 +KPX Aring hyphen -19 +KPX Aring o -3 +KPX Aring period -62 +KPX Aring q -4 +KPX Aring quotedblright -84 +KPX Aring quoteright -113 +KPX Aring t -20 +KPX Aring u -12 +KPX Aring v -39 +KPX Aring w -13 +KPX Aring y -39 +KPX Atilde C -14 +KPX Atilde G -10 +KPX Atilde O -15 +KPX Atilde Q -16 +KPX Atilde T -27 +KPX Atilde U -23 +KPX Atilde V -59 +KPX Atilde W -13 +KPX Atilde Y -27 +KPX Atilde comma -47 +KPX Atilde period -62 +KPX B A 4 +KPX B AE 3 +KPX B Aacute 4 +KPX B Acircumflex 4 +KPX B Adieresis 4 +KPX B Aring 4 +KPX B Atilde 4 +KPX B O -9 +KPX B OE 11 +KPX B Oacute -9 +KPX B Ocircumflex -9 +KPX B Odieresis -9 +KPX B Ograve -9 +KPX B Oslash -5 +KPX B V -18 +KPX B W -6 +KPX B Y -39 +KPX C A 8 +KPX C AE 7 +KPX C Aacute 8 +KPX C Adieresis 8 +KPX C Aring 8 +KPX C H -13 +KPX C K -8 +KPX C O -14 +KPX C Oacute -14 +KPX C Odieresis -14 +KPX Ccedilla A 3 +KPX D A -25 +KPX D Aacute -25 +KPX D Acircumflex -25 +KPX D Adieresis -25 +KPX D Agrave -25 +KPX D Aring -25 +KPX D Atilde -25 +KPX D J -32 +KPX D T -27 +KPX D V -30 +KPX D W -13 +KPX D X -37 +KPX D Y -51 +KPX F A -39 +KPX F Aacute -39 +KPX F Acircumflex -39 +KPX F Adieresis -39 +KPX F Agrave -39 +KPX F Aring -39 +KPX F Atilde -39 +KPX F J -78 +KPX F O -24 +KPX F Odieresis -24 +KPX F a -40 +KPX F aacute -40 +KPX F adieresis -40 +KPX F ae -18 +KPX F aring -40 +KPX F comma -168 +KPX F e -47 +KPX F eacute -47 +KPX F hyphen -55 +KPX F i -46 +KPX F j -54 +KPX F o -51 +KPX F oacute -51 +KPX F odieresis -51 +KPX F oe -16 +KPX F oslash -51 +KPX F period -187 +KPX F r -32 +KPX F u -1 +KPX G A 6 +KPX G AE 5 +KPX G Aacute 6 +KPX G Acircumflex 6 +KPX G Adieresis 6 +KPX G Agrave 6 +KPX G Aring 6 +KPX G Atilde 6 +KPX G T -25 +KPX G V 6 +KPX G W 6 +KPX G Y -14 +KPX J A -8 +KPX J AE -16 +KPX J Adieresis -8 +KPX J Aring -8 +KPX K C -24 +KPX K G -19 +KPX K O -25 +KPX K OE -4 +KPX K Oacute -25 +KPX K Odieresis -25 +KPX K S -9 +KPX K T -13 +KPX K a 6 +KPX K adieresis 6 +KPX K ae 31 +KPX K aring 6 +KPX K e -6 +KPX K hyphen -44 +KPX K o -12 +KPX K oacute -12 +KPX K odieresis -12 +KPX K u -22 +KPX K udieresis -22 +KPX K y -50 +KPX L A 16 +KPX L AE 16 +KPX L Aacute 16 +KPX L Adieresis 16 +KPX L Aring 16 +KPX L C -10 +KPX L Ccedilla -11 +KPX L G -10 +KPX L O -7 +KPX L Oacute -7 +KPX L Ocircumflex -7 +KPX L Odieresis -7 +KPX L Ograve -7 +KPX L Otilde -7 +KPX L S -24 +KPX L T -52 +KPX L U -29 +KPX L Udieresis -29 +KPX L V -57 +KPX L W -22 +KPX L Y -52 +KPX L hyphen 9 +KPX L quotedblright -72 +KPX L quoteright -99 +KPX L u -10 +KPX L udieresis -11 +KPX L y -33 +KPX N A -3 +KPX N AE -3 +KPX N Aacute -3 +KPX N Adieresis -3 +KPX N Aring -3 +KPX N C -7 +KPX N Ccedilla -6 +KPX N G -6 +KPX N O -5 +KPX N Oacute -5 +KPX N Odieresis -5 +KPX N a -11 +KPX N aacute -11 +KPX N adieresis -11 +KPX N ae 18 +KPX N aring -11 +KPX N comma -75 +KPX N e -3 +KPX N eacute -3 +KPX N o -8 +KPX N oacute -8 +KPX N odieresis -8 +KPX N oslash -3 +KPX N period -93 +KPX N u -8 +KPX N udieresis -8 +KPX O A -14 +KPX O AE -14 +KPX O Aacute -14 +KPX O Adieresis -14 +KPX O Aring -14 +KPX O T -15 +KPX O V -23 +KPX O W -2 +KPX O X -26 +KPX O Y -43 +KPX Oacute A -14 +KPX Oacute T -15 +KPX Oacute V -23 +KPX Oacute W -2 +KPX Oacute Y -43 +KPX Ocircumflex T -15 +KPX Ocircumflex V -23 +KPX Ocircumflex Y -43 +KPX Odieresis A -14 +KPX Odieresis T -15 +KPX Odieresis V -23 +KPX Odieresis W -2 +KPX Odieresis X -26 +KPX Odieresis Y -43 +KPX Ograve T -15 +KPX Ograve V -23 +KPX Ograve Y -43 +KPX Oslash A -10 +KPX Otilde T -15 +KPX Otilde V -23 +KPX Otilde Y -43 +KPX P A -61 +KPX P AE -59 +KPX P Aacute -61 +KPX P Adieresis -61 +KPX P Aring -61 +KPX P J -73 +KPX P a -49 +KPX P aacute -49 +KPX P adieresis -49 +KPX P ae -27 +KPX P aring -49 +KPX P comma -160 +KPX P e -38 +KPX P eacute -38 +KPX P hyphen -33 +KPX P o -42 +KPX P oacute -42 +KPX P odieresis -42 +KPX P oe -13 +KPX P oslash -42 +KPX P period -178 +KPX R C -14 +KPX R Ccedilla -17 +KPX R G -10 +KPX R O -14 +KPX R OE 5 +KPX R Oacute -14 +KPX R Odieresis -14 +KPX R T -28 +KPX R U -16 +KPX R Udieresis -17 +KPX R V -24 +KPX R W -8 +KPX R Y -28 +KPX R a 14 +KPX R aacute 14 +KPX R adieresis 14 +KPX R ae 40 +KPX R aring 14 +KPX R e 2 +KPX R eacute 2 +KPX R hyphen -25 +KPX R o -3 +KPX R oacute -3 +KPX R odieresis -3 +KPX R oe 29 +KPX R u -7 +KPX R uacute -8 +KPX R udieresis -8 +KPX R y -18 +KPX S A -10 +KPX S AE -10 +KPX S Aacute -10 +KPX S Adieresis -10 +KPX S Aring -10 +KPX S T -41 +KPX S V -10 +KPX S W -12 +KPX S Y -31 +KPX S t -17 +KPX T A -28 +KPX T AE -28 +KPX T Aacute -28 +KPX T Acircumflex -28 +KPX T Adieresis -28 +KPX T Agrave -28 +KPX T Aring -28 +KPX T Atilde -28 +KPX T C -19 +KPX T G -19 +KPX T J -65 +KPX T O -14 +KPX T OE 6 +KPX T Oacute -14 +KPX T Ocircumflex -14 +KPX T Odieresis -14 +KPX T Ograve -14 +KPX T Oslash -14 +KPX T Otilde -14 +KPX T S -41 +KPX T V 10 +KPX T W 4 +KPX T Y -10 +KPX T a -34 +KPX T ae -12 +KPX T c -37 +KPX T colon -112 +KPX T comma -130 +KPX T e -26 +KPX T g -24 +KPX T guillemotleft -73 +KPX T guilsinglleft -73 +KPX T hyphen -91 +KPX T i -42 +KPX T j -49 +KPX T o -31 +KPX T oslash -31 +KPX T period -148 +KPX T r -28 +KPX T s -39 +KPX T semicolon -100 +KPX T u 4 +KPX T v 10 +KPX T w 10 +KPX T y 0 +KPX U A -19 +KPX U AE -18 +KPX U Aacute -19 +KPX U Acircumflex -19 +KPX U Adieresis -19 +KPX U Aring -19 +KPX U Atilde -19 +KPX U comma -95 +KPX U m 16 +KPX U n -8 +KPX U p 0 +KPX U period -114 +KPX U r -34 +KPX Uacute A -19 +KPX Uacute comma -95 +KPX Uacute m 16 +KPX Uacute n -8 +KPX Uacute p 0 +KPX Uacute period -114 +KPX Uacute r -34 +KPX Ucircumflex A -19 +KPX Udieresis A -19 +KPX Udieresis b 27 +KPX Udieresis comma -95 +KPX Udieresis m 16 +KPX Udieresis n -8 +KPX Udieresis p 0 +KPX Udieresis period -114 +KPX Udieresis r -34 +KPX Ugrave A -19 +KPX V A -4 +KPX V AE -12 +KPX V Aacute -4 +KPX V Acircumflex -4 +KPX V Adieresis -4 +KPX V Agrave -4 +KPX V Aring -4 +KPX V Atilde -4 +KPX V C -24 +KPX V G -24 +KPX V O -23 +KPX V Oacute -23 +KPX V Ocircumflex -23 +KPX V Odieresis -23 +KPX V Ograve -23 +KPX V Oslash -23 +KPX V Otilde -23 +KPX V S -27 +KPX V T 10 +KPX V a -54 +KPX V ae -27 +KPX V colon -132 +KPX V comma -146 +KPX V e -47 +KPX V g -46 +KPX V guillemotleft -75 +KPX V guilsinglleft -75 +KPX V hyphen -39 +KPX V i -59 +KPX V o -52 +KPX V oslash -48 +KPX V period -164 +KPX V r -45 +KPX V semicolon -120 +KPX V u -15 +KPX V y -17 +KPX W A -9 +KPX W AE -9 +KPX W Aacute -9 +KPX W Acircumflex -9 +KPX W Adieresis -9 +KPX W Agrave -9 +KPX W Aring -9 +KPX W Atilde -9 +KPX W C -4 +KPX W G -3 +KPX W O -2 +KPX W Oacute -2 +KPX W Ocircumflex -2 +KPX W Odieresis -2 +KPX W Ograve -2 +KPX W Oslash 2 +KPX W Otilde -2 +KPX W S -17 +KPX W T 4 +KPX W a -11 +KPX W ae 17 +KPX W colon -99 +KPX W comma -83 +KPX W e -3 +KPX W g -3 +KPX W guillemotleft -31 +KPX W guilsinglleft -31 +KPX W hyphen 1 +KPX W i -38 +KPX W o -8 +KPX W oslash -4 +KPX W period -101 +KPX W r -25 +KPX W semicolon -82 +KPX W u 1 +KPX W y -2 +KPX X C -28 +KPX X O -26 +KPX X Odieresis -26 +KPX X Q -26 +KPX X a 0 +KPX X e -12 +KPX X hyphen -50 +KPX X o -18 +KPX X u -28 +KPX X y -43 +KPX Y A -25 +KPX Y AE -28 +KPX Y Aacute -25 +KPX Y Acircumflex -25 +KPX Y Adieresis -25 +KPX Y Agrave -25 +KPX Y Aring -25 +KPX Y Atilde -25 +KPX Y C -45 +KPX Y G -45 +KPX Y O -44 +KPX Y Oacute -44 +KPX Y Ocircumflex -44 +KPX Y Odieresis -44 +KPX Y Ograve -44 +KPX Y Oslash -43 +KPX Y Otilde -44 +KPX Y S -48 +KPX Y T -10 +KPX Y a -53 +KPX Y ae -28 +KPX Y colon -150 +KPX Y comma -118 +KPX Y e -59 +KPX Y g -59 +KPX Y guillemotleft -94 +KPX Y guilsinglleft -94 +KPX Y hyphen -81 +KPX Y i -58 +KPX Y o -64 +KPX Y oslash -51 +KPX Y p -30 +KPX Y period -136 +KPX Y semicolon -133 +KPX Y u -43 +KPX Y v -33 +KPX Z v -41 +KPX Z y -52 +KPX a j -81 +KPX a quoteright -78 +KPX a v -21 +KPX a w -12 +KPX a y -31 +KPX aacute v -21 +KPX aacute w -12 +KPX aacute y -31 +KPX adieresis v -21 +KPX adieresis w -12 +KPX adieresis y -31 +KPX ae v 28 +KPX ae w 32 +KPX ae y 18 +KPX agrave v -21 +KPX agrave w -12 +KPX agrave y -31 +KPX aring v -21 +KPX aring w -12 +KPX aring y -31 +KPX b v 0 +KPX b w 4 +KPX b y -10 +KPX c h 11 +KPX c k 6 +KPX comma one -128 +KPX comma quotedblright -137 +KPX comma quoteright -166 +KPX e quoteright -65 +KPX e t -16 +KPX e v -9 +KPX e w -3 +KPX e x 6 +KPX e y -20 +KPX eacute v -9 +KPX eacute w -3 +KPX eacute y -20 +KPX ecircumflex v -9 +KPX ecircumflex w -3 +KPX ecircumflex y -20 +KPX eight four -58 +KPX eight one -72 +KPX eight seven -65 +KPX f a -32 +KPX f aacute -32 +KPX f adieresis -32 +KPX f ae -7 +KPX f aring -32 +KPX f e -43 +KPX f eacute -43 +KPX f f -43 +KPX f i -37 +KPX f j -60 +KPX f l -25 +KPX f o -47 +KPX f oacute -47 +KPX f odieresis -42 +KPX f oe -15 +KPX f oslash -29 +KPX f quoteright -73 +KPX f s -42 +KPX f t -6 +KPX five four -52 +KPX five one -73 +KPX five seven -73 +KPX four four -62 +KPX four one -66 +KPX four seven -93 +KPX g a -4 +KPX g adieresis -4 +KPX g ae 23 +KPX g aring -4 +KPX g e 1 +KPX g eacute 1 +KPX g l -34 +KPX g oacute -3 +KPX g odieresis -3 +KPX g r 0 +KPX guillemotright A -37 +KPX guillemotright AE -34 +KPX guillemotright Aacute -37 +KPX guillemotright Adieresis -37 +KPX guillemotright Aring -37 +KPX guillemotright T -71 +KPX guillemotright V -72 +KPX guillemotright W -29 +KPX guillemotright Y -92 +KPX guilsinglright A -37 +KPX guilsinglright AE -34 +KPX guilsinglright Aacute -37 +KPX guilsinglright Adieresis -37 +KPX guilsinglright Aring -37 +KPX guilsinglright T -71 +KPX guilsinglright V -72 +KPX guilsinglright W -29 +KPX guilsinglright Y -92 +KPX h quoteright -69 +KPX h y -23 +KPX hyphen A -18 +KPX hyphen AE -14 +KPX hyphen Aacute -18 +KPX hyphen Adieresis -18 +KPX hyphen Aring -18 +KPX hyphen T -90 +KPX hyphen V -38 +KPX hyphen W 1 +KPX hyphen Y -81 +KPX i T -58 +KPX i j -143 +KPX k a 1 +KPX k aacute 1 +KPX k adieresis 1 +KPX k ae 26 +KPX k aring 1 +KPX k comma -63 +KPX k e -11 +KPX k eacute -11 +KPX k g -14 +KPX k hyphen -50 +KPX k o -17 +KPX k oacute -17 +KPX k odieresis -17 +KPX k period -75 +KPX k s -9 +KPX k u -3 +KPX k udieresis -3 +KPX l v -77 +KPX l y -77 +KPX m p 32 +KPX m v 18 +KPX m w 22 +KPX m y 8 +KPX n T -40 +KPX n p 4 +KPX n quoteright -68 +KPX n v -12 +KPX n w -5 +KPX n y -22 +KPX nine four -53 +KPX nine one -66 +KPX nine seven -57 +KPX o T -31 +KPX o quoteright -62 +KPX o t -13 +KPX o v -6 +KPX o w -3 +KPX o x -10 +KPX o y -17 +KPX oacute v -6 +KPX oacute w -3 +KPX oacute y -17 +KPX ocircumflex t -13 +KPX odieresis t -13 +KPX odieresis v -6 +KPX odieresis w -3 +KPX odieresis x -10 +KPX odieresis y -17 +KPX ograve v -6 +KPX ograve w -3 +KPX ograve y -17 +KPX one comma -99 +KPX one eight -74 +KPX one five -55 +KPX one four -87 +KPX one nine -73 +KPX one one -62 +KPX one period -114 +KPX one seven -141 +KPX one six -98 +KPX one three -53 +KPX one two -47 +KPX one zero -86 +KPX p t -3 +KPX p y -6 +KPX period one -113 +KPX period quotedblright -131 +KPX period quoteright -161 +KPX q c 2 +KPX q u 41 +KPX quotedblbase A -6 +KPX quotedblbase AE -7 +KPX quotedblbase T -90 +KPX quotedblbase V -104 +KPX quotedblbase W -43 +KPX quotedblbase Y -78 +KPX quotedblleft A -62 +KPX quotedblleft AE -60 +KPX quotedblleft Aacute -62 +KPX quotedblleft Adieresis -62 +KPX quotedblleft Aring -62 +KPX quotedblleft T -24 +KPX quotedblleft V -22 +KPX quotedblleft W -13 +KPX quotedblleft Y -49 +KPX quotedblright A -76 +KPX quotedblright AE -75 +KPX quotedblright Aacute -76 +KPX quotedblright Adieresis -76 +KPX quotedblright Aring -76 +KPX quotedblright T -39 +KPX quotedblright V -30 +KPX quotedblright W -26 +KPX quotedblright Y -51 +KPX quoteleft A -87 +KPX quoteleft AE -85 +KPX quoteleft Aacute -87 +KPX quoteleft Adieresis -87 +KPX quoteleft Aring -87 +KPX quoteleft T -49 +KPX quoteleft V -46 +KPX quoteleft W -38 +KPX quoteleft Y -73 +KPX quoteright A -154 +KPX quoteright AE -153 +KPX quoteright Aacute -154 +KPX quoteright Adieresis -154 +KPX quoteright Aring -154 +KPX quoteright comma -227 +KPX quoteright d -140 +KPX quoteright o -143 +KPX quoteright period -244 +KPX quoteright r -149 +KPX quoteright s -150 +KPX quoteright t -117 +KPX quoteright v -110 +KPX quoteright w -105 +KPX quoteright y -116 +KPX r a -17 +KPX r aacute -17 +KPX r acircumflex -17 +KPX r adieresis -17 +KPX r ae 4 +KPX r agrave -17 +KPX r aring -17 +KPX r c -18 +KPX r ccedilla -15 +KPX r colon -95 +KPX r comma -108 +KPX r d -8 +KPX r e -7 +KPX r eacute -7 +KPX r ecircumflex -7 +KPX r egrave -7 +KPX r f -16 +KPX r g -5 +KPX r h -20 +KPX r hyphen -41 +KPX r i -25 +KPX r j -33 +KPX r k -30 +KPX r l -47 +KPX r m 36 +KPX r n 10 +KPX r o -12 +KPX r oacute -12 +KPX r ocircumflex -12 +KPX r odieresis -12 +KPX r oe 18 +KPX r ograve -12 +KPX r oslash -12 +KPX r p 30 +KPX r period -122 +KPX r q -4 +KPX r quoteright -41 +KPX r r -11 +KPX r s -21 +KPX r semicolon -83 +KPX r t 20 +KPX r u 20 +KPX r v 26 +KPX r w 26 +KPX r x 7 +KPX r y 16 +KPX r z -21 +KPX s quoteright -60 +KPX s t -11 +KPX seven colon -156 +KPX seven comma -157 +KPX seven eight -74 +KPX seven five -82 +KPX seven four -101 +KPX seven one -67 +KPX seven period -176 +KPX seven seven -62 +KPX seven six -93 +KPX seven three -72 +KPX seven two -64 +KPX six four -49 +KPX six one -54 +KPX six seven -46 +KPX t S -35 +KPX t a -16 +KPX t aacute -16 +KPX t adieresis -16 +KPX t ae 9 +KPX t aring -16 +KPX t colon -117 +KPX t e -24 +KPX t eacute -24 +KPX t h -5 +KPX t o -30 +KPX t oacute -30 +KPX t odieresis -30 +KPX t quoteright -102 +KPX t semicolon -103 +KPX three four -52 +KPX three one -71 +KPX three seven -64 +KPX two four -67 +KPX two one -66 +KPX two seven -68 +KPX u quoteright -56 +KPX v a -3 +KPX v aacute -3 +KPX v acircumflex -3 +KPX v adieresis -3 +KPX v ae 18 +KPX v agrave -3 +KPX v aring -3 +KPX v atilde -3 +KPX v c -11 +KPX v colon -81 +KPX v comma -136 +KPX v e 0 +KPX v eacute 0 +KPX v ecircumflex 0 +KPX v egrave 0 +KPX v g 1 +KPX v hyphen -23 +KPX v l -77 +KPX v o -5 +KPX v oacute -5 +KPX v odieresis -5 +KPX v ograve -5 +KPX v oslash -5 +KPX v period -156 +KPX v s -11 +KPX v semicolon -69 +KPX w a -3 +KPX w aacute -3 +KPX w acircumflex -3 +KPX w adieresis -3 +KPX w ae 23 +KPX w agrave -3 +KPX w aring -3 +KPX w atilde -3 +KPX w c -6 +KPX w colon -81 +KPX w comma -90 +KPX w e 2 +KPX w eacute 2 +KPX w ecircumflex 2 +KPX w egrave 2 +KPX w g 3 +KPX w hyphen 3 +KPX w l -48 +KPX w o -2 +KPX w oacute -2 +KPX w odieresis -2 +KPX w ograve -2 +KPX w oslash 2 +KPX w period -109 +KPX w s -11 +KPX w semicolon -69 +KPX x a 5 +KPX x c -14 +KPX x e -5 +KPX x eacute -5 +KPX x o -10 +KPX x q -8 +KPX y a -13 +KPX y aacute -13 +KPX y acircumflex -13 +KPX y adieresis -13 +KPX y ae 8 +KPX y agrave -13 +KPX y aring -13 +KPX y atilde -13 +KPX y c -21 +KPX y colon -91 +KPX y comma -134 +KPX y e -11 +KPX y eacute -11 +KPX y ecircumflex -11 +KPX y egrave -11 +KPX y g -9 +KPX y hyphen -19 +KPX y l -78 +KPX y o -15 +KPX y oacute -15 +KPX y odieresis -15 +KPX y ograve -15 +KPX y oslash -15 +KPX y period -155 +KPX y s -21 +KPX y semicolon -79 +KPX zero four -59 +KPX zero one -76 +KPX zero seven -68 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n022004l.pfb b/pdf2swf/fonts/n022004l.pfb new file mode 100644 index 00000000..f1da6121 Binary files /dev/null and b/pdf2swf/fonts/n022004l.pfb differ diff --git a/pdf2swf/fonts/n022023l.afm b/pdf2swf/fonts/n022023l.afm new file mode 100644 index 00000000..718ec5de --- /dev/null +++ b/pdf2swf/fonts/n022023l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusMonL-ReguObli +FullName Nimbus Mono L Regular Oblique +FamilyName Nimbus Mono L +Weight Regular +ItalicAngle -12.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -61 -237 774 811 +CapHeight 563 +XHeight 417 +Descender -186 +Ascender 604 +StartCharMetrics 316 +C 32 ; WX 600 ; N space ; B 319 0 319 0 ; +C 33 ; WX 600 ; N exclam ; B 246 -15 463 618 ; +C 34 ; WX 600 ; N quotedbl ; B 254 315 582 604 ; +C 35 ; WX 600 ; N numbersign ; B 137 -62 589 647 ; +C 36 ; WX 600 ; N dollar ; B 131 -92 582 655 ; +C 37 ; WX 600 ; N percent ; B 137 -12 591 611 ; +C 38 ; WX 600 ; N ampersand ; B 132 -16 527 519 ; +C 39 ; WX 600 ; N quoteright ; B 207 314 468 604 ; +C 40 ; WX 600 ; N parenleft ; B 335 -124 583 604 ; +C 41 ; WX 600 ; N parenright ; B 124 -124 372 604 ; +C 42 ; WX 600 ; N asterisk ; B 211 250 586 604 ; +C 43 ; WX 600 ; N plus ; B 131 32 588 530 ; +C 44 ; WX 600 ; N comma ; B 110 -145 371 145 ; +C 45 ; WX 600 ; N hyphen ; B 131 258 588 299 ; +C 46 ; WX 600 ; N period ; B 235 -15 386 116 ; +C 47 ; WX 600 ; N slash ; B 99 -81 625 668 ; +C 48 ; WX 600 ; N zero ; B 156 -15 571 618 ; +C 49 ; WX 600 ; N one ; B 117 0 492 612 ; +C 50 ; WX 600 ; N two ; B 84 0 572 618 ; +C 51 ; WX 600 ; N three ; B 110 -15 579 618 ; +C 52 ; WX 600 ; N four ; B 141 0 545 604 ; +C 53 ; WX 600 ; N five ; B 113 -15 584 604 ; +C 54 ; WX 600 ; N six ; B 184 -15 631 618 ; +C 55 ; WX 600 ; N seven ; B 215 -1 606 604 ; +C 56 ; WX 600 ; N eight ; B 143 -15 576 618 ; +C 57 ; WX 600 ; N nine ; B 142 -15 589 618 ; +C 58 ; WX 600 ; N colon ; B 235 -15 450 417 ; +C 59 ; WX 600 ; N semicolon ; B 114 -145 426 417 ; +C 60 ; WX 600 ; N less ; B 131 44 627 518 ; +C 61 ; WX 600 ; N equal ; B 95 190 625 375 ; +C 62 ; WX 600 ; N greater ; B 92 44 588 518 ; +C 63 ; WX 600 ; N question ; B 231 -15 581 577 ; +C 64 ; WX 600 ; N at ; B 139 -62 561 624 ; +C 65 ; WX 600 ; N A ; B 13 0 596 563 ; +C 66 ; WX 600 ; N B ; B 47 0 591 563 ; +C 67 ; WX 600 ; N C ; B 110 -16 635 576 ; +C 68 ; WX 600 ; N D ; B 47 0 592 563 ; +C 69 ; WX 600 ; N E ; B 47 0 619 563 ; +C 70 ; WX 600 ; N F ; B 47 0 640 563 ; +C 71 ; WX 600 ; N G ; B 108 -16 636 576 ; +C 72 ; WX 600 ; N H ; B 57 0 646 563 ; +C 73 ; WX 600 ; N I ; B 117 0 603 563 ; +C 74 ; WX 600 ; N J ; B 100 -16 699 563 ; +C 75 ; WX 600 ; N K ; B 47 0 662 563 ; +C 76 ; WX 600 ; N L ; B 67 0 585 563 ; +C 77 ; WX 600 ; N M ; B 15 0 700 563 ; +C 78 ; WX 600 ; N N ; B 46 0 678 563 ; +C 79 ; WX 600 ; N O ; B 102 -16 616 576 ; +C 80 ; WX 600 ; N P ; B 47 0 587 563 ; +C 81 ; WX 600 ; N Q ; B 102 -115 616 576 ; +C 82 ; WX 600 ; N R ; B 47 0 594 563 ; +C 83 ; WX 600 ; N S ; B 96 -17 602 577 ; +C 84 ; WX 600 ; N T ; B 152 0 648 563 ; +C 85 ; WX 600 ; N U ; B 136 -16 676 563 ; +C 86 ; WX 600 ; N V ; B 124 0 707 563 ; +C 87 ; WX 600 ; N W ; B 122 0 696 563 ; +C 88 ; WX 600 ; N X ; B 44 0 662 563 ; +C 89 ; WX 600 ; N Y ; B 153 0 665 563 ; +C 90 ; WX 600 ; N Z ; B 103 0 590 563 ; +C 91 ; WX 600 ; N bracketleft ; B 254 -124 570 604 ; +C 92 ; WX 600 ; N backslash ; B 250 -81 474 668 ; +C 93 ; WX 600 ; N bracketright ; B 132 -124 448 604 ; +C 94 ; WX 600 ; N asciicircum ; B 192 354 567 615 ; +C 95 ; WX 600 ; N underscore ; B -61 -125 564 -75 ; +C 96 ; WX 600 ; N quoteleft ; B 388 343 544 604 ; +C 97 ; WX 600 ; N a ; B 93 -16 546 431 ; +C 98 ; WX 600 ; N b ; B 26 -16 591 604 ; +C 99 ; WX 600 ; N c ; B 121 -17 596 432 ; +C 100 ; WX 600 ; N d ; B 102 -16 630 604 ; +C 101 ; WX 600 ; N e ; B 104 -16 570 431 ; +C 102 ; WX 600 ; N f ; B 109 0 663 604 ; +C 103 ; WX 600 ; N g ; B 105 -186 647 431 ; +C 104 ; WX 600 ; N h ; B 55 0 556 604 ; +C 105 ; WX 600 ; N i ; B 96 0 513 624 ; +C 106 ; WX 600 ; N j ; B 112 -186 547 624 ; +C 107 ; WX 600 ; N k ; B 67 0 578 604 ; +C 108 ; WX 600 ; N l ; B 96 0 513 604 ; +C 109 ; WX 600 ; N m ; B 15 0 603 431 ; +C 110 ; WX 600 ; N n ; B 57 0 546 431 ; +C 111 ; WX 600 ; N o ; B 111 -16 577 431 ; +C 112 ; WX 600 ; N p ; B -13 -186 593 431 ; +C 113 ; WX 600 ; N q ; B 105 -186 668 431 ; +C 114 ; WX 600 ; N r ; B 88 0 619 427 ; +C 115 ; WX 600 ; N s ; B 108 -17 558 431 ; +C 116 ; WX 600 ; N t ; B 127 -16 518 563 ; +C 117 ; WX 600 ; N u ; B 127 -16 569 417 ; +C 118 ; WX 600 ; N v ; B 114 0 655 417 ; +C 119 ; WX 600 ; N w ; B 114 0 655 417 ; +C 120 ; WX 600 ; N x ; B 55 0 611 417 ; +C 121 ; WX 600 ; N y ; B 22 -186 634 417 ; +C 122 ; WX 600 ; N z ; B 115 0 563 417 ; +C 123 ; WX 600 ; N braceleft ; B 248 -124 528 604 ; +C 124 ; WX 600 ; N bar ; B 257 -124 444 604 ; +C 125 ; WX 600 ; N braceright ; B 175 -124 455 604 ; +C 126 ; WX 600 ; N asciitilde ; B 145 212 575 348 ; +C 161 ; WX 600 ; N exclamdown ; B 222 -216 439 417 ; +C 162 ; WX 600 ; N cent ; B 175 -13 563 630 ; +C 163 ; WX 600 ; N sterling ; B 90 0 541 578 ; +C 164 ; WX 600 ; N fraction ; B 84 138 645 470 ; +C 165 ; WX 600 ; N yen ; B 161 0 665 563 ; +C 166 ; WX 600 ; N florin ; B 74 -93 643 618 ; +C 167 ; WX 600 ; N section ; B 91 -62 624 603 ; +C 168 ; WX 600 ; N currency ; B 127 95 597 489 ; +C 169 ; WX 600 ; N quotesingle ; B 344 315 492 604 ; +C 170 ; WX 600 ; N quotedblleft ; B 221 343 586 604 ; +C 171 ; WX 600 ; N guillemotleft ; B 108 0 626 417 ; +C 172 ; WX 600 ; N guilsinglleft ; B 108 0 397 417 ; +C 173 ; WX 600 ; N guilsinglright ; B 297 0 585 417 ; +C 174 ; WX 600 ; N fi ; B 14 0 615 624 ; +C 175 ; WX 600 ; N fl ; B 14 0 611 604 ; +C 177 ; WX 600 ; N endash ; B 131 261 588 302 ; +C 178 ; WX 600 ; N dagger ; B 208 -63 561 604 ; +C 179 ; WX 600 ; N daggerdbl ; B 154 -62 561 604 ; +C 180 ; WX 600 ; N periodcentered ; B 285 217 436 348 ; +C 182 ; WX 600 ; N paragraph ; B 152 -62 648 604 ; +C 183 ; WX 600 ; N bullet ; B 253 141 449 337 ; +C 184 ; WX 600 ; N quotesinglbase ; B 110 -145 371 145 ; +C 185 ; WX 600 ; N quotedblbase ; B 73 -116 538 145 ; +C 186 ; WX 600 ; N quotedblright ; B 170 343 635 604 ; +C 187 ; WX 600 ; N guillemotright ; B 67 0 585 417 ; +C 188 ; WX 600 ; N ellipsis ; B 57 -15 557 84 ; +C 189 ; WX 600 ; N perthousand ; B 91 -9 598 614 ; +C 191 ; WX 600 ; N questiondown ; B 105 -175 455 417 ; +C 193 ; WX 600 ; N grave ; B 286 490 429 639 ; +C 194 ; WX 600 ; N acute ; B 388 490 577 639 ; +C 195 ; WX 600 ; N circumflex ; B 263 490 554 639 ; +C 196 ; WX 600 ; N tilde ; B 258 516 579 605 ; +C 197 ; WX 600 ; N macron ; B 273 536 564 576 ; +C 198 ; WX 600 ; N breve ; B 280 489 574 621 ; +C 199 ; WX 600 ; N dotaccent ; B 368 511 470 611 ; +C 200 ; WX 600 ; N dieresis ; B 258 511 581 611 ; +C 202 ; WX 600 ; N ring ; B 326 480 516 661 ; +C 203 ; WX 600 ; N cedilla ; B 181 -173 356 0 ; +C 205 ; WX 600 ; N hungarumlaut ; B 263 490 576 633 ; +C 206 ; WX 600 ; N ogonek ; B 258 -155 408 0 ; +C 207 ; WX 600 ; N caron ; B 286 490 577 639 ; +C 208 ; WX 600 ; N emdash ; B 60 261 659 302 ; +C 225 ; WX 600 ; N AE ; B 14 0 690 563 ; +C 227 ; WX 600 ; N ordfeminine ; B 229 279 511 574 ; +C 232 ; WX 600 ; N Lslash ; B 66 0 586 563 ; +C 233 ; WX 600 ; N Oslash ; B 34 -43 685 605 ; +C 234 ; WX 600 ; N OE ; B 62 0 690 563 ; +C 235 ; WX 600 ; N ordmasculine ; B 243 284 543 577 ; +C 241 ; WX 600 ; N ae ; B 36 -16 630 431 ; +C 245 ; WX 600 ; N dotlessi ; B 96 0 513 417 ; +C 248 ; WX 600 ; N lslash ; B 96 0 524 604 ; +C 249 ; WX 600 ; N oslash ; B 47 -43 637 458 ; +C 250 ; WX 600 ; N oe ; B 50 -16 630 431 ; +C 251 ; WX 600 ; N germandbls ; B 47 -16 539 604 ; +C -1 ; WX 600 ; N Udieresis ; B 136 -16 676 762 ; +C -1 ; WX 600 ; N Uacute ; B 136 -16 676 789 ; +C -1 ; WX 600 ; N Scedilla ; B 96 -179 602 577 ; +C -1 ; WX 600 ; N Tcaron ; B 152 0 648 789 ; +C -1 ; WX 600 ; N Scaron ; B 96 -17 618 789 ; +C -1 ; WX 600 ; N Rcaron ; B 47 0 594 789 ; +C -1 ; WX 600 ; N Racute ; B 47 0 594 789 ; +C -1 ; WX 600 ; N Sacute ; B 96 -17 602 789 ; +C -1 ; WX 600 ; N Otilde ; B 103 -16 618 755 ; +C -1 ; WX 600 ; N ucircumflex ; B 127 -16 569 639 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 102 -16 672 787 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 136 -16 676 787 ; +C -1 ; WX 600 ; N Yacute ; B 153 0 665 789 ; +C -1 ; WX 600 ; N Eth ; B 47 0 592 563 ; +C -1 ; WX 600 ; N Dcroat ; B 47 0 592 563 ; +C -1 ; WX 600 ; N Zacute ; B 103 0 590 789 ; +C -1 ; WX 600 ; N Uring ; B 136 -16 676 807 ; +C -1 ; WX 600 ; N gbreve ; B 105 -186 647 621 ; +C -1 ; WX 600 ; N eogonek ; B 104 -155 570 431 ; +C -1 ; WX 600 ; N edotaccent ; B 104 -16 570 611 ; +C -1 ; WX 600 ; N ecaron ; B 104 -16 577 639 ; +C -1 ; WX 600 ; N Ugrave ; B 136 -16 676 789 ; +C -1 ; WX 600 ; N Thorn ; B 47 0 566 563 ; +C -1 ; WX 600 ; N eacute ; B 104 -16 570 639 ; +C -1 ; WX 600 ; N edieresis ; B 104 -16 586 611 ; +C -1 ; WX 600 ; N dcaron ; B 102 -16 774 618 ; +C -1 ; WX 600 ; N ccedilla ; B 122 -173 596 431 ; +C -1 ; WX 600 ; N ccaron ; B 121 -17 596 639 ; +C -1 ; WX 600 ; N cacute ; B 121 -17 596 639 ; +C -1 ; WX 600 ; N aogonek ; B 93 -155 546 431 ; +C -1 ; WX 600 ; N aring ; B 93 -16 546 661 ; +C -1 ; WX 600 ; N atilde ; B 93 -16 570 605 ; +C -1 ; WX 600 ; N abreve ; B 93 -16 574 621 ; +C -1 ; WX 600 ; N egrave ; B 104 -16 570 639 ; +C -1 ; WX 600 ; N agrave ; B 93 -16 546 639 ; +C -1 ; WX 600 ; N aacute ; B 93 -16 546 639 ; +C -1 ; WX 600 ; N adieresis ; B 93 -16 571 611 ; +C -1 ; WX 600 ; N Uogonek ; B 136 -155 676 563 ; +C -1 ; WX 600 ; N ugrave ; B 127 -16 569 639 ; +C -1 ; WX 600 ; N uacute ; B 127 -16 569 639 ; +C -1 ; WX 600 ; N udieresis ; B 127 -16 573 611 ; +C -1 ; WX 600 ; N tcaron ; B 127 -16 593 618 ; +C -1 ; WX 600 ; N scommaaccent ; B 108 -237 558 431 ; +C -1 ; WX 600 ; N Zcaron ; B 103 0 604 789 ; +C -1 ; WX 600 ; N ecircumflex ; B 104 -16 570 639 ; +C -1 ; WX 600 ; N Ucircumflex ; B 136 -16 676 789 ; +C -1 ; WX 600 ; N acircumflex ; B 93 -16 546 639 ; +C -1 ; WX 600 ; N Zdotaccent ; B 103 0 590 762 ; +C -1 ; WX 600 ; N scaron ; B 107 -17 584 639 ; +C -1 ; WX 600 ; N Amacron ; B 13 0 596 723 ; +C -1 ; WX 600 ; N sacute ; B 108 -17 577 639 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 152 -237 648 563 ; +C -1 ; WX 600 ; N Ydieresis ; B 153 0 665 762 ; +C -1 ; WX 600 ; N thorn ; B -13 -186 593 590 ; +C -1 ; WX 600 ; N Emacron ; B 47 0 619 723 ; +C -1 ; WX 600 ; N Ograve ; B 102 -16 616 789 ; +C -1 ; WX 600 ; N Oacute ; B 102 -16 616 789 ; +C -1 ; WX 600 ; N Odieresis ; B 102 -16 616 762 ; +C -1 ; WX 600 ; N Ntilde ; B 46 0 678 755 ; +C -1 ; WX 600 ; N Ncaron ; B 46 0 678 789 ; +C -1 ; WX 600 ; N Nacute ; B 46 0 678 789 ; +C -1 ; WX 600 ; N Lcaron ; B 67 0 638 576 ; +C -1 ; WX 600 ; N Lacute ; B 67 0 585 789 ; +C -1 ; WX 600 ; N Idotaccent ; B 117 0 603 762 ; +C -1 ; WX 600 ; N racute ; B 88 0 619 639 ; +C -1 ; WX 600 ; N Icircumflex ; B 117 0 603 789 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 111 -16 616 633 ; +C -1 ; WX 600 ; N otilde ; B 111 -16 586 605 ; +C -1 ; WX 600 ; N Euro ; B 60 -16 634 576 ; +C -1 ; WX 600 ; N ocircumflex ; B 111 -16 577 639 ; +C -1 ; WX 600 ; N onesuperior ; B 249 259 469 612 ; +C -1 ; WX 600 ; N twosuperior ; B 230 259 514 612 ; +C -1 ; WX 600 ; N threesuperior ; B 245 251 516 612 ; +C -1 ; WX 600 ; N Igrave ; B 117 0 603 789 ; +C -1 ; WX 600 ; N Iacute ; B 117 0 603 789 ; +C -1 ; WX 600 ; N Imacron ; B 117 0 603 723 ; +C -1 ; WX 600 ; N Iogonek ; B 117 -155 603 563 ; +C -1 ; WX 600 ; N Idieresis ; B 117 0 611 762 ; +C -1 ; WX 600 ; N Gbreve ; B 108 -16 656 777 ; +C -1 ; WX 600 ; N Umacron ; B 136 -16 676 723 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 47 -237 662 563 ; +C -1 ; WX 600 ; N ograve ; B 111 -16 577 639 ; +C -1 ; WX 600 ; N Scommaaccent ; B 96 -237 602 577 ; +C -1 ; WX 600 ; N Eogonek ; B 47 -155 619 563 ; +C -1 ; WX 600 ; N oacute ; B 111 -16 577 639 ; +C -1 ; WX 600 ; N Edotaccent ; B 47 0 619 762 ; +C -1 ; WX 600 ; N iogonek ; B 96 -155 513 624 ; +C -1 ; WX 600 ; N gcommaaccent ; B 105 -186 647 668 ; +C -1 ; WX 600 ; N odieresis ; B 111 -16 581 611 ; +C -1 ; WX 600 ; N ntilde ; B 57 0 570 605 ; +C -1 ; WX 600 ; N ncaron ; B 57 0 577 639 ; +C -1 ; WX 600 ; N Ecaron ; B 47 0 619 789 ; +C -1 ; WX 600 ; N Ecircumflex ; B 47 0 619 789 ; +C -1 ; WX 600 ; N scedilla ; B 108 -173 558 431 ; +C -1 ; WX 600 ; N rcaron ; B 88 0 619 639 ; +C -1 ; WX 600 ; N Egrave ; B 47 0 619 789 ; +C -1 ; WX 600 ; N Eacute ; B 47 0 619 789 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 108 -237 636 576 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 47 -237 594 563 ; +C -1 ; WX 600 ; N Edieresis ; B 47 0 619 762 ; +C -1 ; WX 600 ; N nacute ; B 57 0 577 639 ; +C -1 ; WX 600 ; N uogonek ; B 127 -155 569 417 ; +C -1 ; WX 600 ; N umacron ; B 127 -16 569 576 ; +C -1 ; WX 600 ; N Dcaron ; B 47 0 592 789 ; +C -1 ; WX 600 ; N lcaron ; B 96 0 593 618 ; +C -1 ; WX 600 ; N Ccaron ; B 110 -16 635 789 ; +C -1 ; WX 600 ; N Cacute ; B 110 -16 635 789 ; +C -1 ; WX 600 ; N Ccedilla ; B 110 -173 635 576 ; +C -1 ; WX 600 ; N degree ; B 257 346 553 636 ; +C -1 ; WX 600 ; N Aogonek ; B 13 -155 596 563 ; +C -1 ; WX 600 ; N minus ; B 131 261 588 302 ; +C -1 ; WX 600 ; N multiply ; B 143 100 577 464 ; +C -1 ; WX 600 ; N divide ; B 131 25 588 540 ; +C -1 ; WX 600 ; N Aring ; B 13 0 596 811 ; +C -1 ; WX 600 ; N trademark ; B 90 243 710 563 ; +C -1 ; WX 600 ; N rcommaaccent ; B 88 -237 619 427 ; +C -1 ; WX 600 ; N lacute ; B 96 0 572 789 ; +C -1 ; WX 600 ; N omacron ; B 111 -16 577 576 ; +C -1 ; WX 600 ; N Atilde ; B 13 0 596 755 ; +C -1 ; WX 600 ; N icircumflex ; B 95 0 536 639 ; +C -1 ; WX 600 ; N igrave ; B 96 0 513 639 ; +C -1 ; WX 600 ; N ncommaaccent ; B 57 -237 546 431 ; +C -1 ; WX 600 ; N lcommaaccent ; B 96 -237 513 604 ; +C -1 ; WX 600 ; N plusminus ; B 76 0 597 529 ; +C -1 ; WX 600 ; N onehalf ; B 82 0 627 612 ; +C -1 ; WX 600 ; N onequarter ; B 74 0 619 612 ; +C -1 ; WX 600 ; N threequarters ; B 70 0 619 612 ; +C -1 ; WX 600 ; N iacute ; B 96 0 535 639 ; +C -1 ; WX 600 ; N Abreve ; B 13 0 596 777 ; +C -1 ; WX 600 ; N kcommaaccent ; B 67 -237 578 604 ; +C -1 ; WX 600 ; N Omacron ; B 102 -16 616 723 ; +C -1 ; WX 600 ; N imacron ; B 96 0 564 576 ; +C -1 ; WX 600 ; N emacron ; B 104 -16 570 576 ; +C -1 ; WX 600 ; N amacron ; B 93 -16 564 576 ; +C -1 ; WX 600 ; N tcommaaccent ; B 127 -237 518 563 ; +C -1 ; WX 600 ; N ydieresis ; B 22 -186 634 611 ; +C -1 ; WX 600 ; N zdotaccent ; B 115 0 563 611 ; +C -1 ; WX 600 ; N zcaron ; B 115 0 576 639 ; +C -1 ; WX 600 ; N zacute ; B 115 0 577 639 ; +C -1 ; WX 600 ; N yacute ; B 22 -186 634 639 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 127 -16 576 633 ; +C -1 ; WX 600 ; N eth ; B 111 -17 582 620 ; +C -1 ; WX 600 ; N uring ; B 127 -16 569 661 ; +C -1 ; WX 600 ; N Ocircumflex ; B 102 -16 616 789 ; +C -1 ; WX 600 ; N commaaccent ; B 159 -237 322 -60 ; +C -1 ; WX 600 ; N copyright ; B 57 -15 663 578 ; +C -1 ; WX 600 ; N registered ; B 57 -15 663 578 ; +C -1 ; WX 600 ; N Acircumflex ; B 13 0 596 789 ; +C -1 ; WX 600 ; N idieresis ; B 96 0 568 611 ; +C -1 ; WX 600 ; N lozenge ; B 149 -11 571 575 ; +C -1 ; WX 600 ; N Delta ; B 43 0 557 563 ; +C -1 ; WX 600 ; N notequal ; B 96 94 625 464 ; +C -1 ; WX 600 ; N radical ; B 88 0 773 699 ; +C -1 ; WX 600 ; N Agrave ; B 13 0 596 789 ; +C -1 ; WX 600 ; N Aacute ; B 13 0 596 789 ; +C -1 ; WX 600 ; N lessequal ; B 56 0 635 535 ; +C -1 ; WX 600 ; N greaterequal ; B 71 0 600 535 ; +C -1 ; WX 600 ; N logicalnot ; B 160 168 621 438 ; +C -1 ; WX 600 ; N summation ; B 90 -127 616 563 ; +C -1 ; WX 600 ; N partialdiff ; B 111 -16 580 581 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 46 -237 678 563 ; +C -1 ; WX 600 ; N dcroat ; B 102 -16 690 604 ; +C -1 ; WX 600 ; N brokenbar ; B 257 -124 444 604 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 67 -237 585 563 ; +C -1 ; WX 600 ; N Adieresis ; B 13 0 596 762 ; +C -1 ; WX 600 ; N mu ; B 86 -200 569 417 ; +C -1 ; WX 600 ; N .notdef ; B 319 0 319 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -41 +KPX A Ccedilla -39 +KPX A G -36 +KPX A O -35 +KPX A Odieresis -35 +KPX A Q -37 +KPX A T -34 +KPX A U -41 +KPX A Uacute -41 +KPX A Ucircumflex -41 +KPX A Udieresis -41 +KPX A Ugrave -41 +KPX A V -78 +KPX A W -20 +KPX A Y -35 +KPX A a 1 +KPX A b 40 +KPX A c -26 +KPX A ccedilla -23 +KPX A comma -47 +KPX A d -17 +KPX A e -21 +KPX A g -27 +KPX A guillemotleft -57 +KPX A guilsinglleft -57 +KPX A hyphen -35 +KPX A o -22 +KPX A period -70 +KPX A q -27 +KPX A quotedblright -82 +KPX A quoteright -102 +KPX A t -33 +KPX A u -23 +KPX A v -59 +KPX A w -27 +KPX A y -63 +KPX Aacute C -41 +KPX Aacute G -36 +KPX Aacute O -35 +KPX Aacute Q -37 +KPX Aacute T -34 +KPX Aacute U -41 +KPX Aacute V -78 +KPX Aacute W -20 +KPX Aacute Y -35 +KPX Aacute a 1 +KPX Aacute b 40 +KPX Aacute c -26 +KPX Aacute comma -47 +KPX Aacute d -17 +KPX Aacute e -21 +KPX Aacute g -27 +KPX Aacute guillemotleft -57 +KPX Aacute guilsinglleft -57 +KPX Aacute hyphen -35 +KPX Aacute o -22 +KPX Aacute period -70 +KPX Aacute q -27 +KPX Aacute quoteright -102 +KPX Aacute t -33 +KPX Aacute u -23 +KPX Aacute v -59 +KPX Aacute w -27 +KPX Aacute y -63 +KPX Acircumflex C -41 +KPX Acircumflex G -36 +KPX Acircumflex O -35 +KPX Acircumflex Q -37 +KPX Acircumflex T -34 +KPX Acircumflex U -41 +KPX Acircumflex V -78 +KPX Acircumflex W -20 +KPX Acircumflex Y -35 +KPX Acircumflex comma -47 +KPX Acircumflex period -70 +KPX Adieresis C -41 +KPX Adieresis G -36 +KPX Adieresis O -35 +KPX Adieresis Q -37 +KPX Adieresis T -34 +KPX Adieresis U -41 +KPX Adieresis V -78 +KPX Adieresis W -20 +KPX Adieresis Y -35 +KPX Adieresis a 1 +KPX Adieresis b 40 +KPX Adieresis c -26 +KPX Adieresis comma -47 +KPX Adieresis d -17 +KPX Adieresis g -27 +KPX Adieresis guillemotleft -57 +KPX Adieresis guilsinglleft -57 +KPX Adieresis hyphen -35 +KPX Adieresis o -22 +KPX Adieresis period -70 +KPX Adieresis q -27 +KPX Adieresis quotedblright -82 +KPX Adieresis quoteright -102 +KPX Adieresis t -33 +KPX Adieresis u -23 +KPX Adieresis v -59 +KPX Adieresis w -27 +KPX Adieresis y -63 +KPX Agrave C -41 +KPX Agrave G -36 +KPX Agrave O -35 +KPX Agrave Q -37 +KPX Agrave T -34 +KPX Agrave U -41 +KPX Agrave V -78 +KPX Agrave W -20 +KPX Agrave Y -35 +KPX Agrave comma -47 +KPX Agrave period -70 +KPX Aring C -41 +KPX Aring G -36 +KPX Aring O -35 +KPX Aring Q -37 +KPX Aring T -34 +KPX Aring U -41 +KPX Aring V -78 +KPX Aring W -20 +KPX Aring Y -35 +KPX Aring a 1 +KPX Aring b 40 +KPX Aring c -26 +KPX Aring comma -47 +KPX Aring d -17 +KPX Aring e -21 +KPX Aring g -27 +KPX Aring guillemotleft -57 +KPX Aring guilsinglleft -57 +KPX Aring hyphen -35 +KPX Aring o -22 +KPX Aring period -70 +KPX Aring q -27 +KPX Aring quotedblright -82 +KPX Aring quoteright -102 +KPX Aring t -33 +KPX Aring u -23 +KPX Aring v -59 +KPX Aring w -27 +KPX Aring y -63 +KPX Atilde C -41 +KPX Atilde G -36 +KPX Atilde O -35 +KPX Atilde Q -37 +KPX Atilde T -34 +KPX Atilde U -41 +KPX Atilde V -78 +KPX Atilde W -20 +KPX Atilde Y -35 +KPX Atilde comma -47 +KPX Atilde period -70 +KPX B A -15 +KPX B AE -16 +KPX B Aacute -15 +KPX B Acircumflex -15 +KPX B Adieresis -15 +KPX B Aring -15 +KPX B Atilde -15 +KPX B O -15 +KPX B OE 5 +KPX B Oacute -15 +KPX B Ocircumflex -15 +KPX B Odieresis -15 +KPX B Ograve -15 +KPX B Oslash -14 +KPX B V -37 +KPX B W -15 +KPX B Y -58 +KPX C A -14 +KPX C AE -14 +KPX C Aacute -14 +KPX C Adieresis -14 +KPX C Aring -14 +KPX C H -34 +KPX C K -19 +KPX C O -24 +KPX C Oacute -24 +KPX C Odieresis -24 +KPX Ccedilla A -8 +KPX D A -47 +KPX D Aacute -47 +KPX D Acircumflex -47 +KPX D Adieresis -47 +KPX D Agrave -47 +KPX D Aring -47 +KPX D Atilde -47 +KPX D J -38 +KPX D T -47 +KPX D V -50 +KPX D W -20 +KPX D X -60 +KPX D Y -71 +KPX F A -45 +KPX F Aacute -45 +KPX F Acircumflex -45 +KPX F Adieresis -45 +KPX F Agrave -45 +KPX F Aring -45 +KPX F Atilde -45 +KPX F J -100 +KPX F O -34 +KPX F Odieresis -34 +KPX F a -52 +KPX F aacute -52 +KPX F adieresis -49 +KPX F ae -25 +KPX F aring -52 +KPX F comma -172 +KPX F e -61 +KPX F eacute -61 +KPX F hyphen -72 +KPX F i -51 +KPX F j -59 +KPX F o -68 +KPX F oacute -68 +KPX F odieresis -54 +KPX F oe -26 +KPX F oslash -68 +KPX F period -196 +KPX F r -37 +KPX F u -6 +KPX G A 0 +KPX G AE 0 +KPX G Aacute 0 +KPX G Acircumflex 0 +KPX G Adieresis 0 +KPX G Agrave 0 +KPX G Aring 0 +KPX G Atilde 0 +KPX G T -31 +KPX G V -1 +KPX G W -4 +KPX G Y -22 +KPX J A -14 +KPX J AE -23 +KPX J Adieresis -14 +KPX J Aring -14 +KPX K C -50 +KPX K G -46 +KPX K O -45 +KPX K OE -28 +KPX K Oacute -45 +KPX K Odieresis -45 +KPX K S -16 +KPX K T -18 +KPX K a -8 +KPX K adieresis -8 +KPX K ae 19 +KPX K aring -8 +KPX K e -30 +KPX K hyphen -66 +KPX K o -32 +KPX K oacute -32 +KPX K odieresis -32 +KPX K u -33 +KPX K udieresis -33 +KPX K y -72 +KPX L A 9 +KPX L AE 9 +KPX L Aacute 9 +KPX L Adieresis 9 +KPX L Aring 9 +KPX L C -19 +KPX L Ccedilla -19 +KPX L G -18 +KPX L O -15 +KPX L Oacute -15 +KPX L Ocircumflex -15 +KPX L Odieresis -15 +KPX L Ograve -15 +KPX L Otilde -15 +KPX L S -31 +KPX L T -59 +KPX L U -36 +KPX L Udieresis -36 +KPX L V -71 +KPX L W -31 +KPX L Y -60 +KPX L hyphen -1 +KPX L quotedblright -76 +KPX L quoteright -84 +KPX L u -20 +KPX L udieresis -20 +KPX L y -50 +KPX N A -10 +KPX N AE -10 +KPX N Aacute -10 +KPX N Adieresis -10 +KPX N Aring -10 +KPX N C -18 +KPX N Ccedilla -18 +KPX N G -16 +KPX N O -14 +KPX N Oacute -14 +KPX N Odieresis -14 +KPX N a -23 +KPX N aacute -23 +KPX N adieresis -23 +KPX N ae 7 +KPX N aring -23 +KPX N comma -64 +KPX N e -10 +KPX N eacute -10 +KPX N o -14 +KPX N oacute -14 +KPX N odieresis -14 +KPX N oslash -11 +KPX N period -87 +KPX N u -14 +KPX N udieresis -14 +KPX O A -33 +KPX O AE -30 +KPX O Aacute -33 +KPX O Adieresis -33 +KPX O Aring -33 +KPX O T -37 +KPX O V -40 +KPX O W -8 +KPX O X -47 +KPX O Y -61 +KPX Oacute A -33 +KPX Oacute T -37 +KPX Oacute V -40 +KPX Oacute W -8 +KPX Oacute Y -61 +KPX Ocircumflex T -37 +KPX Ocircumflex V -40 +KPX Ocircumflex Y -61 +KPX Odieresis A -33 +KPX Odieresis T -37 +KPX Odieresis V -40 +KPX Odieresis W -8 +KPX Odieresis X -47 +KPX Odieresis Y -61 +KPX Ograve T -37 +KPX Ograve V -40 +KPX Ograve Y -61 +KPX Oslash A -31 +KPX Otilde T -36 +KPX Otilde V -39 +KPX Otilde Y -60 +KPX P A -87 +KPX P AE -81 +KPX P Aacute -87 +KPX P Adieresis -87 +KPX P Aring -87 +KPX P J -90 +KPX P a -57 +KPX P aacute -57 +KPX P adieresis -57 +KPX P ae -29 +KPX P aring -57 +KPX P comma -161 +KPX P e -47 +KPX P eacute -47 +KPX P hyphen -52 +KPX P o -53 +KPX P oacute -53 +KPX P odieresis -53 +KPX P oe -18 +KPX P oslash -53 +KPX P period -185 +KPX R C -32 +KPX R Ccedilla -33 +KPX R G -31 +KPX R O -29 +KPX R OE -8 +KPX R Oacute -29 +KPX R Odieresis -29 +KPX R T -35 +KPX R U -36 +KPX R Udieresis -36 +KPX R V -42 +KPX R W -21 +KPX R Y -36 +KPX R a 0 +KPX R aacute 0 +KPX R adieresis 0 +KPX R ae 27 +KPX R aring 0 +KPX R e -22 +KPX R eacute -22 +KPX R hyphen -53 +KPX R o -23 +KPX R oacute -23 +KPX R odieresis -23 +KPX R oe 15 +KPX R u -16 +KPX R uacute -16 +KPX R udieresis -16 +KPX R y -20 +KPX S A -28 +KPX S AE -28 +KPX S Aacute -28 +KPX S Adieresis -28 +KPX S Aring -28 +KPX S T -48 +KPX S V -18 +KPX S W -23 +KPX S Y -39 +KPX S t -25 +KPX T A -34 +KPX T AE -35 +KPX T Aacute -34 +KPX T Acircumflex -34 +KPX T Adieresis -34 +KPX T Agrave -34 +KPX T Aring -34 +KPX T Atilde -34 +KPX T C -36 +KPX T G -35 +KPX T J -88 +KPX T O -34 +KPX T OE -12 +KPX T Oacute -34 +KPX T Ocircumflex -34 +KPX T Odieresis -34 +KPX T Ograve -34 +KPX T Oslash -34 +KPX T Otilde -34 +KPX T S -50 +KPX T V 4 +KPX T W -1 +KPX T Y -17 +KPX T a -68 +KPX T ae -38 +KPX T c -83 +KPX T colon -145 +KPX T comma -116 +KPX T e -83 +KPX T g -76 +KPX T guillemotleft -129 +KPX T guilsinglleft -129 +KPX T hyphen -99 +KPX T i -51 +KPX T j -59 +KPX T o -87 +KPX T oslash -60 +KPX T period -145 +KPX T r -37 +KPX T s -70 +KPX T semicolon -119 +KPX T u -92 +KPX T v -98 +KPX T w -96 +KPX T y -108 +KPX U A -26 +KPX U AE -35 +KPX U Aacute -26 +KPX U Acircumflex -26 +KPX U Adieresis -26 +KPX U Aring -26 +KPX U Atilde -26 +KPX U comma -80 +KPX U m 3 +KPX U n -22 +KPX U p -5 +KPX U period -105 +KPX U r -47 +KPX Uacute A -26 +KPX Uacute comma -80 +KPX Uacute m 3 +KPX Uacute n -22 +KPX Uacute p -5 +KPX Uacute period -105 +KPX Uacute r -47 +KPX Ucircumflex A -26 +KPX Udieresis A -26 +KPX Udieresis b 17 +KPX Udieresis comma -80 +KPX Udieresis m 3 +KPX Udieresis n -22 +KPX Udieresis p -5 +KPX Udieresis period -105 +KPX Udieresis r -47 +KPX Ugrave A -26 +KPX V A -10 +KPX V AE -19 +KPX V Aacute -10 +KPX V Acircumflex -10 +KPX V Adieresis -10 +KPX V Agrave -10 +KPX V Aring -10 +KPX V Atilde -10 +KPX V C -39 +KPX V G -38 +KPX V O -37 +KPX V Oacute -37 +KPX V Ocircumflex -37 +KPX V Odieresis -37 +KPX V Ograve -37 +KPX V Oslash -38 +KPX V Otilde -38 +KPX V S -41 +KPX V T 4 +KPX V a -65 +KPX V ae -37 +KPX V colon -130 +KPX V comma -134 +KPX V e -56 +KPX V g -57 +KPX V guillemotleft -83 +KPX V guilsinglleft -83 +KPX V hyphen -49 +KPX V i -65 +KPX V o -60 +KPX V oslash -57 +KPX V period -158 +KPX V r -51 +KPX V semicolon -121 +KPX V u -20 +KPX V y -24 +KPX W A -16 +KPX W AE -21 +KPX W Aacute -16 +KPX W Acircumflex -16 +KPX W Adieresis -16 +KPX W Agrave -16 +KPX W Aring -16 +KPX W Atilde -16 +KPX W C -14 +KPX W G -12 +KPX W O -10 +KPX W Oacute -10 +KPX W Ocircumflex -10 +KPX W Odieresis -10 +KPX W Ograve -10 +KPX W Oslash -7 +KPX W Otilde -10 +KPX W S -29 +KPX W T -2 +KPX W a -24 +KPX W ae 6 +KPX W colon -93 +KPX W comma -71 +KPX W e -10 +KPX W g -11 +KPX W guillemotleft -38 +KPX W guilsinglleft -38 +KPX W hyphen -7 +KPX W i -48 +KPX W o -14 +KPX W oslash -11 +KPX W period -95 +KPX W r -34 +KPX W semicolon -74 +KPX W u -2 +KPX W y -6 +KPX X C -52 +KPX X O -48 +KPX X Odieresis -48 +KPX X Q -48 +KPX X a -14 +KPX X e -36 +KPX X hyphen -81 +KPX X o -38 +KPX X u -39 +KPX X y -57 +KPX Y A -31 +KPX Y AE -34 +KPX Y Aacute -31 +KPX Y Acircumflex -31 +KPX Y Adieresis -31 +KPX Y Agrave -31 +KPX Y Aring -31 +KPX Y Atilde -31 +KPX Y C -60 +KPX Y G -60 +KPX Y O -59 +KPX Y Oacute -59 +KPX Y Ocircumflex -59 +KPX Y Odieresis -59 +KPX Y Ograve -59 +KPX Y Oslash -59 +KPX Y Otilde -59 +KPX Y S -62 +KPX Y T -17 +KPX Y a -67 +KPX Y ae -40 +KPX Y colon -145 +KPX Y comma -116 +KPX Y e -81 +KPX Y g -84 +KPX Y guillemotleft -119 +KPX Y guilsinglleft -119 +KPX Y hyphen -96 +KPX Y i -63 +KPX Y o -86 +KPX Y oslash -59 +KPX Y p -39 +KPX Y period -144 +KPX Y semicolon -119 +KPX Y u -50 +KPX Y v -44 +KPX Z v -54 +KPX Z y -64 +KPX a j -93 +KPX a quoteright -60 +KPX a v -33 +KPX a w -23 +KPX a y -44 +KPX aacute v -33 +KPX aacute w -23 +KPX aacute y -44 +KPX adieresis v -33 +KPX adieresis w -23 +KPX adieresis y -44 +KPX ae v 16 +KPX ae w 16 +KPX ae y 5 +KPX agrave v -33 +KPX agrave w -23 +KPX agrave y -44 +KPX aring v -33 +KPX aring w -23 +KPX aring y -44 +KPX b v -17 +KPX b w 0 +KPX b y -28 +KPX c h -6 +KPX c k -12 +KPX comma one -148 +KPX comma quotedblright -123 +KPX comma quoteright -142 +KPX e quoteright -43 +KPX e t -34 +KPX e v -28 +KPX e w -20 +KPX e x -5 +KPX e y -39 +KPX eacute v -28 +KPX eacute w -20 +KPX eacute y -39 +KPX ecircumflex v -28 +KPX ecircumflex w -20 +KPX ecircumflex y -39 +KPX eight four -65 +KPX eight one -85 +KPX eight seven -77 +KPX f a -44 +KPX f aacute -44 +KPX f adieresis -26 +KPX f ae -17 +KPX f aring -44 +KPX f e -58 +KPX f eacute -58 +KPX f f -46 +KPX f i -40 +KPX f j -63 +KPX f l -31 +KPX f o -65 +KPX f oacute -65 +KPX f odieresis -31 +KPX f oe -23 +KPX f oslash -36 +KPX f quoteright -62 +KPX f s -46 +KPX f t -10 +KPX five four -56 +KPX five one -90 +KPX five seven -78 +KPX four four -68 +KPX four one -73 +KPX four seven -99 +KPX g a -14 +KPX g adieresis -14 +KPX g ae 13 +KPX g aring -14 +KPX g e -7 +KPX g eacute -7 +KPX g l -37 +KPX g oacute -12 +KPX g odieresis -12 +KPX g r -4 +KPX guillemotright A -50 +KPX guillemotright AE -46 +KPX guillemotright Aacute -50 +KPX guillemotright Adieresis -50 +KPX guillemotright Aring -50 +KPX guillemotright T -128 +KPX guillemotright V -80 +KPX guillemotright W -37 +KPX guillemotright Y -119 +KPX guilsinglright A -50 +KPX guilsinglright AE -46 +KPX guilsinglright Aacute -50 +KPX guilsinglright Adieresis -50 +KPX guilsinglright Aring -50 +KPX guilsinglright T -128 +KPX guilsinglright V -80 +KPX guilsinglright W -37 +KPX guilsinglright Y -119 +KPX h quoteright -52 +KPX h y -37 +KPX hyphen A -29 +KPX hyphen AE -23 +KPX hyphen Aacute -29 +KPX hyphen Adieresis -29 +KPX hyphen Aring -29 +KPX hyphen T -98 +KPX hyphen V -44 +KPX hyphen W -4 +KPX hyphen Y -95 +KPX i T -64 +KPX i j -146 +KPX k a -12 +KPX k aacute -12 +KPX k adieresis -12 +KPX k ae 15 +KPX k aring -12 +KPX k comma -60 +KPX k e -34 +KPX k eacute -34 +KPX k g -43 +KPX k hyphen -104 +KPX k o -35 +KPX k oacute -35 +KPX k odieresis -35 +KPX k period -89 +KPX k s -14 +KPX k u -7 +KPX k udieresis -7 +KPX l v -86 +KPX l y -96 +KPX m p 19 +KPX m v 7 +KPX m w 13 +KPX m y -3 +KPX n T -48 +KPX n p -8 +KPX n quoteright -50 +KPX n v -25 +KPX n w -14 +KPX n y -36 +KPX nine four -58 +KPX nine one -84 +KPX nine seven -75 +KPX o T -89 +KPX o quoteright -41 +KPX o t -24 +KPX o v -25 +KPX o w -7 +KPX o x -28 +KPX o y -36 +KPX oacute v -25 +KPX oacute w -7 +KPX oacute y -36 +KPX ocircumflex t -24 +KPX odieresis t -24 +KPX odieresis v -25 +KPX odieresis w -7 +KPX odieresis x -28 +KPX odieresis y -36 +KPX ograve v -25 +KPX ograve w -7 +KPX ograve y -36 +KPX one comma -99 +KPX one eight -94 +KPX one five -76 +KPX one four -127 +KPX one nine -81 +KPX one one -69 +KPX one period -128 +KPX one seven -147 +KPX one six -119 +KPX one three -69 +KPX one two -54 +KPX one zero -102 +KPX p t -20 +KPX p y -25 +KPX period one -125 +KPX period quotedblright -114 +KPX period quoteright -133 +KPX q c -4 +KPX q u 37 +KPX quotedblbase A -6 +KPX quotedblbase AE -6 +KPX quotedblbase T -82 +KPX quotedblbase V -85 +KPX quotedblbase W -24 +KPX quotedblbase Y -83 +KPX quotedblleft A -66 +KPX quotedblleft AE -57 +KPX quotedblleft Aacute -66 +KPX quotedblleft Adieresis -66 +KPX quotedblleft Aring -66 +KPX quotedblleft T -46 +KPX quotedblleft V -18 +KPX quotedblleft W -8 +KPX quotedblleft Y -46 +KPX quotedblright A -67 +KPX quotedblright AE -76 +KPX quotedblright Aacute -66 +KPX quotedblright Adieresis -66 +KPX quotedblright Aring -66 +KPX quotedblright T -53 +KPX quotedblright V -22 +KPX quotedblright W -26 +KPX quotedblright Y -43 +KPX quoteleft A -87 +KPX quoteleft AE -78 +KPX quoteleft Aacute -87 +KPX quoteleft Adieresis -87 +KPX quoteleft Aring -87 +KPX quoteleft T -67 +KPX quoteleft V -39 +KPX quoteleft W -29 +KPX quoteleft Y -67 +KPX quoteright A -145 +KPX quoteright AE -154 +KPX quoteright Aacute -145 +KPX quoteright Adieresis -145 +KPX quoteright Aring -145 +KPX quoteright comma -201 +KPX quoteright d -129 +KPX quoteright o -135 +KPX quoteright period -224 +KPX quoteright r -150 +KPX quoteright s -144 +KPX quoteright t -118 +KPX quoteright v -112 +KPX quoteright w -108 +KPX quoteright y -122 +KPX r a -26 +KPX r aacute -26 +KPX r acircumflex -26 +KPX r adieresis -26 +KPX r ae 1 +KPX r agrave -26 +KPX r aring -26 +KPX r c -26 +KPX r ccedilla -34 +KPX r colon -86 +KPX r comma -104 +KPX r d -18 +KPX r e -17 +KPX r eacute -17 +KPX r ecircumflex -17 +KPX r egrave -17 +KPX r f -24 +KPX r g -15 +KPX r h -24 +KPX r hyphen -125 +KPX r i -34 +KPX r j -42 +KPX r k -34 +KPX r l -51 +KPX r m 27 +KPX r n 0 +KPX r o -24 +KPX r oacute -24 +KPX r ocircumflex -24 +KPX r odieresis -24 +KPX r oe 13 +KPX r ograve -24 +KPX r oslash -24 +KPX r p 21 +KPX r period -133 +KPX r q -16 +KPX r quoteright -44 +KPX r r -20 +KPX r s -29 +KPX r semicolon -75 +KPX r t 11 +KPX r u 11 +KPX r v 17 +KPX r w 17 +KPX r x -4 +KPX r y 6 +KPX r z -23 +KPX s quoteright -51 +KPX s t -17 +KPX seven colon -154 +KPX seven comma -146 +KPX seven eight -86 +KPX seven five -91 +KPX seven four -116 +KPX seven one -74 +KPX seven period -169 +KPX seven seven -69 +KPX seven six -104 +KPX seven three -79 +KPX seven two -76 +KPX six four -52 +KPX six one -68 +KPX six seven -55 +KPX t S -40 +KPX t a -25 +KPX t aacute -25 +KPX t adieresis -25 +KPX t ae 2 +KPX t aring -25 +KPX t colon -107 +KPX t e -43 +KPX t eacute -43 +KPX t h -8 +KPX t o -45 +KPX t oacute -45 +KPX t odieresis -45 +KPX t quoteright -100 +KPX t semicolon -86 +KPX three four -58 +KPX three one -82 +KPX three seven -75 +KPX two four -97 +KPX two one -73 +KPX two seven -79 +KPX u quoteright -43 +KPX v a -9 +KPX v aacute -9 +KPX v acircumflex -9 +KPX v adieresis -9 +KPX v ae 17 +KPX v agrave -9 +KPX v aring -9 +KPX v atilde -9 +KPX v c -22 +KPX v colon -75 +KPX v comma -118 +KPX v e -17 +KPX v eacute -17 +KPX v ecircumflex -17 +KPX v egrave -17 +KPX v g -14 +KPX v hyphen -30 +KPX v l -87 +KPX v o -23 +KPX v oacute -23 +KPX v odieresis -23 +KPX v ograve -23 +KPX v oslash -23 +KPX v period -143 +KPX v s -22 +KPX v semicolon -66 +KPX w a -9 +KPX w aacute -9 +KPX w acircumflex -9 +KPX w adieresis -9 +KPX w ae 17 +KPX w agrave -9 +KPX w aring -9 +KPX w atilde -9 +KPX w c -12 +KPX w colon -75 +KPX w comma -75 +KPX w e -4 +KPX w eacute -4 +KPX w ecircumflex -4 +KPX w egrave -4 +KPX w g -6 +KPX w hyphen -4 +KPX w l -53 +KPX w o -9 +KPX w oacute -9 +KPX w odieresis -9 +KPX w ograve -9 +KPX w oslash -6 +KPX w period -99 +KPX w s -22 +KPX w semicolon -66 +KPX x a -8 +KPX x c -35 +KPX x e -30 +KPX x eacute -30 +KPX x o -31 +KPX x q -33 +KPX y a -20 +KPX y aacute -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y ae 6 +KPX y agrave -20 +KPX y aring -20 +KPX y atilde -20 +KPX y c -33 +KPX y colon -86 +KPX y comma -122 +KPX y e -28 +KPX y eacute -28 +KPX y ecircumflex -28 +KPX y egrave -28 +KPX y g -25 +KPX y hyphen -29 +KPX y l -98 +KPX y o -34 +KPX y oacute -34 +KPX y odieresis -34 +KPX y ograve -34 +KPX y oslash -34 +KPX y period -148 +KPX y s -33 +KPX y semicolon -77 +KPX zero four -64 +KPX zero one -91 +KPX zero seven -82 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n022023l.pfb b/pdf2swf/fonts/n022023l.pfb new file mode 100644 index 00000000..107a5133 Binary files /dev/null and b/pdf2swf/fonts/n022023l.pfb differ diff --git a/pdf2swf/fonts/n022024l.afm b/pdf2swf/fonts/n022024l.afm new file mode 100644 index 00000000..8e614b89 --- /dev/null +++ b/pdf2swf/fonts/n022024l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusMonL-BoldObli +FullName Nimbus Mono L Bold Oblique +FamilyName Nimbus Mono L +Weight Bold +ItalicAngle -12.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -61 -278 840 871 +CapHeight 583 +XHeight 437 +Descender -205 +Ascender 624 +StartCharMetrics 316 +C 32 ; WX 600 ; N space ; B 386 0 386 0 ; +C 33 ; WX 600 ; N exclam ; B 234 -15 501 638 ; +C 34 ; WX 600 ; N quotedbl ; B 243 312 592 602 ; +C 35 ; WX 600 ; N numbersign ; B 101 -92 623 675 ; +C 36 ; WX 600 ; N dollar ; B 100 -123 610 684 ; +C 37 ; WX 600 ; N percent ; B 131 -15 599 617 ; +C 38 ; WX 600 ; N ampersand ; B 102 -14 557 550 ; +C 39 ; WX 600 ; N quoteright ; B 222 331 483 623 ; +C 40 ; WX 600 ; N parenleft ; B 304 -153 613 632 ; +C 41 ; WX 600 ; N parenright ; B 94 -153 403 632 ; +C 42 ; WX 600 ; N asterisk ; B 178 208 614 622 ; +C 43 ; WX 600 ; N plus ; B 101 0 619 560 ; +C 44 ; WX 600 ; N comma ; B 118 -158 379 134 ; +C 45 ; WX 600 ; N hyphen ; B 101 229 619 329 ; +C 46 ; WX 600 ; N period ; B 234 -15 387 117 ; +C 47 ; WX 600 ; N slash ; B 69 -113 656 695 ; +C 48 ; WX 600 ; N zero ; B 130 -15 602 638 ; +C 49 ; WX 600 ; N one ; B 93 0 529 638 ; +C 50 ; WX 600 ; N two ; B 54 0 602 638 ; +C 51 ; WX 600 ; N three ; B 80 -15 609 638 ; +C 52 ; WX 600 ; N four ; B 104 0 579 622 ; +C 53 ; WX 600 ; N five ; B 83 -15 610 622 ; +C 54 ; WX 600 ; N six ; B 154 -15 663 638 ; +C 55 ; WX 600 ; N seven ; B 184 -1 640 622 ; +C 56 ; WX 600 ; N eight ; B 114 -15 608 638 ; +C 57 ; WX 600 ; N nine ; B 115 -15 624 638 ; +C 58 ; WX 600 ; N colon ; B 234 -15 455 437 ; +C 59 ; WX 600 ; N semicolon ; B 118 -158 431 437 ; +C 60 ; WX 600 ; N less ; B 102 54 642 501 ; +C 61 ; WX 600 ; N equal ; B 81 138 638 422 ; +C 62 ; WX 600 ; N greater ; B 76 53 616 500 ; +C 63 ; WX 600 ; N question ; B 197 -15 608 598 ; +C 64 ; WX 600 ; N at ; B 98 -152 582 620 ; +C 65 ; WX 600 ; N A ; B -11 0 633 583 ; +C 66 ; WX 600 ; N B ; B 22 0 620 583 ; +C 67 ; WX 600 ; N C ; B 80 -14 663 597 ; +C 68 ; WX 600 ; N D ; B 23 0 622 583 ; +C 69 ; WX 600 ; N E ; B 23 0 652 583 ; +C 70 ; WX 600 ; N F ; B 23 0 674 583 ; +C 71 ; WX 600 ; N G ; B 79 -14 667 597 ; +C 72 ; WX 600 ; N H ; B 32 0 675 583 ; +C 73 ; WX 600 ; N I ; B 93 0 632 583 ; +C 74 ; WX 600 ; N J ; B 64 -14 727 583 ; +C 75 ; WX 600 ; N K ; B 22 0 687 583 ; +C 76 ; WX 600 ; N L ; B 42 0 616 583 ; +C 77 ; WX 600 ; N M ; B -10 0 728 583 ; +C 78 ; WX 600 ; N N ; B 21 0 706 583 ; +C 79 ; WX 600 ; N O ; B 75 -14 649 597 ; +C 80 ; WX 600 ; N P ; B 23 0 617 583 ; +C 81 ; WX 600 ; N Q ; B 75 -145 649 597 ; +C 82 ; WX 600 ; N R ; B 23 0 631 583 ; +C 83 ; WX 600 ; N S ; B 72 -14 634 597 ; +C 84 ; WX 600 ; N T ; B 121 0 682 583 ; +C 85 ; WX 600 ; N U ; B 110 -14 705 583 ; +C 86 ; WX 600 ; N V ; B 91 0 735 583 ; +C 87 ; WX 600 ; N W ; B 98 0 725 583 ; +C 88 ; WX 600 ; N X ; B 19 0 692 583 ; +C 89 ; WX 600 ; N Y ; B 128 0 694 583 ; +C 90 ; WX 600 ; N Z ; B 73 0 628 583 ; +C 91 ; WX 600 ; N bracketleft ; B 219 -148 598 627 ; +C 92 ; WX 600 ; N backslash ; B 219 -113 504 695 ; +C 93 ; WX 600 ; N bracketright ; B 104 -148 483 627 ; +C 94 ; WX 600 ; N asciicircum ; B 161 325 598 652 ; +C 95 ; WX 600 ; N underscore ; B -61 -125 564 -75 ; +C 96 ; WX 600 ; N quoteleft ; B 377 348 534 602 ; +C 97 ; WX 600 ; N a ; B 65 -16 583 450 ; +C 98 ; WX 600 ; N b ; B 2 -14 623 624 ; +C 99 ; WX 600 ; N c ; B 93 -16 626 450 ; +C 100 ; WX 600 ; N d ; B 74 -14 664 624 ; +C 101 ; WX 600 ; N e ; B 74 -16 600 450 ; +C 102 ; WX 600 ; N f ; B 84 0 691 623 ; +C 103 ; WX 600 ; N g ; B 73 -205 675 451 ; +C 104 ; WX 600 ; N h ; B 33 0 593 624 ; +C 105 ; WX 600 ; N i ; B 72 0 550 623 ; +C 106 ; WX 600 ; N j ; B 83 -205 581 623 ; +C 107 ; WX 600 ; N k ; B 42 0 606 624 ; +C 108 ; WX 600 ; N l ; B 72 0 550 624 ; +C 109 ; WX 600 ; N m ; B -9 0 635 450 ; +C 110 ; WX 600 ; N n ; B 33 0 583 450 ; +C 111 ; WX 600 ; N o ; B 84 -16 609 450 ; +C 112 ; WX 600 ; N p ; B -42 -205 623 450 ; +C 113 ; WX 600 ; N q ; B 75 -205 696 450 ; +C 114 ; WX 600 ; N r ; B 64 0 650 449 ; +C 115 ; WX 600 ; N s ; B 83 -16 592 450 ; +C 116 ; WX 600 ; N t ; B 94 -16 547 591 ; +C 117 ; WX 600 ; N u ; B 94 -13 603 437 ; +C 118 ; WX 600 ; N v ; B 81 0 683 437 ; +C 119 ; WX 600 ; N w ; B 82 0 684 437 ; +C 120 ; WX 600 ; N x ; B 30 0 641 437 ; +C 121 ; WX 600 ; N y ; B -13 -205 662 437 ; +C 122 ; WX 600 ; N z ; B 85 0 599 437 ; +C 123 ; WX 600 ; N braceleft ; B 217 -153 556 623 ; +C 124 ; WX 600 ; N bar ; B 227 -153 472 622 ; +C 125 ; WX 600 ; N braceright ; B 144 -153 483 623 ; +C 126 ; WX 600 ; N asciitilde ; B 114 179 606 385 ; +C 161 ; WX 600 ; N exclamdown ; B 186 -227 453 426 ; +C 162 ; WX 600 ; N cent ; B 144 -44 593 661 ; +C 163 ; WX 600 ; N sterling ; B 64 0 571 598 ; +C 164 ; WX 600 ; N fraction ; B 52 102 676 500 ; +C 165 ; WX 600 ; N yen ; B 133 0 693 580 ; +C 166 ; WX 600 ; N florin ; B 43 -123 672 638 ; +C 167 ; WX 600 ; N section ; B 45 -170 643 583 ; +C 168 ; WX 600 ; N currency ; B 96 64 626 519 ; +C 169 ; WX 600 ; N quotesingle ; B 343 312 492 602 ; +C 170 ; WX 600 ; N quotedblleft ; B 226 348 583 602 ; +C 171 ; WX 600 ; N guillemotleft ; B 80 20 654 415 ; +C 172 ; WX 600 ; N guilsinglleft ; B 80 20 425 415 ; +C 173 ; WX 600 ; N guilsinglright ; B 273 20 617 415 ; +C 174 ; WX 600 ; N fi ; B -4 0 633 624 ; +C 175 ; WX 600 ; N fl ; B -8 0 645 623 ; +C 177 ; WX 600 ; N endash ; B 101 229 619 329 ; +C 178 ; WX 600 ; N dagger ; B 175 -92 589 622 ; +C 179 ; WX 600 ; N daggerdbl ; B 123 -92 589 622 ; +C 180 ; WX 600 ; N periodcentered ; B 283 214 436 346 ; +C 182 ; WX 600 ; N paragraph ; B 108 -174 672 583 ; +C 183 ; WX 600 ; N bullet ; B 211 154 517 453 ; +C 184 ; WX 600 ; N quotesinglbase ; B 118 -158 379 134 ; +C 185 ; WX 600 ; N quotedblbase ; B 66 -120 519 134 ; +C 186 ; WX 600 ; N quotedblright ; B 166 348 619 602 ; +C 187 ; WX 600 ; N guillemotright ; B 43 20 617 415 ; +C 188 ; WX 600 ; N ellipsis ; B 34 -15 587 117 ; +C 189 ; WX 600 ; N perthousand ; B 104 0 627 618 ; +C 191 ; WX 600 ; N questiondown ; B 70 -227 481 386 ; +C 193 ; WX 600 ; N grave ; B 264 496 464 696 ; +C 194 ; WX 600 ; N acute ; B 362 496 616 696 ; +C 195 ; WX 600 ; N circumflex ; B 237 497 590 696 ; +C 196 ; WX 600 ; N tilde ; B 233 523 619 656 ; +C 197 ; WX 600 ; N macron ; B 249 546 600 626 ; +C 198 ; WX 600 ; N breve ; B 261 503 614 687 ; +C 199 ; WX 600 ; N dotaccent ; B 365 534 488 654 ; +C 200 ; WX 600 ; N dieresis ; B 261 534 592 654 ; +C 202 ; WX 600 ; N ring ; B 303 486 554 727 ; +C 203 ; WX 600 ; N cedilla ; B 143 -229 381 0 ; +C 205 ; WX 600 ; N hungarumlaut ; B 237 496 616 694 ; +C 206 ; WX 600 ; N ogonek ; B 222 -208 433 0 ; +C 207 ; WX 600 ; N caron ; B 264 497 617 696 ; +C 208 ; WX 600 ; N emdash ; B 30 229 690 329 ; +C 225 ; WX 600 ; N AE ; B -10 0 717 583 ; +C 227 ; WX 600 ; N ordfeminine ; B 170 182 559 595 ; +C 232 ; WX 600 ; N Lslash ; B 43 0 616 583 ; +C 233 ; WX 600 ; N Oslash ; B 4 -70 717 638 ; +C 234 ; WX 600 ; N OE ; B 34 0 717 583 ; +C 235 ; WX 600 ; N ordmasculine ; B 168 182 566 595 ; +C 241 ; WX 600 ; N ae ; B 14 -16 665 450 ; +C 245 ; WX 600 ; N dotlessi ; B 72 0 550 437 ; +C 248 ; WX 600 ; N lslash ; B 72 0 557 624 ; +C 249 ; WX 600 ; N oslash ; B 17 -70 669 494 ; +C 250 ; WX 600 ; N oe ; B 28 -16 666 450 ; +C 251 ; WX 600 ; N germandbls ; B 22 -16 569 623 ; +C -1 ; WX 600 ; N Udieresis ; B 110 -14 705 800 ; +C -1 ; WX 600 ; N Uacute ; B 110 -14 705 839 ; +C -1 ; WX 600 ; N Scedilla ; B 72 -229 634 597 ; +C -1 ; WX 600 ; N Tcaron ; B 121 0 682 839 ; +C -1 ; WX 600 ; N Scaron ; B 72 -14 657 839 ; +C -1 ; WX 600 ; N Rcaron ; B 23 0 631 839 ; +C -1 ; WX 600 ; N Racute ; B 23 0 631 839 ; +C -1 ; WX 600 ; N Sacute ; B 72 -14 634 839 ; +C -1 ; WX 600 ; N Otilde ; B 75 -14 656 799 ; +C -1 ; WX 600 ; N ucircumflex ; B 94 -13 603 696 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 75 -14 680 837 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 110 -14 705 837 ; +C -1 ; WX 600 ; N Yacute ; B 128 0 694 839 ; +C -1 ; WX 600 ; N Eth ; B 23 0 622 583 ; +C -1 ; WX 600 ; N Dcroat ; B 23 0 622 583 ; +C -1 ; WX 600 ; N Zacute ; B 73 0 628 839 ; +C -1 ; WX 600 ; N Uring ; B 110 -14 705 871 ; +C -1 ; WX 600 ; N gbreve ; B 73 -205 675 687 ; +C -1 ; WX 600 ; N eogonek ; B 74 -208 600 450 ; +C -1 ; WX 600 ; N edotaccent ; B 74 -16 600 654 ; +C -1 ; WX 600 ; N ecaron ; B 74 -16 617 696 ; +C -1 ; WX 600 ; N Ugrave ; B 110 -14 705 839 ; +C -1 ; WX 600 ; N Thorn ; B 23 0 588 583 ; +C -1 ; WX 600 ; N eacute ; B 74 -16 600 696 ; +C -1 ; WX 600 ; N edieresis ; B 74 -16 600 654 ; +C -1 ; WX 740 ; N dcaron ; B 74 -14 840 639 ; +C -1 ; WX 600 ; N ccedilla ; B 92 -229 626 450 ; +C -1 ; WX 600 ; N ccaron ; B 93 -16 627 696 ; +C -1 ; WX 600 ; N cacute ; B 93 -16 626 696 ; +C -1 ; WX 600 ; N aogonek ; B 65 -208 583 450 ; +C -1 ; WX 600 ; N aring ; B 65 -16 583 727 ; +C -1 ; WX 600 ; N atilde ; B 65 -16 612 656 ; +C -1 ; WX 600 ; N abreve ; B 65 -16 614 687 ; +C -1 ; WX 600 ; N egrave ; B 74 -16 600 696 ; +C -1 ; WX 600 ; N agrave ; B 65 -16 583 696 ; +C -1 ; WX 600 ; N aacute ; B 66 -16 584 696 ; +C -1 ; WX 600 ; N adieresis ; B 65 -16 583 654 ; +C -1 ; WX 600 ; N Uogonek ; B 110 -208 705 583 ; +C -1 ; WX 600 ; N ugrave ; B 94 -13 603 696 ; +C -1 ; WX 600 ; N uacute ; B 94 -13 603 696 ; +C -1 ; WX 600 ; N udieresis ; B 94 -13 603 654 ; +C -1 ; WX 600 ; N tcaron ; B 94 -16 700 639 ; +C -1 ; WX 600 ; N scommaaccent ; B 83 -278 592 450 ; +C -1 ; WX 600 ; N Zcaron ; B 73 0 644 839 ; +C -1 ; WX 600 ; N ecircumflex ; B 74 -16 600 696 ; +C -1 ; WX 600 ; N Ucircumflex ; B 110 -14 705 839 ; +C -1 ; WX 600 ; N acircumflex ; B 65 -16 583 696 ; +C -1 ; WX 600 ; N Zdotaccent ; B 73 0 628 793 ; +C -1 ; WX 600 ; N scaron ; B 83 -16 627 696 ; +C -1 ; WX 600 ; N Amacron ; B -11 0 633 776 ; +C -1 ; WX 600 ; N sacute ; B 83 -16 616 696 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 121 -278 682 583 ; +C -1 ; WX 600 ; N Ydieresis ; B 128 0 694 800 ; +C -1 ; WX 600 ; N thorn ; B -42 -205 623 624 ; +C -1 ; WX 600 ; N Emacron ; B 23 0 652 776 ; +C -1 ; WX 600 ; N Ograve ; B 75 -14 649 839 ; +C -1 ; WX 600 ; N Oacute ; B 75 -14 649 839 ; +C -1 ; WX 600 ; N Odieresis ; B 75 -14 649 800 ; +C -1 ; WX 600 ; N Ntilde ; B 21 0 706 799 ; +C -1 ; WX 600 ; N Ncaron ; B 21 0 706 839 ; +C -1 ; WX 600 ; N Nacute ; B 21 0 706 839 ; +C -1 ; WX 600 ; N Lcaron ; B 42 0 680 598 ; +C -1 ; WX 600 ; N Lacute ; B 42 0 616 839 ; +C -1 ; WX 600 ; N Idotaccent ; B 93 0 632 793 ; +C -1 ; WX 600 ; N racute ; B 64 0 650 696 ; +C -1 ; WX 600 ; N Icircumflex ; B 93 0 632 839 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 84 -16 616 694 ; +C -1 ; WX 600 ; N otilde ; B 84 -16 626 656 ; +C -1 ; WX 600 ; N Euro ; B 54 -14 639 597 ; +C -1 ; WX 600 ; N ocircumflex ; B 84 -16 609 696 ; +C -1 ; WX 600 ; N onesuperior ; B 224 247 494 638 ; +C -1 ; WX 600 ; N twosuperior ; B 202 247 538 637 ; +C -1 ; WX 600 ; N threesuperior ; B 218 238 543 637 ; +C -1 ; WX 600 ; N Igrave ; B 93 0 632 839 ; +C -1 ; WX 600 ; N Iacute ; B 93 0 632 839 ; +C -1 ; WX 600 ; N Imacron ; B 93 0 632 776 ; +C -1 ; WX 600 ; N Iogonek ; B 93 -208 632 583 ; +C -1 ; WX 600 ; N Idieresis ; B 93 0 632 800 ; +C -1 ; WX 600 ; N Gbreve ; B 79 -14 667 831 ; +C -1 ; WX 600 ; N Umacron ; B 110 -14 705 776 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 22 -278 687 583 ; +C -1 ; WX 600 ; N ograve ; B 84 -16 609 696 ; +C -1 ; WX 600 ; N Scommaaccent ; B 72 -278 634 597 ; +C -1 ; WX 600 ; N Eogonek ; B 23 -208 652 583 ; +C -1 ; WX 600 ; N oacute ; B 84 -16 609 696 ; +C -1 ; WX 600 ; N Edotaccent ; B 23 0 652 793 ; +C -1 ; WX 600 ; N iogonek ; B 72 -208 550 623 ; +C -1 ; WX 600 ; N gcommaaccent ; B 73 -205 675 722 ; +C -1 ; WX 600 ; N odieresis ; B 84 -16 609 654 ; +C -1 ; WX 600 ; N ntilde ; B 33 0 613 656 ; +C -1 ; WX 600 ; N ncaron ; B 33 0 617 696 ; +C -1 ; WX 600 ; N Ecaron ; B 23 0 652 839 ; +C -1 ; WX 600 ; N Ecircumflex ; B 23 0 652 839 ; +C -1 ; WX 600 ; N scedilla ; B 83 -229 592 450 ; +C -1 ; WX 600 ; N rcaron ; B 64 0 650 696 ; +C -1 ; WX 600 ; N Egrave ; B 23 0 652 839 ; +C -1 ; WX 600 ; N Eacute ; B 23 0 652 839 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 79 -278 667 597 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 23 -278 631 583 ; +C -1 ; WX 600 ; N Edieresis ; B 23 0 652 800 ; +C -1 ; WX 600 ; N nacute ; B 33 0 616 696 ; +C -1 ; WX 600 ; N uogonek ; B 94 -208 603 437 ; +C -1 ; WX 600 ; N umacron ; B 94 -13 603 626 ; +C -1 ; WX 600 ; N Dcaron ; B 23 0 622 839 ; +C -1 ; WX 600 ; N lcaron ; B 72 0 700 639 ; +C -1 ; WX 600 ; N Ccaron ; B 80 -14 663 839 ; +C -1 ; WX 600 ; N Cacute ; B 80 -14 663 839 ; +C -1 ; WX 600 ; N Ccedilla ; B 80 -229 663 597 ; +C -1 ; WX 600 ; N degree ; B 210 243 568 596 ; +C -1 ; WX 600 ; N Aogonek ; B -11 -208 633 583 ; +C -1 ; WX 600 ; N minus ; B 101 230 619 330 ; +C -1 ; WX 600 ; N multiply ; B 126 80 592 480 ; +C -1 ; WX 600 ; N divide ; B 101 28 619 532 ; +C -1 ; WX 600 ; N Aring ; B -11 0 633 871 ; +C -1 ; WX 600 ; N trademark ; B 60 220 732 583 ; +C -1 ; WX 600 ; N rcommaaccent ; B 64 -278 650 449 ; +C -1 ; WX 600 ; N lacute ; B 72 0 600 839 ; +C -1 ; WX 600 ; N omacron ; B 84 -16 609 626 ; +C -1 ; WX 600 ; N Atilde ; B -11 0 633 799 ; +C -1 ; WX 600 ; N icircumflex ; B 72 0 573 696 ; +C -1 ; WX 600 ; N igrave ; B 72 0 550 696 ; +C -1 ; WX 600 ; N ncommaaccent ; B 33 -278 583 450 ; +C -1 ; WX 600 ; N lcommaaccent ; B 72 -278 550 624 ; +C -1 ; WX 600 ; N plusminus ; B 52 0 640 624 ; +C -1 ; WX 600 ; N onehalf ; B 25 0 685 638 ; +C -1 ; WX 600 ; N onequarter ; B 25 0 673 638 ; +C -1 ; WX 600 ; N threequarters ; B 18 0 673 637 ; +C -1 ; WX 600 ; N iacute ; B 71 0 574 696 ; +C -1 ; WX 600 ; N Abreve ; B -11 0 633 831 ; +C -1 ; WX 600 ; N kcommaaccent ; B 42 -278 606 624 ; +C -1 ; WX 600 ; N Omacron ; B 75 -14 649 776 ; +C -1 ; WX 600 ; N imacron ; B 72 0 600 626 ; +C -1 ; WX 600 ; N emacron ; B 74 -16 600 626 ; +C -1 ; WX 600 ; N amacron ; B 65 -16 600 626 ; +C -1 ; WX 600 ; N tcommaaccent ; B 94 -278 547 591 ; +C -1 ; WX 600 ; N ydieresis ; B -13 -205 662 654 ; +C -1 ; WX 600 ; N zdotaccent ; B 85 0 599 654 ; +C -1 ; WX 600 ; N zcaron ; B 85 0 619 696 ; +C -1 ; WX 600 ; N zacute ; B 85 0 616 696 ; +C -1 ; WX 600 ; N yacute ; B -13 -205 662 696 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 94 -13 616 694 ; +C -1 ; WX 600 ; N eth ; B 83 -16 617 646 ; +C -1 ; WX 600 ; N uring ; B 94 -13 603 727 ; +C -1 ; WX 600 ; N Ocircumflex ; B 75 -14 649 839 ; +C -1 ; WX 600 ; N commaaccent ; B 147 -278 342 -59 ; +C -1 ; WX 600 ; N copyright ; B 48 -15 675 598 ; +C -1 ; WX 600 ; N registered ; B 48 -15 675 598 ; +C -1 ; WX 600 ; N Acircumflex ; B -11 0 633 839 ; +C -1 ; WX 600 ; N idieresis ; B 72 0 575 656 ; +C -1 ; WX 600 ; N lozenge ; B 133 -19 590 593 ; +C -1 ; WX 600 ; N Delta ; B 15 0 585 583 ; +C -1 ; WX 600 ; N notequal ; B 81 22 638 525 ; +C -1 ; WX 600 ; N radical ; B 74 -60 782 697 ; +C -1 ; WX 600 ; N Agrave ; B -11 0 633 839 ; +C -1 ; WX 600 ; N Aacute ; B -11 0 633 839 ; +C -1 ; WX 600 ; N lessequal ; B 50 0 666 591 ; +C -1 ; WX 600 ; N greaterequal ; B 52 0 660 591 ; +C -1 ; WX 600 ; N logicalnot ; B 125 115 560 445 ; +C -1 ; WX 600 ; N summation ; B 32 -97 668 671 ; +C -1 ; WX 600 ; N partialdiff ; B 138 -16 579 590 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 21 -278 706 583 ; +C -1 ; WX 600 ; N dcroat ; B 74 -14 712 624 ; +C -1 ; WX 600 ; N brokenbar ; B 227 -153 472 622 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 42 -278 616 583 ; +C -1 ; WX 600 ; N Adieresis ; B -11 0 633 800 ; +C -1 ; WX 600 ; N mu ; B 72 -153 603 440 ; +C -1 ; WX 600 ; N .notdef ; B 386 0 386 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -24 +KPX A Ccedilla -30 +KPX A G -20 +KPX A O -26 +KPX A Odieresis -26 +KPX A Q -25 +KPX A T -35 +KPX A U -33 +KPX A Uacute -33 +KPX A Ucircumflex -33 +KPX A Udieresis -33 +KPX A Ugrave -33 +KPX A V -63 +KPX A W -21 +KPX A Y -34 +KPX A a 8 +KPX A b 39 +KPX A c -12 +KPX A ccedilla -15 +KPX A comma -52 +KPX A d -4 +KPX A e -5 +KPX A g -5 +KPX A guillemotleft -44 +KPX A guilsinglleft -44 +KPX A hyphen -23 +KPX A o -11 +KPX A period -67 +KPX A q -10 +KPX A quotedblright -89 +KPX A quoteright -116 +KPX A t -25 +KPX A u -18 +KPX A v -41 +KPX A w -15 +KPX A y -41 +KPX Aacute C -24 +KPX Aacute G -20 +KPX Aacute O -26 +KPX Aacute Q -25 +KPX Aacute T -35 +KPX Aacute U -33 +KPX Aacute V -63 +KPX Aacute W -21 +KPX Aacute Y -34 +KPX Aacute a 8 +KPX Aacute b 39 +KPX Aacute c -12 +KPX Aacute comma -52 +KPX Aacute d -4 +KPX Aacute e -5 +KPX Aacute g -5 +KPX Aacute guillemotleft -44 +KPX Aacute guilsinglleft -44 +KPX Aacute hyphen -23 +KPX Aacute o -11 +KPX Aacute period -67 +KPX Aacute q -10 +KPX Aacute quoteright -116 +KPX Aacute t -25 +KPX Aacute u -18 +KPX Aacute v -41 +KPX Aacute w -15 +KPX Aacute y -41 +KPX Acircumflex C -24 +KPX Acircumflex G -20 +KPX Acircumflex O -26 +KPX Acircumflex Q -25 +KPX Acircumflex T -35 +KPX Acircumflex U -33 +KPX Acircumflex V -63 +KPX Acircumflex W -21 +KPX Acircumflex Y -34 +KPX Acircumflex comma -52 +KPX Acircumflex period -67 +KPX Adieresis C -24 +KPX Adieresis G -20 +KPX Adieresis O -26 +KPX Adieresis Q -25 +KPX Adieresis T -35 +KPX Adieresis U -33 +KPX Adieresis V -63 +KPX Adieresis W -21 +KPX Adieresis Y -34 +KPX Adieresis a 8 +KPX Adieresis b 39 +KPX Adieresis c -12 +KPX Adieresis comma -52 +KPX Adieresis d -4 +KPX Adieresis g -5 +KPX Adieresis guillemotleft -44 +KPX Adieresis guilsinglleft -44 +KPX Adieresis hyphen -23 +KPX Adieresis o -11 +KPX Adieresis period -67 +KPX Adieresis q -10 +KPX Adieresis quotedblright -89 +KPX Adieresis quoteright -116 +KPX Adieresis t -25 +KPX Adieresis u -18 +KPX Adieresis v -41 +KPX Adieresis w -15 +KPX Adieresis y -41 +KPX Agrave C -24 +KPX Agrave G -20 +KPX Agrave O -26 +KPX Agrave Q -25 +KPX Agrave T -35 +KPX Agrave U -33 +KPX Agrave V -63 +KPX Agrave W -21 +KPX Agrave Y -34 +KPX Agrave comma -52 +KPX Agrave period -67 +KPX Aring C -24 +KPX Aring G -20 +KPX Aring O -26 +KPX Aring Q -25 +KPX Aring T -35 +KPX Aring U -33 +KPX Aring V -63 +KPX Aring W -21 +KPX Aring Y -34 +KPX Aring a 8 +KPX Aring b 39 +KPX Aring c -12 +KPX Aring comma -52 +KPX Aring d -4 +KPX Aring e -5 +KPX Aring g -5 +KPX Aring guillemotleft -44 +KPX Aring guilsinglleft -44 +KPX Aring hyphen -23 +KPX Aring o -11 +KPX Aring period -67 +KPX Aring q -10 +KPX Aring quotedblright -89 +KPX Aring quoteright -116 +KPX Aring t -25 +KPX Aring u -18 +KPX Aring v -41 +KPX Aring w -15 +KPX Aring y -41 +KPX Atilde C -24 +KPX Atilde G -20 +KPX Atilde O -26 +KPX Atilde Q -25 +KPX Atilde T -35 +KPX Atilde U -33 +KPX Atilde V -63 +KPX Atilde W -21 +KPX Atilde Y -34 +KPX Atilde comma -52 +KPX Atilde period -67 +KPX B A -2 +KPX B AE -3 +KPX B Aacute -2 +KPX B Acircumflex -2 +KPX B Adieresis -2 +KPX B Aring -2 +KPX B Atilde -2 +KPX B O -14 +KPX B OE 7 +KPX B Oacute -14 +KPX B Ocircumflex -14 +KPX B Odieresis -14 +KPX B Ograve -14 +KPX B Oslash -12 +KPX B V -29 +KPX B W -10 +KPX B Y -50 +KPX C A 2 +KPX C AE 2 +KPX C Aacute 2 +KPX C Adieresis 2 +KPX C Aring 2 +KPX C H -18 +KPX C K -13 +KPX C O -19 +KPX C Oacute -19 +KPX C Odieresis -19 +KPX Ccedilla A -5 +KPX D A -32 +KPX D Aacute -32 +KPX D Acircumflex -32 +KPX D Adieresis -32 +KPX D Agrave -32 +KPX D Aring -32 +KPX D Atilde -32 +KPX D J -38 +KPX D T -36 +KPX D V -40 +KPX D W -16 +KPX D X -40 +KPX D Y -61 +KPX F A -47 +KPX F Aacute -47 +KPX F Acircumflex -47 +KPX F Adieresis -47 +KPX F Agrave -47 +KPX F Aring -47 +KPX F Atilde -47 +KPX F J -83 +KPX F O -32 +KPX F Odieresis -32 +KPX F a -44 +KPX F aacute -45 +KPX F adieresis -44 +KPX F ae -22 +KPX F aring -44 +KPX F comma -172 +KPX F e -51 +KPX F eacute -51 +KPX F hyphen -61 +KPX F i -50 +KPX F j -58 +KPX F o -55 +KPX F oacute -55 +KPX F odieresis -55 +KPX F oe -20 +KPX F oslash -55 +KPX F period -191 +KPX F r -37 +KPX F u -6 +KPX G A 0 +KPX G AE 0 +KPX G Aacute 0 +KPX G Acircumflex 0 +KPX G Adieresis 0 +KPX G Agrave 0 +KPX G Aring 0 +KPX G Atilde 0 +KPX G T -30 +KPX G V 1 +KPX G W 5 +KPX G Y -20 +KPX J A -15 +KPX J AE -24 +KPX J Adieresis -15 +KPX J Aring -15 +KPX K C -32 +KPX K G -30 +KPX K O -31 +KPX K OE -9 +KPX K Oacute -31 +KPX K Odieresis -31 +KPX K S -17 +KPX K T -20 +KPX K a -1 +KPX K adieresis -1 +KPX K ae 23 +KPX K aring -1 +KPX K e -14 +KPX K hyphen -50 +KPX K o -20 +KPX K oacute -20 +KPX K odieresis -20 +KPX K u -30 +KPX K udieresis -30 +KPX K y -56 +KPX L A 9 +KPX L AE 9 +KPX L Aacute 9 +KPX L Adieresis 9 +KPX L Aring 9 +KPX L C -19 +KPX L Ccedilla -19 +KPX L G -19 +KPX L O -16 +KPX L Oacute -16 +KPX L Ocircumflex -16 +KPX L Odieresis -16 +KPX L Ograve -16 +KPX L Otilde -16 +KPX L S -32 +KPX L T -60 +KPX L U -31 +KPX L Udieresis -31 +KPX L V -61 +KPX L W -23 +KPX L Y -59 +KPX L hyphen 5 +KPX L quotedblright -82 +KPX L quoteright -107 +KPX L u -13 +KPX L udieresis -14 +KPX L y -36 +KPX N A -10 +KPX N AE -11 +KPX N Aacute -10 +KPX N Adieresis -10 +KPX N Aring -10 +KPX N C -13 +KPX N Ccedilla -10 +KPX N G -12 +KPX N O -10 +KPX N Oacute -10 +KPX N Odieresis -10 +KPX N a -14 +KPX N aacute -15 +KPX N adieresis -14 +KPX N ae 14 +KPX N aring -14 +KPX N comma -79 +KPX N e -7 +KPX N eacute -7 +KPX N o -12 +KPX N oacute -12 +KPX N odieresis -12 +KPX N oslash -6 +KPX N period -98 +KPX N u -12 +KPX N udieresis -12 +KPX O A -21 +KPX O AE -20 +KPX O Aacute -21 +KPX O Adieresis -21 +KPX O Aring -21 +KPX O T -23 +KPX O V -32 +KPX O W -4 +KPX O X -28 +KPX O Y -51 +KPX Oacute A -21 +KPX Oacute T -23 +KPX Oacute V -32 +KPX Oacute W -4 +KPX Oacute Y -51 +KPX Ocircumflex T -23 +KPX Ocircumflex V -32 +KPX Ocircumflex Y -51 +KPX Odieresis A -21 +KPX Odieresis T -23 +KPX Odieresis V -32 +KPX Odieresis W -4 +KPX Odieresis X -28 +KPX Odieresis Y -51 +KPX Ograve T -23 +KPX Ograve V -32 +KPX Ograve Y -51 +KPX Oslash A -13 +KPX Otilde T -23 +KPX Otilde V -32 +KPX Otilde Y -51 +KPX P A -65 +KPX P AE -63 +KPX P Aacute -65 +KPX P Adieresis -65 +KPX P Aring -65 +KPX P J -80 +KPX P a -54 +KPX P aacute -54 +KPX P adieresis -54 +KPX P ae -31 +KPX P aring -54 +KPX P comma -164 +KPX P e -43 +KPX P eacute -43 +KPX P hyphen -39 +KPX P o -47 +KPX P oacute -47 +KPX P odieresis -47 +KPX P oe -18 +KPX P oslash -46 +KPX P period -183 +KPX R C -19 +KPX R Ccedilla -18 +KPX R G -18 +KPX R O -18 +KPX R OE 3 +KPX R Oacute -18 +KPX R Odieresis -18 +KPX R T -36 +KPX R U -20 +KPX R Udieresis -21 +KPX R V -34 +KPX R W -10 +KPX R Y -35 +KPX R a 7 +KPX R aacute 6 +KPX R adieresis 7 +KPX R ae 32 +KPX R aring 7 +KPX R e -4 +KPX R eacute -4 +KPX R hyphen -30 +KPX R o -9 +KPX R oacute -9 +KPX R odieresis -9 +KPX R oe 24 +KPX R u -9 +KPX R uacute -9 +KPX R udieresis -9 +KPX R y -22 +KPX S A -16 +KPX S AE -16 +KPX S Aacute -16 +KPX S Adieresis -16 +KPX S Aring -16 +KPX S T -47 +KPX S V -16 +KPX S W -15 +KPX S Y -37 +KPX S t -20 +KPX T A -35 +KPX T AE -35 +KPX T Aacute -35 +KPX T Acircumflex -35 +KPX T Adieresis -35 +KPX T Agrave -35 +KPX T Aring -35 +KPX T Atilde -35 +KPX T C -27 +KPX T G -27 +KPX T J -72 +KPX T O -22 +KPX T OE 0 +KPX T Oacute -22 +KPX T Ocircumflex -22 +KPX T Odieresis -22 +KPX T Ograve -22 +KPX T Oslash -23 +KPX T Otilde -22 +KPX T S -49 +KPX T V 4 +KPX T W -2 +KPX T Y -17 +KPX T a -39 +KPX T ae -17 +KPX T c -42 +KPX T colon -119 +KPX T comma -136 +KPX T e -31 +KPX T g -28 +KPX T guillemotleft -81 +KPX T guilsinglleft -81 +KPX T hyphen -96 +KPX T i -46 +KPX T j -53 +KPX T o -36 +KPX T oslash -36 +KPX T period -154 +KPX T r -33 +KPX T s -43 +KPX T semicolon -106 +KPX T u -1 +KPX T v 6 +KPX T w 5 +KPX T y -4 +KPX U A -23 +KPX U AE -22 +KPX U Aacute -23 +KPX U Acircumflex -23 +KPX U Adieresis -23 +KPX U Aring -23 +KPX U Atilde -23 +KPX U comma -98 +KPX U m 14 +KPX U n -10 +KPX U p -3 +KPX U period -118 +KPX U r -36 +KPX Uacute A -23 +KPX Uacute comma -98 +KPX Uacute m 14 +KPX Uacute n -10 +KPX Uacute p -3 +KPX Uacute period -118 +KPX Uacute r -36 +KPX Ucircumflex A -23 +KPX Udieresis A -23 +KPX Udieresis b 20 +KPX Udieresis comma -98 +KPX Udieresis m 14 +KPX Udieresis n -10 +KPX Udieresis p -3 +KPX Udieresis period -118 +KPX Udieresis r -36 +KPX Ugrave A -23 +KPX V A -12 +KPX V AE -21 +KPX V Aacute -12 +KPX V Acircumflex -12 +KPX V Adieresis -12 +KPX V Agrave -12 +KPX V Aring -12 +KPX V Atilde -12 +KPX V C -34 +KPX V G -34 +KPX V O -32 +KPX V Oacute -32 +KPX V Ocircumflex -32 +KPX V Odieresis -32 +KPX V Ograve -32 +KPX V Oslash -32 +KPX V Otilde -32 +KPX V S -35 +KPX V T 3 +KPX V a -59 +KPX V ae -30 +KPX V colon -139 +KPX V comma -150 +KPX V e -51 +KPX V g -50 +KPX V guillemotleft -83 +KPX V guilsinglleft -83 +KPX V hyphen -45 +KPX V i -64 +KPX V o -56 +KPX V oslash -51 +KPX V period -169 +KPX V r -51 +KPX V semicolon -127 +KPX V u -21 +KPX V y -22 +KPX W A -15 +KPX W AE -14 +KPX W Aacute -15 +KPX W Acircumflex -15 +KPX W Adieresis -15 +KPX W Agrave -15 +KPX W Aring -15 +KPX W Atilde -15 +KPX W C -9 +KPX W G -8 +KPX W O -7 +KPX W Oacute -7 +KPX W Ocircumflex -7 +KPX W Odieresis -7 +KPX W Ograve -7 +KPX W Oslash -3 +KPX W Otilde -7 +KPX W S -21 +KPX W T -1 +KPX W a -14 +KPX W ae 15 +KPX W colon -103 +KPX W comma -86 +KPX W e -6 +KPX W g -5 +KPX W guillemotleft -38 +KPX W guilsinglleft -38 +KPX W hyphen -3 +KPX W i -40 +KPX W o -11 +KPX W oslash -6 +KPX W period -105 +KPX W r -28 +KPX W semicolon -86 +KPX W u -3 +KPX W y -6 +KPX X C -33 +KPX X O -31 +KPX X Odieresis -31 +KPX X Q -30 +KPX X a -7 +KPX X e -20 +KPX X hyphen -55 +KPX X o -26 +KPX X u -36 +KPX X y -49 +KPX Y A -32 +KPX Y AE -35 +KPX Y Aacute -32 +KPX Y Acircumflex -32 +KPX Y Adieresis -32 +KPX Y Agrave -32 +KPX Y Aring -32 +KPX Y Atilde -32 +KPX Y C -54 +KPX Y G -54 +KPX Y O -52 +KPX Y Oacute -52 +KPX Y Ocircumflex -52 +KPX Y Odieresis -52 +KPX Y Ograve -52 +KPX Y Oslash -50 +KPX Y Otilde -52 +KPX Y S -55 +KPX Y T -17 +KPX Y a -61 +KPX Y ae -36 +KPX Y colon -157 +KPX Y comma -123 +KPX Y e -63 +KPX Y g -62 +KPX Y guillemotleft -99 +KPX Y guilsinglleft -99 +KPX Y hyphen -87 +KPX Y i -63 +KPX Y o -68 +KPX Y oslash -56 +KPX Y p -34 +KPX Y period -141 +KPX Y semicolon -139 +KPX Y u -48 +KPX Y v -38 +KPX Z v -47 +KPX Z y -55 +KPX a j -85 +KPX a quoteright -79 +KPX a v -25 +KPX a w -13 +KPX a y -36 +KPX aacute v -25 +KPX aacute w -13 +KPX aacute y -36 +KPX adieresis v -25 +KPX adieresis w -13 +KPX adieresis y -36 +KPX ae v 24 +KPX ae w 31 +KPX ae y 13 +KPX agrave v -25 +KPX agrave w -13 +KPX agrave y -36 +KPX aring v -25 +KPX aring w -13 +KPX aring y -36 +KPX b v -4 +KPX b w 3 +KPX b y -15 +KPX c h 8 +KPX c k 3 +KPX comma one -133 +KPX comma quotedblright -142 +KPX comma quoteright -170 +KPX e quoteright -64 +KPX e t -16 +KPX e v -14 +KPX e w -4 +KPX e x 3 +KPX e y -25 +KPX eacute v -14 +KPX eacute w -4 +KPX eacute y -25 +KPX ecircumflex v -14 +KPX ecircumflex w -4 +KPX ecircumflex y -25 +KPX eight four -63 +KPX eight one -80 +KPX eight seven -75 +KPX f a -38 +KPX f aacute -38 +KPX f adieresis -38 +KPX f ae -13 +KPX f aring -38 +KPX f e -46 +KPX f eacute -46 +KPX f f -46 +KPX f i -40 +KPX f j -63 +KPX f l -30 +KPX f o -51 +KPX f oacute -51 +KPX f odieresis -48 +KPX f oe -17 +KPX f oslash -34 +KPX f quoteright -78 +KPX f s -46 +KPX f t -10 +KPX five four -58 +KPX five one -80 +KPX five seven -80 +KPX four four -68 +KPX four one -72 +KPX four seven -100 +KPX g a -7 +KPX g adieresis -7 +KPX g ae 21 +KPX g aring -7 +KPX g e -1 +KPX g eacute -1 +KPX g l -38 +KPX g oacute -6 +KPX g odieresis -6 +KPX g r -5 +KPX guillemotright A -42 +KPX guillemotright AE -39 +KPX guillemotright Aacute -42 +KPX guillemotright Adieresis -42 +KPX guillemotright Aring -42 +KPX guillemotright T -81 +KPX guillemotright V -80 +KPX guillemotright W -35 +KPX guillemotright Y -96 +KPX guilsinglright A -42 +KPX guilsinglright AE -39 +KPX guilsinglright Aacute -42 +KPX guilsinglright Adieresis -42 +KPX guilsinglright Aring -42 +KPX guilsinglright T -81 +KPX guilsinglright V -80 +KPX guilsinglright W -35 +KPX guilsinglright Y -96 +KPX h quoteright -71 +KPX h y -29 +KPX hyphen A -21 +KPX hyphen AE -17 +KPX hyphen Aacute -21 +KPX hyphen Adieresis -21 +KPX hyphen Aring -21 +KPX hyphen T -93 +KPX hyphen V -41 +KPX hyphen W -1 +KPX hyphen Y -84 +KPX i T -64 +KPX i j -145 +KPX k a -5 +KPX k aacute -5 +KPX k adieresis -5 +KPX k ae 20 +KPX k aring -5 +KPX k comma -67 +KPX k e -17 +KPX k eacute -17 +KPX k g -16 +KPX k hyphen -53 +KPX k o -22 +KPX k oacute -22 +KPX k odieresis -22 +KPX k period -80 +KPX k s -13 +KPX k u -7 +KPX k udieresis -7 +KPX l v -77 +KPX l y -78 +KPX m p 31 +KPX m v 13 +KPX m w 22 +KPX m y 2 +KPX n T -47 +KPX n p 2 +KPX n quoteright -69 +KPX n v -17 +KPX n w -6 +KPX n y -28 +KPX nine four -59 +KPX nine one -76 +KPX nine seven -68 +KPX o T -39 +KPX o quoteright -61 +KPX o t -16 +KPX o v -10 +KPX o w -3 +KPX o x -10 +KPX o y -21 +KPX oacute v -10 +KPX oacute w -3 +KPX oacute y -21 +KPX ocircumflex t -16 +KPX odieresis t -16 +KPX odieresis v -10 +KPX odieresis w -3 +KPX odieresis x -10 +KPX odieresis y -21 +KPX ograve v -10 +KPX ograve w -3 +KPX ograve y -21 +KPX one comma -104 +KPX one eight -83 +KPX one five -63 +KPX one four -95 +KPX one nine -80 +KPX one one -68 +KPX one period -119 +KPX one seven -146 +KPX one six -107 +KPX one three -62 +KPX one two -53 +KPX one zero -95 +KPX p t -7 +KPX p y -12 +KPX period one -118 +KPX period quotedblright -137 +KPX period quoteright -165 +KPX q c 0 +KPX q u 37 +KPX quotedblbase A -10 +KPX quotedblbase AE -11 +KPX quotedblbase T -92 +KPX quotedblbase V -108 +KPX quotedblbase W -46 +KPX quotedblbase Y -80 +KPX quotedblleft A -66 +KPX quotedblleft AE -64 +KPX quotedblleft Aacute -66 +KPX quotedblleft Adieresis -66 +KPX quotedblleft Aring -66 +KPX quotedblleft T -28 +KPX quotedblleft V -20 +KPX quotedblleft W -15 +KPX quotedblleft Y -50 +KPX quotedblright A -81 +KPX quotedblright AE -79 +KPX quotedblright Aacute -81 +KPX quotedblright Adieresis -81 +KPX quotedblright Aring -81 +KPX quotedblright T -45 +KPX quotedblright V -35 +KPX quotedblright W -30 +KPX quotedblright Y -57 +KPX quoteleft A -90 +KPX quoteleft AE -88 +KPX quoteleft Aacute -90 +KPX quoteleft Adieresis -90 +KPX quoteleft Aring -90 +KPX quoteleft T -52 +KPX quoteleft V -45 +KPX quoteleft W -40 +KPX quoteleft Y -74 +KPX quoteright A -160 +KPX quoteright AE -158 +KPX quoteright Aacute -160 +KPX quoteright Adieresis -160 +KPX quoteright Aring -160 +KPX quoteright comma -234 +KPX quoteright d -146 +KPX quoteright o -148 +KPX quoteright period -251 +KPX quoteright r -155 +KPX quoteright s -154 +KPX quoteright t -121 +KPX quoteright v -114 +KPX quoteright w -109 +KPX quoteright y -120 +KPX r a -22 +KPX r aacute -22 +KPX r acircumflex -22 +KPX r adieresis -22 +KPX r ae 0 +KPX r agrave -22 +KPX r aring -22 +KPX r c -23 +KPX r ccedilla -18 +KPX r colon -100 +KPX r comma -112 +KPX r d -13 +KPX r e -11 +KPX r eacute -11 +KPX r ecircumflex -11 +KPX r egrave -11 +KPX r f -20 +KPX r g -9 +KPX r h -23 +KPX r hyphen -48 +KPX r i -30 +KPX r j -38 +KPX r k -33 +KPX r l -50 +KPX r m 31 +KPX r n 5 +KPX r o -16 +KPX r oacute -16 +KPX r ocircumflex -16 +KPX r odieresis -16 +KPX r oe 15 +KPX r ograve -16 +KPX r oslash -16 +KPX r p 25 +KPX r period -126 +KPX r q -8 +KPX r quoteright -45 +KPX r r -17 +KPX r s -25 +KPX r semicolon -88 +KPX r t 15 +KPX r u 15 +KPX r v 22 +KPX r w 21 +KPX r x 2 +KPX r y 10 +KPX r z -24 +KPX s quoteright -62 +KPX s t -14 +KPX seven colon -162 +KPX seven comma -160 +KPX seven eight -79 +KPX seven five -87 +KPX seven four -105 +KPX seven one -72 +KPX seven period -179 +KPX seven seven -69 +KPX seven six -98 +KPX seven three -78 +KPX seven two -70 +KPX six four -54 +KPX six one -60 +KPX six seven -55 +KPX t S -40 +KPX t a -21 +KPX t aacute -21 +KPX t adieresis -21 +KPX t ae 4 +KPX t aring -21 +KPX t colon -121 +KPX t e -30 +KPX t eacute -30 +KPX t h -8 +KPX t o -36 +KPX t oacute -36 +KPX t odieresis -36 +KPX t quoteright -102 +KPX t semicolon -107 +KPX three four -58 +KPX three one -79 +KPX three seven -74 +KPX two four -75 +KPX two one -73 +KPX two seven -78 +KPX u quoteright -58 +KPX v a -7 +KPX v aacute -7 +KPX v acircumflex -7 +KPX v adieresis -7 +KPX v ae 15 +KPX v agrave -7 +KPX v aring -7 +KPX v atilde -7 +KPX v c -17 +KPX v colon -86 +KPX v comma -139 +KPX v e -6 +KPX v eacute -6 +KPX v ecircumflex -6 +KPX v egrave -6 +KPX v g -2 +KPX v hyphen -28 +KPX v l -79 +KPX v o -11 +KPX v oacute -11 +KPX v odieresis -11 +KPX v ograve -11 +KPX v oslash -10 +KPX v period -159 +KPX v s -15 +KPX v semicolon -74 +KPX w a -6 +KPX w aacute -7 +KPX w acircumflex -6 +KPX w adieresis -6 +KPX w ae 22 +KPX w agrave -6 +KPX w aring -6 +KPX w atilde -6 +KPX w c -8 +KPX w colon -86 +KPX w comma -93 +KPX w e 0 +KPX w eacute 0 +KPX w ecircumflex 0 +KPX w egrave 0 +KPX w g 2 +KPX w hyphen -1 +KPX w l -51 +KPX w o -4 +KPX w oacute -4 +KPX w odieresis -4 +KPX w ograve -4 +KPX w oslash 0 +KPX w period -112 +KPX w s -13 +KPX w semicolon -74 +KPX x a -1 +KPX x c -16 +KPX x e -7 +KPX x eacute -7 +KPX x o -12 +KPX x q -9 +KPX y a -17 +KPX y aacute -18 +KPX y acircumflex -17 +KPX y adieresis -17 +KPX y ae 4 +KPX y agrave -17 +KPX y aring -17 +KPX y atilde -17 +KPX y c -25 +KPX y colon -96 +KPX y comma -137 +KPX y e -14 +KPX y eacute -14 +KPX y ecircumflex -14 +KPX y egrave -14 +KPX y g -11 +KPX y hyphen -23 +KPX y l -79 +KPX y o -20 +KPX y oacute -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y oslash -19 +KPX y period -158 +KPX y s -24 +KPX y semicolon -84 +KPX zero four -65 +KPX zero one -81 +KPX zero seven -79 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/pdf2swf/fonts/n022024l.pfb b/pdf2swf/fonts/n022024l.pfb new file mode 100644 index 00000000..8b7c24ff Binary files /dev/null and b/pdf2swf/fonts/n022024l.pfb differ diff --git a/pdf2swf/fonts/s050000l.afm b/pdf2swf/fonts/s050000l.afm new file mode 100644 index 00000000..d8c19362 --- /dev/null +++ b/pdf2swf/fonts/s050000l.afm @@ -0,0 +1,213 @@ +StartFontMetrics 3.0 +Comment Copyright URW Software, Copyright 1997 by URW +Comment Creation Date: 10/21/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName StandardSymL +FullName Standard Symbols L +FamilyName Standard Symbols L +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -229 +UnderlineThickness 46 +Version 001.005 +Notice URW Software, Copyright 1997 by URW +EncodingScheme FontSpecific +FontBBox -180 -293 1090 1010 +CapHeight 673 +XHeight 500 +Descender -222 +Ascender 673 +StartCharMetrics 190 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 128 -13 240 686 ; +C 34 ; WX 713 ; N universal ; B 31 0 681 673 ; +C 35 ; WX 500 ; N numbersign ; B 20 0 481 631 ; +C 36 ; WX 549 ; N existential ; B 25 0 478 673 ; +C 37 ; WX 833 ; N percent ; B 63 -7 771 673 ; +C 38 ; WX 778 ; N ampersand ; B 41 -13 750 675 ; +C 39 ; WX 439 ; N suchthat ; B 48 -13 414 503 ; +C 40 ; WX 333 ; N parenleft ; B 53 -172 300 680 ; +C 41 ; WX 333 ; N parenright ; B 30 -172 277 680 ; +C 42 ; WX 500 ; N asteriskmath ; B 65 127 427 546 ; +C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; +C 44 ; WX 250 ; N comma ; B 56 -120 194 102 ; +C 45 ; WX 549 ; N minus ; B 11 239 535 294 ; +C 46 ; WX 250 ; N period ; B 69 -13 181 100 ; +C 47 ; WX 278 ; N slash ; B 0 0 254 673 ; +C 48 ; WX 500 ; N zero ; B 23 -13 471 686 ; +C 49 ; WX 500 ; N one ; B 117 0 390 673 ; +C 50 ; WX 500 ; N two ; B 25 0 475 686 ; +C 51 ; WX 500 ; N three ; B 39 -13 435 686 ; +C 52 ; WX 500 ; N four ; B 16 0 469 680 ; +C 53 ; WX 500 ; N five ; B 29 -13 443 699 ; +C 54 ; WX 500 ; N six ; B 36 -13 468 685 ; +C 55 ; WX 500 ; N seven ; B 24 -7 448 673 ; +C 56 ; WX 500 ; N eight ; B 54 -13 440 686 ; +C 57 ; WX 500 ; N nine ; B 31 -13 460 686 ; +C 58 ; WX 278 ; N colon ; B 81 -13 193 463 ; +C 59 ; WX 278 ; N semicolon ; B 83 -120 221 463 ; +C 60 ; WX 549 ; N less ; B 26 0 523 522 ; +C 61 ; WX 549 ; N equal ; B 11 142 537 391 ; +C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; +C 63 ; WX 444 ; N question ; B 70 -13 412 686 ; +C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; +C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; +C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; +C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; +C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; +C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; +C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; +C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; +C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; +C 74 ; WX 631 ; N theta1 ; B 18 -13 623 686 ; +C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; +C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; +C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; +C 78 ; WX 722 ; N Nu ; B 29 0 720 673 ; +C 79 ; WX 722 ; N Omicron ; B 41 -13 715 686 ; +C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; +C 81 ; WX 741 ; N Theta ; B 41 -13 715 686 ; +C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; +C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; +C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; +C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; +C 86 ; WX 439 ; N sigma1 ; B 40 -222 436 513 ; +C 87 ; WX 768 ; N Omega ; B 34 0 736 686 ; +C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; +C 89 ; WX 795 ; N Psi ; B 15 0 781 686 ; +C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; +C 91 ; WX 333 ; N bracketleft ; B 86 -165 299 673 ; +C 92 ; WX 863 ; N therefore ; B 163 -13 701 433 ; +C 93 ; WX 333 ; N bracketright ; B 33 -165 246 673 ; +C 94 ; WX 658 ; N perpendicular ; B 15 0 652 673 ; +C 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ; +C 96 ; WX 500 ; N radicalex ; B 480 857 1090 913 ; +C 97 ; WX 631 ; N alpha ; B 41 -13 622 513 ; +C 98 ; WX 549 ; N beta ; B 61 -222 515 740 ; +C 99 ; WX 549 ; N chi ; B 12 -210 522 513 ; +C 100 ; WX 494 ; N delta ; B 40 -13 481 740 ; +C 101 ; WX 439 ; N epsilon ; B 22 -13 427 513 ; +C 102 ; WX 521 ; N phi ; B 27 -222 490 686 ; +C 103 ; WX 411 ; N gamma ; B 5 -219 484 513 ; +C 104 ; WX 603 ; N eta ; B 0 -222 527 513 ; +C 105 ; WX 329 ; N iota ; B 0 -13 301 513 ; +C 106 ; WX 603 ; N phi1 ; B 36 -222 587 513 ; +C 107 ; WX 549 ; N kappa ; B 33 0 558 513 ; +C 108 ; WX 549 ; N lambda ; B 24 -13 548 740 ; +C 109 ; WX 576 ; N mu ; B 33 -219 567 500 ; +C 110 ; WX 521 ; N nu ; B -9 -13 475 513 ; +C 111 ; WX 549 ; N omicron ; B 35 -13 501 513 ; +C 112 ; WX 549 ; N pi ; B 10 -13 530 500 ; +C 113 ; WX 521 ; N theta ; B 43 -13 485 686 ; +C 114 ; WX 549 ; N rho ; B 50 -220 490 513 ; +C 115 ; WX 603 ; N sigma ; B 30 -13 588 500 ; +C 116 ; WX 439 ; N tau ; B 10 -13 418 500 ; +C 117 ; WX 576 ; N upsilon ; B 7 -13 535 513 ; +C 118 ; WX 713 ; N omega1 ; B 12 -13 671 583 ; +C 119 ; WX 686 ; N omega ; B 42 -13 684 513 ; +C 120 ; WX 493 ; N xi ; B 27 -222 469 766 ; +C 121 ; WX 686 ; N psi ; B 12 -222 701 513 ; +C 122 ; WX 494 ; N zeta ; B 60 -222 467 756 ; +C 123 ; WX 480 ; N braceleft ; B 58 -165 397 673 ; +C 124 ; WX 200 ; N bar ; B 65 -177 135 673 ; +C 125 ; WX 480 ; N braceright ; B 79 -165 418 673 ; +C 126 ; WX 549 ; N similar ; B 17 196 529 325 ; +C 160 ; WX 762 ; N Euro ; B 53 -4 722 671 ; +C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 687 ; +C 162 ; WX 247 ; N minute ; B 27 476 228 735 ; +C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; +C 164 ; WX 167 ; N fraction ; B -180 0 340 673 ; +C 165 ; WX 713 ; N infinity ; B 26 115 688 414 ; +C 166 ; WX 500 ; N florin ; B 2 -174 494 687 ; +C 167 ; WX 753 ; N club ; B 86 -26 660 544 ; +C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; +C 169 ; WX 753 ; N heart ; B 117 -33 631 528 ; +C 170 ; WX 753 ; N spade ; B 113 -36 629 591 ; +C 171 ; WX 1042 ; N arrowboth ; B 24 -16 1024 512 ; +C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; +C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; +C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; +C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; +C 176 ; WX 400 ; N degree ; B 50 380 350 686 ; +C 177 ; WX 549 ; N plusminus ; B 10 0 539 662 ; +C 178 ; WX 411 ; N second ; B 20 476 413 735 ; +C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; +C 180 ; WX 549 ; N multiply ; B 17 9 533 525 ; +C 181 ; WX 713 ; N proportional ; B 27 114 639 416 ; +C 182 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ; +C 183 ; WX 460 ; N bullet ; B 50 155 410 518 ; +C 184 ; WX 549 ; N divide ; B 10 2 536 525 ; +C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; +C 186 ; WX 549 ; N equivalence ; B 14 87 538 446 ; +C 187 ; WX 549 ; N approxequal ; B 14 121 527 408 ; +C 188 ; WX 1000 ; N ellipsis ; B 111 -13 889 100 ; +C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; +C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; +C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; +C 192 ; WX 823 ; N aleph ; B 175 0 662 689 ; +C 193 ; WX 686 ; N Ifraktur ; B 10 -54 578 736 ; +C 194 ; WX 795 ; N Rfraktur ; B 26 -16 759 730 ; +C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 574 ; +C 196 ; WX 768 ; N circlemultiply ; B 43 0 733 691 ; +C 197 ; WX 768 ; N circleplus ; B 43 0 733 689 ; +C 198 ; WX 823 ; N emptyset ; B 39 -24 781 718 ; +C 199 ; WX 768 ; N intersection ; B 40 0 732 507 ; +C 200 ; WX 768 ; N union ; B 40 -18 732 489 ; +C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; +C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; +C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; +C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; +C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; +C 206 ; WX 713 ; N element ; B 45 0 505 470 ; +C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; +C 208 ; WX 768 ; N angle ; B 26 -1 738 672 ; +C 209 ; WX 713 ; N gradient ; B 36 0 681 687 ; +C 210 ; WX 790 ; N registerserif ; B 50 -13 740 690 ; +C 211 ; WX 790 ; N copyrightserif ; B 51 -13 741 690 ; +C 212 ; WX 890 ; N trademarkserif ; B 18 269 855 673 ; +C 213 ; WX 823 ; N product ; B 25 -124 803 751 ; +C 214 ; WX 549 ; N radical ; B 10 -35 515 913 ; +C 215 ; WX 250 ; N dotmath ; B 69 209 169 311 ; +C 216 ; WX 713 ; N logicalnot ; B 15 40 680 367 ; +C 217 ; WX 603 ; N logicaland ; B 23 -1 583 476 ; +C 218 ; WX 603 ; N logicalor ; B 30 -1 578 476 ; +C 219 ; WX 1042 ; N arrowdblboth ; B 27 -19 1023 506 ; +C 220 ; WX 987 ; N arrowdblleft ; B 30 -19 939 506 ; +C 221 ; WX 603 ; N arrowdblup ; B 39 0 567 909 ; +C 222 ; WX 987 ; N arrowdblright ; B 45 -19 954 506 ; +C 223 ; WX 603 ; N arrowdbldown ; B 44 0 572 909 ; +C 224 ; WX 494 ; N lozenge ; B 18 -1 466 740 ; +C 225 ; WX 329 ; N angleleft ; B 25 -152 306 757 ; +C 226 ; WX 790 ; N registersans ; B 50 -12 740 679 ; +C 227 ; WX 790 ; N copyrightsans ; B 49 -12 739 679 ; +C 228 ; WX 786 ; N trademarksans ; B 5 277 725 673 ; +C 229 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C 230 ; WX 384 ; N parenlefttp ; B 40 -293 436 926 ; +C 231 ; WX 384 ; N parenleftex ; B 40 -79 92 925 ; +C 232 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ; +C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 341 926 ; +C 234 ; WX 384 ; N bracketleftex ; B 0 -85 55 925 ; +C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ; +C 236 ; WX 494 ; N bracelefttp ; B 201 -75 439 926 ; +C 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ; +C 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ; +C 239 ; WX 494 ; N braceex ; B 201 -79 255 925 ; +C 241 ; WX 329 ; N angleright ; B 21 -152 302 757 ; +C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; +C 243 ; WX 686 ; N integraltp ; B 332 -83 715 922 ; +C 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ; +C 245 ; WX 686 ; N integralbt ; B 39 -81 415 921 ; +C 246 ; WX 384 ; N parenrighttp ; B 54 -293 450 926 ; +C 247 ; WX 384 ; N parenrightex ; B 398 -70 450 935 ; +C 248 ; WX 384 ; N parenrightbt ; B 54 -293 450 926 ; +C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 360 926 ; +C 250 ; WX 384 ; N bracketrightex ; B 305 -85 360 925 ; +C 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ; +C 252 ; WX 494 ; N bracerighttp ; B 17 -75 255 926 ; +C 253 ; WX 494 ; N bracerightmid ; B 201 -85 442 935 ; +C 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ; +C -1 ; WX 250 ; N .notdef ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/pdf2swf/fonts/s050000l.pfb b/pdf2swf/fonts/s050000l.pfb new file mode 100644 index 00000000..d0505e46 Binary files /dev/null and b/pdf2swf/fonts/s050000l.pfb differ diff --git a/pdf2swf/pdf2swf.1 b/pdf2swf/pdf2swf.1 new file mode 100644 index 00000000..f17bc616 --- /dev/null +++ b/pdf2swf/pdf2swf.1 @@ -0,0 +1,37 @@ +.TH pdf2swf "1" "October 2001" "pdf2swf" "swftools" +.SH NAME +pdf2swf - convert PDF files into SWF +.SH Synopsis +.B pdf2swf +[\fIoptions\fR] \fIfile.pdf\fR [\fIfile.swf\fR] +.SH DESCRIPTION +This tools attempts to convert Acrobat PDF files into Flash SWF Animation +files. +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +Print short help message and exit +.\".TP +.\" \fB\-\-version\fR +.\" Print version info and exit +.TP +\fB\-p\fR, \fB\-\-pages\fR \fIrange\fR +Convert only pages in \fIrange\fR with \fIrange\fR e.g. 1-20 or 1,4,6,9-11 or +3-5,10-12 +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Be verbose. Use more than one -v for greater effect. +.SH NOTES +Every page in the PDF will be a frame in the SWF. This means the generated +SWF must be inserted into some wrapper SWF if the SWF needs to be +browsed. See the documentation of +\fIswfcombine\fR for information about how to insert SWFs into one another. +.SH BUGS +.PP +type 3 and some truetype fonts don't work yet +.PP +Output files tend to be a little big + +.SH AUTHOR + +Matthias Kramm diff --git a/pdf2swf/pdf2swf.cc b/pdf2swf/pdf2swf.cc new file mode 100644 index 00000000..0d817962 --- /dev/null +++ b/pdf2swf/pdf2swf.cc @@ -0,0 +1,249 @@ +/* pdf2swf.cc + main routine for pdf2swf(1) + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#include +#include +#include +#include +#include "../config.h" +#include "args.h" +#include "pdfswf.h" +#include "t1lib.h" +extern "C" { +#include "log.h" +} + +static char * outputname = 0; +static int loglevel = 3; +static char * pagerange = 0; +static char * filename = 0; +static char * password = 0; + +int args_callback_option(char*name,char*val) { + if (!strcmp(name, "o")) + { + outputname = val; + return 1; + } + else if (!strcmp(name, "v")) + { + loglevel ++; + return 0; + } + else if (name[0]=='p') + { + /* check whether the page range follows the p directly, like + in -p1,2 */ + do { + name++; + } while(*name == 32 || *name == 13 || *name == 10 || *name == '\t'); + + if(*name) { + pagerange = name; + return 0; + } + pagerange = val; + return 1; + } + else if (!strcmp(name, "P")) + { + password = val; + return 1; + } + else if (!strcmp(name, "V")) + { + printf("pdf2swf - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else + { + fprintf(stderr, "Unknown option: -%s\n", name); + exit(1); + } + return 0; +} + +struct options_t +{ + char shortoption; + char*longoption; +} options[] = +{{'o',"output"}, + {'V',"version"}, + {'p',"pages"} +}; + +int args_callback_longoption(char*name,char*val) { + int t; + char*equal = strchr(name,'='); + if (equal) { + *equal = 0; + equal++; + } + for(t=0;t='0' && *digits<='9') + digits++; + if(digits == pos) { + fprintf(stderr, "Error: \"%s\" is not a valid format (digit expected)\n",irange); + exit(1); + } + + tmp=*digits;*digits=0; + num = atoi(pos); + *digits=tmp; + pos = digits; + + while(*pos == ' ' || *pos == '\r' || *pos == '\n' || *pos == '\t') + pos++; + + if(range && last<=t && num>=t) + return 1; + if(range) { + range = 0; + if(*pos) + pos ++; + continue; + } + + if(*pos=='-') + { + if(range) { + fprintf(stderr, "Error: \"%s\" is not a valid format (too many '-'s)\n",irange); + exit(1); + } + last = num; + range = 1; + if(*pos) + pos ++; + continue; + } + else + { + /* if it isn't a '-', we assume it is a seperator like + ',', ';', ':', whatever. */ + if(t == num) + return 1; + if(*pos) + pos ++; + continue; + } + } + if(range && last<=t) + return 1; + return 0; +} + +int main(int argn, char *argv[]) +{ + processargs(argn, argv); + initLog(0,-1,0,0,-1,loglevel); + + // test if the page range is o.k. + is_in_range(0x7fffffff, pagerange); + + if (!filename) { + args_callback_usage(argv[0]); + exit(0); + } + + logf(" reading data files from %s\n", DATADIR); + //TODO: use tempnam here. Check if environment already contains a + //T1LIB_CONFIG. + putenv( "T1LIB_CONFIG=/tmp/t1lib.config.tmp"); + FILE*fi = fopen("/tmp/t1lib.config.tmp", "wb"); + fprintf(fi, "FONTDATABASE=%s/FontDataBase\n", DATADIR); + fprintf(fi, "ENCODING=%s:.\n", DATADIR); + fprintf(fi, "AFM=%s:.\n", DATADIR); + fprintf(fi, "TYPE1=%s:.\n", DATADIR); + fclose(fi); + /* initialize t1lib */ + T1_SetBitmapPad( 16); + if ((T1_InitLib(NO_LOGFILE)==NULL)){ + fprintf(stderr, "Initialization of t1lib failed\n"); + exit(1); + } + unlink("/tmp/t1lib.config.tmp"); + + pdfswf_init(filename, password); + pdfswf_setoutputfilename(outputname); + + int pages = pdfswf_numpages(); + int t = 1; + for(t = 1; t <= pages; t++) + { + if(is_in_range(t, pagerange)) + pdfswf_convertpage(t); + } + + pdfswf_close(); + return 0; +} + + diff --git a/pdf2swf/spline.cc b/pdf2swf/spline.cc new file mode 100644 index 00000000..a0aed8dd --- /dev/null +++ b/pdf2swf/spline.cc @@ -0,0 +1,140 @@ +/* spline.cc + Routine to convert cubic splines into quadratic ones. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +/* At the moment, we convert non-recursively into at max. 6 quadratic splines, + trying to maintain the general structure of the curve, rather than it's + exact path. + To accomplish this, we split each curve at it's X,Y extremas as well as + its deviation's X,Y extremas. + */ + +#include +#include "spline.h" + +int solve(double a,double b,double c, double*dd) +{ + double det=b*b-4*a*c; + int pos = 0; + if(det<0) return 0; // we don't do imaginary. not today. + if(det==0) { // unlikely, but we have to deal with it. + dd[0]=-b/2*a; + return (dd[0]>0 && dd[0]<1); + } + + dd[pos]=(-b+sqrt(det))/(2*a); + if(dd[pos]>0 && dd[pos]<1) + pos++; + dd[pos]=(-b-sqrt(det))/(2*a); + if(dd[pos]>0 && dd[pos]<1) + pos++; + return pos; +} + +struct plotxy splinepos(struct plotxy p0, struct plotxy p1, struct plotxy p2, struct plotxy p3, double d) { + struct plotxy p; + p.x = (p0.x * d*d*d + p1.x * 3*(1-d)*d*d + p2.x * 3*(1-d)*(1-d)*d + p3.x * (1-d)*(1-d)*(1-d)); + p.y = (p0.y * d*d*d + p1.y * 3*(1-d)*d*d + p2.y * 3*(1-d)*(1-d)*d + p3.y * (1-d)*(1-d)*(1-d)); + return p; +} + +double distance(struct plotxy p0, struct plotxy p1) +{ + double xd=p1.x-p0.x; + double yd=p1.y-p0.y; + return sqrt(xd*xd+yd*yd); +} + +int wp(double p0,double p1,double p2,double p3,double*dd) +{ + double div= (6*p0-18*p1+18*p2-6*p3); + if(!div) return 0; + dd[0] = -(6*p1-12*p2+6*p3)/div; + return (dd[0]>0 && dd[0]<1); +} + +int approximate(struct plotxy p0, struct plotxy p1, + struct plotxy p2, struct plotxy p3, struct qspline*q) +{ + double roots[12]; + int pos = 0; + int s,t; + struct plotxy myxy[12]; + struct plotxy last; + // the parameters for the solve function are the 1st deviation of a cubic spline + roots[pos] = 0;pos++; + pos += solve(3*p0.x-9*p1.x+9*p2.x-3*p3.x, 6*p1.x-12*p2.x+6*p3.x,3*p2.x-3*p3.x, &roots[pos]); + pos += solve(3*p0.y-9*p1.y+9*p2.y-3*p3.y, 6*p1.y-12*p2.y+6*p3.y,3*p2.y-3*p3.y, &roots[pos]); + pos += wp(p0.x,p1.x,p2.x,p3.x,&roots[pos]); + pos += wp(p0.x,p1.x,p2.x,p3.x,&roots[pos]); + roots[pos] = 1;pos++; + + // bubblesort - fast enough for 4-6 parameters + for(s=0;sroots[t]) + { + double tmp=roots[s]; + roots[s]=roots[t]; + roots[t]=tmp; + } + for(t=0;t0.01 || t==pos-1) + { + s++; + last=myxy[t]; + } + } + pos = s; + + // try 1:curve through 3 points, using the middle of the cubic spline. + for(t=0;t + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __spline_h__ +#define __spline_h__ + +struct plotxy +{ + double x,y; +}; + +struct qspline +{ + struct plotxy start; + struct plotxy control; + struct plotxy end; +}; + +struct cspline +{ + struct plotxy start; + struct plotxy control1; + struct plotxy control2; + struct plotxy end; +}; + +int approximate(struct plotxy p0, struct plotxy p1, + struct plotxy p2, struct plotxy p3, struct qspline*q); + +#endif// __spline_h__ diff --git a/pdf2swf/swfoutput.cc b/pdf2swf/swfoutput.cc new file mode 100644 index 00000000..8636bba4 --- /dev/null +++ b/pdf2swf/swfoutput.cc @@ -0,0 +1,594 @@ +/* swfoutput.cc + Implements generation of swf files using the rfxswf lib. The routines + in this file are called from pdf2swf. + + This file is part of swftools. + + Swftools 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. + + Swftools 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 swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include +#include "swfoutput.h" +#include "spline.h" +extern "C" { +#include "../lib/log.h" +#include "../lib/rfxswf.h" +} + +typedef unsigned char u8; +typedef unsigned short int u16; +typedef unsigned long int u32; + +static int fi; +static int flag_protected; +static SWF swf; +static TAG *tag; +static int shapeid = -1; +static int shapecount = 0; +static SHAPE* shape; +static int fillstyleid; +static int linestyleid; +static int swflastx=0; +static int swflasty=0; +static int lastwasfill = 0; +static char* filename = 0; +static int sizex; +static int sizey; +static char fill = 0; +static int depth = 1; +static int startdepth = 1; +TAG* cliptags[128]; +int clipshapes[128]; +u32 clipdepths[128]; +int clippos = 0; + +void startshape(struct swfoutput* obj); + +// matrix multiplication. changes p0 +void transform (plotxy*p0,struct swfmatrix*m) +{ + double x,y; + x = m->m11*p0->x+m->m12*p0->y; + y = m->m21*p0->x+m->m22*p0->y; + p0->x = x + m->m13; + p0->y = y + m->m23; +} + +// write a move-to command into the swf +void moveto(plotxy p0) +{ + int rx = (int)(p0.x*20); + int ry = (int)(p0.y*20); + if(rx!=swflastx || ry!=swflasty) { + ShapeSetMove (tag, shape, rx,ry); + } + swflastx=rx; + swflasty=ry; +} + +// write a line-to command into the swf +void lineto(plotxy p0) +{ + int rx = ((int)(p0.x*20)-swflastx); + int ry = ((int)(p0.y*20)-swflasty); + /* we can't skip this for rx=0,ry=0, those + are plots */ + ShapeSetLine (tag, shape, rx,ry); + swflastx+=rx; + swflasty+=ry; +} + +// write a spline-to command into the swf +void splineto(plotxy control,plotxy end) +{ + int cx = ((int)(control.x*20)-swflastx); + int cy = ((int)(control.y*20)-swflasty); + swflastx += cx; + swflasty += cy; + int ex = ((int)(end.x*20)-swflastx); + int ey = ((int)(end.y*20)-swflasty); + swflastx += ex; + swflasty += ey; + ShapeSetCurve(tag, shape, cx,cy,ex,ey); +} + +/* write a line, given two points and the transformation + matrix. */ +void line(plotxy p0, plotxy p1, struct swfmatrix*m) +{ + transform(&p0,m); + transform(&p1,m); + moveto(p0); + lineto(p1); +} + +/* write a cubic (!) spline. This involves calling the approximate() + function out of spline.cc to convert it to a quadratic spline. */ +void spline(plotxy p0,plotxy p1,plotxy p2,plotxy p3,struct swfmatrix*m) +{ + double d; + struct qspline q[16]; + int num; + int t; + transform(&p0,m); + transform(&p1,m); + transform(&p2,m); + transform(&p3,m); + + num = approximate(p0,p1,p2,p3,q); + for(t=0;t Pathtype:%s",outline->type == T1_PATHTYPE_MOVE?"MOVE": + (outline->type == T1_PATHTYPE_LINE?"LINE" + :"BEZIER")); + logf(" relative coordinates: %08x,%08x", outline->dest.x, outline->dest.y); + x += (outline->dest.x/(float)0xffff); + y += (outline->dest.y/(float)0xffff); + logf(" coordinates: %f,%f", x, y); + if(outline->type == T1_PATHTYPE_MOVE) + { + } + else if(outline->type == T1_PATHTYPE_LINE) + { + plotxy p0; + plotxy p1; + p0.x=lastx; + p0.y=lasty; + p1.x=x; + p1.y=y; + line(p0,p1,m); + } + else if(outline->type == T1_PATHTYPE_BEZIER) + { + plotxy p0; + plotxy p1; + plotxy p2; + plotxy p3; + T1_BEZIERSEGMENT*o2 = (T1_BEZIERSEGMENT*)outline; + p0.x=x; + p0.y=y; + p1.x=o2->C.x/(float)0xffff+lastx; + p1.y=o2->C.y/(float)0xffff+lasty; + p2.x=o2->B.x/(float)0xffff+lastx; + p2.y=o2->B.y/(float)0xffff+lasty; + p3.x=lastx; + p3.y=lasty; + spline(p0,p1,p2,p3,m); + } + else { + logf(" drawpath: unknown outline type:%d\n", outline->type); + } + lastx=x; + lasty=y; + outline = outline->link; + } +} + +/* process a character. */ +void drawchar(struct swfoutput*obj, int t1fontindex, char character, swfmatrix*m) +{ + + /* */ + T1_OUTLINE*outline; + int width = T1_GetCharWidth(t1fontindex, character); + BBox bbox = T1_GetCharBBox(t1fontindex, character); + char*charname= T1_GetCharName(t1fontindex, character); + logf(" Font name is %s", T1_GetFontFileName(t1fontindex)); + logf(" char 0x%02x is named %s\n",character,charname); + logf(" bbox: %d %d %d %d\n",bbox.llx,bbox.lly,bbox.urx,bbox.ury); + if(!charname || charname[0] == '.') + { + /* for newline, we don't print an error. FIXME: We shouldn't get newlines here + in the first place + */ + if(character != '\n') { + logf(" Char to set is not defined!"); + logf(" - font file is %s\n", T1_GetFontFileName(t1fontindex)); + logf(" - char 0x%02x is named %s\n",character,charname); + } + return; + } + swfmatrix m2=*m; + m2.m11/=100; + m2.m21/=100; + m2.m12/=100; + m2.m22/=100; + outline = T1_GetCharOutline( t1fontindex, character, 100.0, 0); + + /** **/ + + if(shapeid<0) + startshape(obj); + + if(!lastwasfill) + ShapeSetStyle(tag,shape,0x8000,fillstyleid,0); + lastwasfill = 1; + + drawpath(outline, &m2, charname); +} + +/* draw a curved polygon. */ +void swfoutput_drawpath(swfoutput*output, T1_OUTLINE*outline, struct swfmatrix*m) +{ + if(shapeid<0) + startshape(output); + + if(lastwasfill && !fill) + { + ShapeSetStyle(tag,shape,linestyleid,0x8000,0); + lastwasfill = 0; + } + if(!lastwasfill && fill) + { + ShapeSetStyle(tag,shape,0x8000,fillstyleid,0); + lastwasfill = 1; + } + + drawpath(outline,m, 0); +} + + +/* set's the t1 font index of the font to use for swfoutput_drawchar(). */ +int swfoutput_setfont(struct swfoutput*obj, int t1id) +{ + obj->t1font = t1id; +} + +/* set's the matrix which is to be applied to characters drawn by + swfoutput_drawchar() */ +void swfoutput_setfontmatrix(struct swfoutput*obj,double m11,double m12, + double m21,double m22) +{ + obj->fontm11 = m11; + obj->fontm12 = m12; + obj->fontm21 = m21; + obj->fontm22 = m22; +} + +/* draws a character at x,y. */ +void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char character) +{ + swfmatrix m; + m.m11 = obj->fontm11; + m.m12 = obj->fontm12; + m.m21 = obj->fontm21; + m.m22 = obj->fontm22; + m.m13 = x; + m.m23 = y; + drawchar(obj, obj->t1font, character, &m); +} + +/* initialize the swf writer */ +void swfoutput_init(struct swfoutput* obj, char*_filename, int _sizex, int _sizey) +{ + GLYPH *glyph; + RGBA rgb; + SRECT r; + memset(obj, 0, sizeof(struct swfoutput)); + filename = _filename; + sizex = _sizex; + sizey = _sizey; + + logf(" initializing swf output for size %d*%d\n", sizex,sizey); + + obj->t1font = 0; + + memset(&swf,0x00,sizeof(SWF)); + + swf.FileVersion = 4; +// swf.FrameRate = 0x1900; + swf.FrameRate = 0x0040; // 1 frame per 4 seconds + swf.MovieSize.xmax = 20*sizex; + swf.MovieSize.ymax = 20*sizey; + + swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + tag = swf.FirstTag; + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + SetRGB(tag,&rgb); + if(flag_protected) + tag = InsertTag(tag, ST_PROTECT); + depth = 1; + startdepth = depth; +} + +void swfoutput_setprotected() //write PROTECT tag +{ + flag_protected = 1; +} + +void startshape(struct swfoutput*obj) +{ + RGBA rgb; + SRECT r; + tag = InsertTag(tag,ST_DEFINESHAPE); + + NewShape(&shape); + linestyleid = ShapeAddLineStyle(shape,obj->linewidth,&obj->strokergb); + rgb.r = obj->fillrgb.r; + rgb.g = obj->fillrgb.g; + rgb.b = obj->fillrgb.b; + fillstyleid = ShapeAddSolidFillStyle(shape,&obj->fillrgb); + + shapeid = ++shapecount; + SetU16(tag,shapeid); // ID + + r.xmin = 0; + r.ymin = 0; + r.xmax = 20*sizex; + r.ymax = 20*sizey; + + SetRect(tag,&r); + + SetShapeStyles(tag,shape); + ShapeCountBits(shape,NULL,NULL); + SetShapeBits(tag,shape); + + ShapeSetAll(tag,shape,/*x*/0,/*y*/0,linestyleid,0,0); + swflastx=swflasty=0; + lastwasfill = 0; +} + +void endshape() +{ + if(shapeid<0) + return; + ShapeSetEnd(tag); + tag = InsertTag(tag,ST_PLACEOBJECT2); + ObjectPlace(tag,shapeid,/*depth*/depth++,NULL,NULL,NULL); + shapeid = -1; +} + +void endpage(struct swfoutput*obj) +{ + if(shapeid>=0) + endshape(); + while(clippos) + swfoutput_endclip(obj); + tag = InsertTag(tag,ST_SHOWFRAME); +} + +void swfoutput_newpage(struct swfoutput*obj) +{ + endpage(obj); + + for(depth--;depth>=startdepth;depth--) { + tag = InsertTag(tag,ST_REMOVEOBJECT2); + SetU16(tag,depth); + } + + depth = 1; + startdepth = depth; +} + +/* "destroy" like in (oo-terminology) "destructor". Perform cleaning + up, complete the swf, and write it out. */ +void swfoutput_destroy(struct swfoutput* obj) +{ + endpage(obj); + + T1_CloseLib(); + if(!filename) + return; + if(filename) + fi = open(filename, O_CREAT|O_TRUNC|O_WRONLY, 0777); + else + fi = 1; // stdout + + if(fi<=0) { + logf(" Could not create \"%s\". ", filename); + exit(1); + } + + tag = InsertTag(tag,ST_END); + + if FAILED(WriteSWF(fi,&swf)) + logf(" WriteSWF() failed.\n"); + if(filename) + close(fi); + printf("SWF written\n"); +} + +void swfoutput_setdrawmode(swfoutput* obj, int mode) +{ + if(mode == DRAWMODE_FILL) + fill = 1; + else if(mode == DRAWMODE_EOFILL) + fill = 1; + else if(mode == DRAWMODE_STROKE) + fill = 0; + else if(mode == DRAWMODE_CLIP) + fill = 1; + else if(mode == DRAWMODE_EOCLIP) + fill = 1; +} + +void swfoutput_setfillcolor(swfoutput* obj, u8 r, u8 g, u8 b, u8 a) +{ + if(shape>=0) + endshape(); + obj->fillrgb.r = r; + obj->fillrgb.g = g; + obj->fillrgb.b = b; + obj->fillrgb.a = a; +} + +void swfoutput_setstrokecolor(swfoutput* obj, u8 r, u8 g, u8 b, u8 a) +{ + if(shape>=0) + endshape(); + obj->strokergb.r = r; + obj->strokergb.g = g; + obj->strokergb.b = b; + obj->strokergb.a = a; +} + +void swfoutput_setlinewidth(struct swfoutput*obj, double linewidth) +{ + if(shape>=0) + endshape(); + obj->linewidth = (u16)(linewidth*20); +} + + +void swfoutput_startclip(swfoutput*obj, T1_OUTLINE*outline, struct swfmatrix*m) +{ + if(shape>=0) + endshape(); + + if(clippos >= 127) + { + logf(" Too many clip levels."); + clippos --; + } + + startshape(obj); + + swfoutput_setdrawmode(obj, DRAWMODE_CLIP); + swfoutput_drawpath(obj, outline, m); + + ShapeSetEnd(tag); + tag = InsertTag(tag,ST_PLACEOBJECT2); + cliptags[clippos] = tag; + clipshapes[clippos] = shapeid; + clipdepths[clippos] = depth++; + clippos++; + shapeid = -1; +} + +void swfoutput_endclip(swfoutput*obj) +{ + if(shape>=0) + endshape(); + + if(!clippos) { + logf(" Invalid end of clipping region"); + return; + } + clippos--; + PlaceObject(cliptags[clippos],clipshapes[clippos],clipdepths[clippos],NULL,NULL,NULL,depth++); +} + +void swfoutput_drawimagefile(struct swfoutput*, char*filename, int sizex,int sizey, + double x1,double y1, + double x2,double y2, + double x3,double y3, + double x4,double y4) +{ + RGBA rgb; + SRECT r; + int lsid=0; + int fsid; + int bitid; + struct plotxy p1,p2,p3,p4; + int myshapeid; + double xmax=x1,ymax=y1,xmin=x1,ymin=y1; + if(x2>xmax) xmax=x2; + if(y2>ymax) ymax=y2; + if(x2xmax) xmax=x3; + if(y3>ymax) ymax=y3; + if(x3xmax) xmax=x4; + if(y4>ymax) ymax=y4; + if(x4=0) + endshape(); + + bitid = ++shapecount; + + /* bitmap */ + tag = InsertTag(tag,ST_DEFINEBITSJPEG2); + SetU16(tag, bitid); + SetJPEGBits(tag, filename, 85); + + /* shape */ + myshapeid = ++shapecount; + tag = InsertTag(tag,ST_DEFINESHAPE); + NewShape(&shape); + //lsid = ShapeAddLineStyle(shape,obj->linewidth,&obj->strokergb); + //fsid = ShapeAddSolidFillStyle(shape,&obj->fillrgb); + fsid = ShapeAddBitmapFillStyle(shape,&m,bitid,0); + SetU16(tag, myshapeid); + r.xmin = (int)(xmin*20); + r.ymin = (int)(ymin*20); + r.xmax = (int)(xmax*20); + r.ymax = (int)(ymax*20); + SetRect(tag,&r); + SetShapeStyles(tag,shape); + ShapeCountBits(shape,NULL,NULL); + SetShapeBits(tag,shape); + ShapeSetAll(tag,shape,/*x*/0,/*y*/0,lsid,fsid,0); + swflastx = swflasty = 0; + moveto(p1); + lineto(p2); + lineto(p3); + lineto(p4); + lineto(p1); + /* + ShapeMoveTo (tag, shape, (int)(x1*20),(int)(y1*20)); + ShapeSetLine (tag, shape, (int)(x1*20); + ShapeSetLine (tag, shape, x*20,0); + ShapeSetLine (tag, shape, 0,-y*20); + ShapeSetLine (tag, shape, -x*20,0);*/ + ShapeSetEnd(tag); + + /* instance */ + tag = InsertTag(tag,ST_PLACEOBJECT2); + ObjectPlace(tag,myshapeid,/*depth*/depth++,NULL,NULL,NULL); +} + diff --git a/pdf2swf/swfoutput.h b/pdf2swf/swfoutput.h new file mode 100644 index 00000000..9792fd28 --- /dev/null +++ b/pdf2swf/swfoutput.h @@ -0,0 +1,68 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __swfoutput_h__ +#define __swfoutput_h__ + +#include +extern "C" { +#include "../lib/rfxswf.h" +} + +typedef long int twip; + +struct swfmatrix { + double m11,m12,m21,m22,m13,m23; +}; + +struct swfcoord { + twip x; + twip y; +}; + +struct swfoutput +{ + int t1font; + double fontm11,fontm12,fontm21,fontm22; + unsigned short int linewidth; + RGBA strokergb; + RGBA fillrgb; +}; + +#define DRAWMODE_STROKE 1 +#define DRAWMODE_FILL 2 +#define DRAWMODE_EOFILL 3 +#define DRAWMODE_CLIP 4 +#define DRAWMODE_EOCLIP 5 + +void swfoutput_init(struct swfoutput*, char*filename, int sizex, int sizey); +void swfoutput_setprotected(); //write PROTECT tag + +void swfoutput_newpage(struct swfoutput*); + + int swfoutput_setfont(struct swfoutput*, int t1font); +void swfoutput_setdrawmode(struct swfoutput*, int drawmode); +void swfoutput_setfillcolor(struct swfoutput*, unsigned char r, unsigned char g, unsigned char b, unsigned char a); +void swfoutput_setstrokecolor(struct swfoutput*, unsigned char r, unsigned char g, unsigned char b, unsigned char a); +void swfoutput_setfontmatrix(struct swfoutput*,double,double,double,double); +void swfoutput_setlinewidth(struct swfoutput*, double linewidth); + +void swfoutput_drawchar(struct swfoutput*,double x,double y,char a); +void swfoutput_drawpath(struct swfoutput*, T1_OUTLINE*outline, struct swfmatrix*m); +void swfoutput_startclip(struct swfoutput*, T1_OUTLINE*outline, struct swfmatrix*m); +void swfoutput_endclip(struct swfoutput*); +void swfoutput_drawimagefile(struct swfoutput*, char*filename, int sizex,int sizey, + double x1,double y1, + double x2,double y2, + double x3,double y3, + double x4,double y4); + +void swfoutput_destroy(struct swfoutput*); + +#endif //__swfoutput_h__ diff --git a/pdf2swf/swfoutput_x11.cc b/pdf2swf/swfoutput_x11.cc new file mode 100644 index 00000000..947f9a96 --- /dev/null +++ b/pdf2swf/swfoutput_x11.cc @@ -0,0 +1,249 @@ +/* This file is only for testing purposes. it replaces swfoutput.cc, and dumps + the information it gets into an X11 Window, not into an swf. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#include +#include "swfoutput.h" +#include "kramm/xwindows.h" +#include "spline.h" +#include "log.h" + +modexwindow*vga; + +void inline pp(int x,int y) +{ + if(x<0) return; + if(y<0) return; + vga->putpixel(x,y); +} + +void circle(int mx,int my,int r) +{ + int d=3-(2*r); + int x=0; + int y=r; + + + while(x<=y) + { + pp(mx+x,my+y); + pp(mx+x,my-y); + pp(mx-x,my+y); + pp(mx-x,my-y); + pp(mx+y,my+x); + pp(mx+y,my-x); + pp(mx-y,my+x); + pp(mx-y,my-x); + + if(d<0) + { + d=d+(4*x)+6; + } + else + {y--; + d=d+4*(x-y)+10; + }; + x++; + } +} + +void qspline(plotxy p0,plotxy p1,plotxy p2) +{ + double d; + //vga->setcolor(0x0000ff); + for(d=0.00;d<=1.00;d+=0.001) { + int x = (int)(p0.x * d*d + p1.x * 2*(1-d)*d + p2.x * (1-d)*(1-d)); + int y = (int)(p0.y * d*d + p1.y * 2*(1-d)*d + p2.y * (1-d)*(1-d)); + pp(x,y); + } +} +void transform (plotxy*p0,struct swfmatrix*m) +{ + double x,y; + x = m->m11*p0->x+m->m12*p0->y; + y = m->m21*p0->x+m->m22*p0->y; + p0->x = x + m->m13; + p0->y = y + m->m23; +// p0->x *= 3; +// p0->y *= 3; +} + +void spline(plotxy p0,plotxy p1,plotxy p2,plotxy p3,struct swfmatrix*m) +{ + double d; + struct qspline q[16]; + int num; + int t; + transform(&p0,m); + transform(&p1,m); + transform(&p2,m); + transform(&p3,m); + //vga->setcolor(0xffff00); + //vga->drawline(p3.x,p3.y,p2.x,p2.y); + //vga->drawline(p2.x,p2.y,p1.x,p1.y); + //vga->drawline(p1.x,p1.y,p0.x,p0.y); + +/* vga->setcolor(0x00ff00); + circle(p0.x,p0.y,5); + circle(p1.x,p1.y,5); + circle(p2.x,p2.y,5); + circle(p3.x,p3.y,5);*/ + +/* vga->setcolor(0xff00ff); + for(d=0.00;d<1.00;d+=0.001) { + int x = (int)(p0.x * d*d*d + p1.x * 3*(1-d)*d*d + p2.x * 3*(1-d)*(1-d)*d + p3.x * (1-d)*(1-d)*(1-d)); + int y = (int)(p0.y * d*d*d + p1.y * 3*(1-d)*d*d + p2.y * 3*(1-d)*(1-d)*d + p3.y * (1-d)*(1-d)*(1-d)); + pp(x,y); + }*/ + + num = approximate(p0,p1,p2,p3,q); + for(t=0;tdrawline((int)p0.x,(int)p0.y,(int)p1.x,(int)p1.y); +} + +void swfoutput_drawpath(swfoutput*output, T1_OUTLINE*outline, struct swfmatrix*m) +{ + double x=0,y=0; + double lastx=0,lasty=0; + + vga->setcolor(0xffffff); + while (outline) + { + logf(" Pathtype:%s",outline->type == T1_PATHTYPE_MOVE?"MOVE": + (outline->type == T1_PATHTYPE_LINE?"LINE" + :"BEZIER")); + logf(" relative coordinates: %08x,%08x", outline->dest.x, outline->dest.y); + x += (outline->dest.x/(float)0xffff); + y += (outline->dest.y/(float)0xffff); + logf(" coordinates: %f,%f", x, y); + if(outline->type == T1_PATHTYPE_MOVE) + { + } + else if(outline->type == T1_PATHTYPE_LINE) + { + plotxy p0; + plotxy p1; + p0.x=lastx; + p0.y=lasty; + p1.x=x; + p1.y=y; + line(p0,p1,m); + } + else if(outline->type == T1_PATHTYPE_BEZIER) + { + plotxy p0; + plotxy p1; + plotxy p2; + plotxy p3; + T1_BEZIERSEGMENT*o2 = (T1_BEZIERSEGMENT*)outline; + p0.x=x; + p0.y=y; + p1.x=o2->C.x/(float)0xffff+lastx; + p1.y=o2->C.y/(float)0xffff+lasty; + p2.x=o2->B.x/(float)0xffff+lastx; + p2.y=o2->B.y/(float)0xffff+lasty; + p3.x=lastx; + p3.y=lasty; + spline(p0,p1,p2,p3,m); +// vga->drawline(320+lastx, 240+lasty, 320+x, 240+y); + } + else { + printf("outline type:%d\n", outline->type); + } + + lastx=x; + lasty=y; + outline = outline->link; + } + XFlush(X.d); +} + +void processchar(struct swfoutput*obj, int i, char c, swfmatrix*m) +{ + T1_OUTLINE*outline; + int width = T1_GetCharWidth(i, c); + BBox bbox = T1_GetCharBBox(i, c); + char*charname= T1_GetCharName(i, c); + logf(" Font name is %s", T1_GetFontFileName(i)); + logf(" char 0x%02x is named %s\n",c,charname); + logf(" bbox: %d %d %d %d\n",bbox.llx,bbox.lly,bbox.urx,bbox.ury); + if(!charname || charname[0] == '.') + { + logf(" Char to set is not defined!"); + logf(" - font file is %s\n", T1_GetFontFileName(i)); + logf(" - char 0x%02x is named %s\n",c,charname); + } + swfmatrix m2=*m; + m2.m11/=100; + m2.m21/=100; + m2.m12/=100; + m2.m22/=100; + outline = T1_GetCharOutline( i, c, 100.0, 0); + swfoutput_drawpath(obj, outline, &m2); +} + +void swfoutput_init(struct swfoutput* obj, int sizex, int sizey) +{ + GLYPH *glyph; + int i; + + logf(" initializing swf output for size %d*%d\n", sizex,sizey); + + vga=new modexwindow(sizex,sizey,""); + vga->setdirect(); + if(!vga->on()) exit(1); + vga->setcolor(0xff00ff); + + obj->t1font = 0; + obj->t1fontsize = 0.0025; +} + +int swfoutput_setfont(struct swfoutput*obj, int t1id) +{ + obj->t1font = t1id; +} + +void swfoutput_setfontsize(struct swfoutput* obj, double size) +{ + obj->t1fontsize = size; +} + +void swfoutput_setfontmatrix(struct swfoutput*obj,double m11,double m12, + double m21,double m22) +{ + obj->fontm11 = m11; + obj->fontm12 = m12; + obj->fontm21 = m21; + obj->fontm22 = m22; +} + +void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char a) +{ + swfmatrix m; + m.m11 = obj->fontm11*obj->t1fontsize; + m.m12 = obj->fontm12*obj->t1fontsize; + m.m21 = obj->fontm21*obj->t1fontsize; + m.m22 = obj->fontm22*obj->t1fontsize; + m.m13 = x; + m.m23 = y; + processchar(obj, obj->t1font, a, &m); +} + +void swfoutput_destroy(struct swfoutput* obj) +{ + T1_CloseLib(); + vga->off(); + delete vga; +} + diff --git a/pdf2swf/xpdf/Array.cc b/pdf2swf/xpdf/Array.cc new file mode 100644 index 00000000..9681b685 --- /dev/null +++ b/pdf2swf/xpdf/Array.cc @@ -0,0 +1,51 @@ +//======================================================================== +// +// Array.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "Object.h" +#include "Array.h" + +//------------------------------------------------------------------------ +// Array +//------------------------------------------------------------------------ + +Array::Array() { + elems = NULL; + size = length = 0; + ref = 1; +} + +Array::~Array() { + int i; + + for (i = 0; i < length; ++i) + elems[i].free(); + gfree(elems); +} + +void Array::add(Object *elem) { + if (length + 1 > size) { + size += 8; + elems = (Object *)grealloc(elems, size * sizeof(Object)); + } + elems[length] = *elem; + ++length; +} + +Object *Array::get(int i, Object *obj) { + return elems[i].fetch(obj); +} + +Object *Array::getNF(int i, Object *obj) { + return elems[i].copy(obj); +} diff --git a/pdf2swf/xpdf/Array.h b/pdf2swf/xpdf/Array.h new file mode 100644 index 00000000..ecf2eea6 --- /dev/null +++ b/pdf2swf/xpdf/Array.h @@ -0,0 +1,53 @@ +//======================================================================== +// +// Array.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef ARRAY_H +#define ARRAY_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "Object.h" + +//------------------------------------------------------------------------ +// Array +//------------------------------------------------------------------------ + +class Array { +public: + + // Constructor. + Array(); + + // Destructor. + ~Array(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get number of elements. + int getLength() { return length; } + + // Add an element. + void add(Object *elem); + + // Accessors. + Object *get(int i, Object *obj); + Object *getNF(int i, Object *obj); + +private: + + Object *elems; // array of elements + int size; // size of array + int length; // number of elements in array + int ref; // reference count +}; + +#endif diff --git a/pdf2swf/xpdf/Catalog.cc b/pdf2swf/xpdf/Catalog.cc new file mode 100644 index 00000000..815cca3a --- /dev/null +++ b/pdf2swf/xpdf/Catalog.cc @@ -0,0 +1,301 @@ +//======================================================================== +// +// Catalog.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Page.h" +#include "Error.h" +#include "Link.h" +#include "Catalog.h" + +//------------------------------------------------------------------------ +// Catalog +//------------------------------------------------------------------------ + +Catalog::Catalog(Object *catDict) { + Object pagesDict; + Object obj, obj2; + int numPages0; + int i; + + ok = gTrue; + pages = NULL; + pageRefs = NULL; + numPages = pagesSize = 0; + + if (!catDict->isDict()) { + error(-1, "Catalog object is wrong type (%s)", catDict->getTypeName()); + goto err1; + } + + // read page tree + catDict->dictLookup("Pages", &pagesDict); + // This should really be isDict("Pages"), but I've seen at least one + // PDF file where the /Type entry is missing. + if (!pagesDict.isDict()) { + error(-1, "Top-level pages object is wrong type (%s)", + pagesDict.getTypeName()); + goto err2; + } + pagesDict.dictLookup("Count", &obj); + if (!obj.isInt()) { + error(-1, "Page count in top-level pages object is wrong type (%s)", + obj.getTypeName()); + goto err3; + } + pagesSize = numPages0 = obj.getInt(); + obj.free(); + pages = (Page **)gmalloc(pagesSize * sizeof(Page *)); + pageRefs = (Ref *)gmalloc(pagesSize * sizeof(Ref)); + for (i = 0; i < pagesSize; ++i) { + pages[i] = NULL; + pageRefs[i].num = -1; + pageRefs[i].gen = -1; + } + numPages = readPageTree(pagesDict.getDict(), NULL, 0); + if (numPages != numPages0) { + error(-1, "Page count in top-level pages object is incorrect"); + } + pagesDict.free(); + + // read named destination dictionary + catDict->dictLookup("Dests", &dests); + + // read root of named destination tree + if (catDict->dictLookup("Names", &obj)->isDict()) + obj.dictLookup("Dests", &nameTree); + else + nameTree.initNull(); + obj.free(); + + // read base URI + baseURI = NULL; + if (catDict->dictLookup("URI", &obj)->isDict()) { + if (obj.dictLookup("Base", &obj2)->isString()) { + baseURI = obj2.getString()->copy(); + } + obj2.free(); + } + obj.free(); + + return; + + err3: + obj.free(); + err2: + pagesDict.free(); + err1: + dests.initNull(); + nameTree.initNull(); + ok = gFalse; +} + +Catalog::~Catalog() { + int i; + + if (pages) { + for (i = 0; i < pagesSize; ++i) { + if (pages[i]) { + delete pages[i]; + } + } + gfree(pages); + gfree(pageRefs); + } + dests.free(); + nameTree.free(); + if (baseURI) { + delete baseURI; + } +} + +int Catalog::readPageTree(Dict *pagesDict, PageAttrs *attrs, int start) { + Object kids; + Object kid; + Object kidRef; + PageAttrs *attrs1, *attrs2; + Page *page; + int i, j; + + attrs1 = new PageAttrs(attrs, pagesDict); + pagesDict->lookup("Kids", &kids); + if (!kids.isArray()) { + error(-1, "Kids object (page %d) is wrong type (%s)", + start+1, kids.getTypeName()); + goto err1; + } + for (i = 0; i < kids.arrayGetLength(); ++i) { + kids.arrayGet(i, &kid); + if (kid.isDict("Page")) { + attrs2 = new PageAttrs(attrs1, kid.getDict()); + page = new Page(start+1, kid.getDict(), attrs2); + if (!page->isOk()) { + ++start; + goto err3; + } + if (start >= pagesSize) { + pagesSize += 32; + pages = (Page **)grealloc(pages, pagesSize * sizeof(Page *)); + pageRefs = (Ref *)grealloc(pageRefs, pagesSize * sizeof(Ref)); + for (j = pagesSize - 32; j < pagesSize; ++j) { + pages[j] = NULL; + pageRefs[j].num = -1; + pageRefs[j].gen = -1; + } + } + pages[start] = page; + kids.arrayGetNF(i, &kidRef); + if (kidRef.isRef()) { + pageRefs[start].num = kidRef.getRefNum(); + pageRefs[start].gen = kidRef.getRefGen(); + } + kidRef.free(); + ++start; + // This should really be isDict("Pages"), but I've seen at least one + // PDF file where the /Type entry is missing. + } else if (kid.isDict()) { + if ((start = readPageTree(kid.getDict(), attrs1, start)) < 0) + goto err2; + } else { + error(-1, "Kid object (page %d) is wrong type (%s)", + start+1, kid.getTypeName()); + goto err2; + } + kid.free(); + } + delete attrs1; + kids.free(); + return start; + + err3: + delete page; + err2: + kid.free(); + err1: + kids.free(); + delete attrs1; + ok = gFalse; + return -1; +} + +int Catalog::findPage(int num, int gen) { + int i; + + for (i = 0; i < numPages; ++i) { + if (pageRefs[i].num == num && pageRefs[i].gen == gen) + return i + 1; + } + return 0; +} + +LinkDest *Catalog::findDest(GString *name) { + LinkDest *dest; + Object obj1, obj2; + GBool found; + + // try named destination dictionary then name tree + found = gFalse; + if (dests.isDict()) { + if (!dests.dictLookup(name->getCString(), &obj1)->isNull()) + found = gTrue; + else + obj1.free(); + } + if (!found && nameTree.isDict()) { + if (!findDestInTree(&nameTree, name, &obj1)->isNull()) + found = gTrue; + else + obj1.free(); + } + if (!found) + return NULL; + + // construct LinkDest + dest = NULL; + if (obj1.isArray()) { + dest = new LinkDest(obj1.getArray(), gTrue); + } else if (obj1.isDict()) { + if (obj1.dictLookup("D", &obj2)->isArray()) + dest = new LinkDest(obj2.getArray(), gTrue); + else + error(-1, "Bad named destination value"); + obj2.free(); + } else { + error(-1, "Bad named destination value"); + } + obj1.free(); + + return dest; +} + +Object *Catalog::findDestInTree(Object *tree, GString *name, Object *obj) { + Object names, name1; + Object kids, kid, limits, low, high; + GBool done, found; + int cmp, i; + + // leaf node + if (tree->dictLookup("Names", &names)->isArray()) { + done = found = gFalse; + for (i = 0; !done && i < names.arrayGetLength(); i += 2) { + if (names.arrayGet(i, &name1)->isString()) { + cmp = name->cmp(name1.getString()); + if (cmp == 0) { + names.arrayGet(i+1, obj); + found = gTrue; + done = gTrue; + } else if (cmp < 0) { + done = gTrue; + } + name1.free(); + } + } + names.free(); + if (!found) + obj->initNull(); + return obj; + } + names.free(); + + // root or intermediate node + done = gFalse; + if (tree->dictLookup("Kids", &kids)->isArray()) { + for (i = 0; !done && i < kids.arrayGetLength(); ++i) { + if (kids.arrayGet(i, &kid)->isDict()) { + if (kid.dictLookup("Limits", &limits)->isArray()) { + if (limits.arrayGet(0, &low)->isString() && + name->cmp(low.getString()) >= 0) { + if (limits.arrayGet(1, &high)->isString() && + name->cmp(high.getString()) <= 0) { + findDestInTree(&kid, name, obj); + done = gTrue; + } + high.free(); + } + low.free(); + } + limits.free(); + } + kid.free(); + } + } + kids.free(); + + // name was outside of ranges of all kids + if (!done) + obj->initNull(); + + return obj; +} diff --git a/pdf2swf/xpdf/Catalog.h b/pdf2swf/xpdf/Catalog.h new file mode 100644 index 00000000..b0f31432 --- /dev/null +++ b/pdf2swf/xpdf/Catalog.h @@ -0,0 +1,73 @@ +//======================================================================== +// +// Catalog.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef CATALOG_H +#define CATALOG_H + +#ifdef __GNUC__ +#pragma interface +#endif + +class Object; +class Page; +class PageAttrs; +struct Ref; +class LinkDest; + +//------------------------------------------------------------------------ +// Catalog +//------------------------------------------------------------------------ + +class Catalog { +public: + + // Constructor. + Catalog(Object *catDict); + + // Destructor. + ~Catalog(); + + // Is catalog valid? + GBool isOk() { return ok; } + + // Get number of pages. + int getNumPages() { return numPages; } + + // Get a page. + Page *getPage(int i) { return pages[i-1]; } + + // Get the reference for a page object. + Ref *getPageRef(int i) { return &pageRefs[i-1]; } + + // Return base URI, or NULL if none. + GString *getBaseURI() { return baseURI; } + + // Find a page, given its object ID. Returns page number, or 0 if + // not found. + int findPage(int num, int gen); + + // Find a named destination. Returns the link destination, or + // NULL if is not a destination. + LinkDest *findDest(GString *name); + +private: + + Page **pages; // array of pages + Ref *pageRefs; // object ID for each page + int numPages; // number of pages + int pagesSize; // size of pages array + Object dests; // named destination dictionary + Object nameTree; // name tree + GString *baseURI; // base URI for URI-type links + GBool ok; // true if catalog is valid + + int readPageTree(Dict *pages, PageAttrs *attrs, int start); + Object *findDestInTree(Object *tree, GString *name, Object *obj); +}; + +#endif diff --git a/pdf2swf/xpdf/CompactFontInfo.h b/pdf2swf/xpdf/CompactFontInfo.h new file mode 100644 index 00000000..c6426602 --- /dev/null +++ b/pdf2swf/xpdf/CompactFontInfo.h @@ -0,0 +1,464 @@ +//======================================================================== +// +// CompactFontInfo.h +// +// Copyright 1999 Derek B. Noonburg +// +//======================================================================== + +#ifndef COMPACTFONTINFO_H +#define COMPACTFONTINFO_H + +static char *type1CStdStrings[391] = { + ".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" +}; + +static Gushort type1CISOAdobeCharset[229] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228 +}; + +static Gushort type1CExpertCharset[166] = { + 0, 1, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 158, 155, 163, 319, 320, 321, 322, 323, 324, 325, + 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 +}; + +static Gushort type1CExpertSubsetCharset[87] = { + 0, 1, 231, 232, 235, 236, 237, 238, 13, 14, + 15, 99, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, 300, 301, + 302, 305, 314, 315, 158, 155, 163, 320, 321, 322, + 323, 324, 325, 326, 150, 164, 169, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 +}; + +#endif diff --git a/pdf2swf/xpdf/Decrypt.cc b/pdf2swf/xpdf/Decrypt.cc new file mode 100644 index 00000000..ae9b7323 --- /dev/null +++ b/pdf2swf/xpdf/Decrypt.cc @@ -0,0 +1,304 @@ +//======================================================================== +// +// Decrypt.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include "gmem.h" +#include "Decrypt.h" + +static void rc4InitKey(Guchar *key, int keyLen, Guchar *state); +static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c); +static void md5(Guchar *msg, int msgLen, Guchar *digest); + +static Guchar passwordPad[32] = { + 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 +}; + +//------------------------------------------------------------------------ +// Decrypt +//------------------------------------------------------------------------ + +Decrypt::Decrypt(Guchar *fileKey, int objNum, int objGen) { + // construct object key + objKey[0] = fileKey[0]; + objKey[1] = fileKey[1]; + objKey[2] = fileKey[2]; + objKey[3] = fileKey[3]; + objKey[4] = fileKey[4]; + objKey[5] = objNum & 0xff; + objKey[6] = (objNum >> 8) & 0xff; + objKey[7] = (objNum >> 16) & 0xff; + objKey[8] = objGen & 0xff; + objKey[9] = (objGen >> 8) & 0xff; + md5(objKey, 10, objKey); + + // set up for decryption + x = y = 0; + rc4InitKey(objKey, 10, state); +} + +void Decrypt::reset() { + x = y = 0; + rc4InitKey(objKey, 10, state); +} + +Guchar Decrypt::decryptByte(Guchar c) { + return rc4DecryptByte(state, &x, &y, c); +} + +GBool Decrypt::makeFileKey(GString *ownerKey, GString *userKey, + int permissions, GString *fileID, + GString *userPassword, Guchar *fileKey) { + Guchar *buf; + Guchar userTest[32]; + Guchar fState[256]; + Guchar fx, fy; + int len, i; + GBool ok; + + // generate file key + buf = (Guchar *)gmalloc(68 + fileID->getLength()); + if (userPassword) { + len = userPassword->getLength(); + if (len < 32) { + memcpy(buf, userPassword->getCString(), len); + memcpy(buf + len, passwordPad, 32 - len); + } else { + memcpy(buf, userPassword->getCString(), 32); + } + } else { + memcpy(buf, passwordPad, 32); + } + memcpy(buf + 32, ownerKey->getCString(), 32); + buf[64] = permissions & 0xff; + buf[65] = (permissions >> 8) & 0xff; + buf[66] = (permissions >> 16) & 0xff; + buf[67] = (permissions >> 24) & 0xff; + memcpy(buf + 68, fileID->getCString(), fileID->getLength()); + md5(buf, 68 + fileID->getLength(), fileKey); + + // test user key + fx = fy = 0; + rc4InitKey(fileKey, 5, fState); + for (i = 0; i < 32; ++i) { + userTest[i] = rc4DecryptByte(fState, &fx, &fy, userKey->getChar(i)); + } + ok = memcmp(userTest, passwordPad, 32) == 0; + gfree(buf); + + return ok; +} + +//------------------------------------------------------------------------ +// RC4-compatible decryption +//------------------------------------------------------------------------ + +static void rc4InitKey(Guchar *key, int keyLen, Guchar *state) { + Guchar index1, index2; + Guchar t; + int i; + + for (i = 0; i < 256; ++i) + state[i] = i; + index1 = index2 = 0; + for (i = 0; i < 256; ++i) { + index2 = (key[index1] + state[i] + index2) % 256; + t = state[i]; + state[i] = state[index2]; + state[index2] = t; + index1 = (index1 + 1) % keyLen; + } +} + +static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c) { + Guchar x1, y1, tx, ty; + + x1 = *x = (*x + 1) % 256; + y1 = *y = (state[*x] + *y) % 256; + tx = state[x1]; + ty = state[y1]; + state[x1] = ty; + state[y1] = tx; + return c ^ state[(tx + ty) % 256]; +} + +//------------------------------------------------------------------------ +// MD5 message digest +//------------------------------------------------------------------------ + +static inline Gulong rotateLeft(Gulong x, int r) { + x &= 0xffffffff; + return ((x << r) | (x >> (32 - r))) & 0xffffffff; +} + +static inline Gulong md5Round1(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + ((b & c) | (~b & d)) + Xk + Ti), s); +} + +static inline Gulong md5Round2(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + ((b & d) | (c & ~d)) + Xk + Ti), s); +} + +static inline Gulong md5Round3(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + (b ^ c ^ d) + Xk + Ti), s); +} + +static inline Gulong md5Round4(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + (c ^ (b | ~d)) + Xk + Ti), s); +} + +static void md5(Guchar *msg, int msgLen, Guchar *digest) { + Gulong x[16]; + Gulong a, b, c, d, aa, bb, cc, dd; + int n64; + int i, j, k; + + // compute number of 64-byte blocks + // (length + pad byte (0x80) + 8 bytes for length) + n64 = (msgLen + 1 + 8 + 63) / 64; + + // initialize a, b, c, d + a = 0x67452301; + b = 0xefcdab89; + c = 0x98badcfe; + d = 0x10325476; + + // loop through blocks + k = 0; + for (i = 0; i < n64; ++i) { + + // grab a 64-byte block + for (j = 0; j < 16 && k < msgLen - 3; ++j, k += 4) + x[j] = (((((msg[k+3] << 8) + msg[k+2]) << 8) + msg[k+1]) << 8) + msg[k]; + if (i == n64 - 1) { + if (k == msgLen - 3) + x[j] = 0x80000000 + (((msg[k+2] << 8) + msg[k+1]) << 8) + msg[k]; + else if (k == msgLen - 2) + x[j] = 0x800000 + (msg[k+1] << 8) + msg[k]; + else if (k == msgLen - 1) + x[j] = 0x8000 + msg[k]; + else + x[j] = 0x80; + ++j; + while (j < 16) + x[j++] = 0; + x[14] = msgLen << 3; + } + + // save a, b, c, d + aa = a; + bb = b; + cc = c; + dd = d; + + // round 1 + a = md5Round1(a, b, c, d, x[0], 7, 0xd76aa478); + d = md5Round1(d, a, b, c, x[1], 12, 0xe8c7b756); + c = md5Round1(c, d, a, b, x[2], 17, 0x242070db); + b = md5Round1(b, c, d, a, x[3], 22, 0xc1bdceee); + a = md5Round1(a, b, c, d, x[4], 7, 0xf57c0faf); + d = md5Round1(d, a, b, c, x[5], 12, 0x4787c62a); + c = md5Round1(c, d, a, b, x[6], 17, 0xa8304613); + b = md5Round1(b, c, d, a, x[7], 22, 0xfd469501); + a = md5Round1(a, b, c, d, x[8], 7, 0x698098d8); + d = md5Round1(d, a, b, c, x[9], 12, 0x8b44f7af); + c = md5Round1(c, d, a, b, x[10], 17, 0xffff5bb1); + b = md5Round1(b, c, d, a, x[11], 22, 0x895cd7be); + a = md5Round1(a, b, c, d, x[12], 7, 0x6b901122); + d = md5Round1(d, a, b, c, x[13], 12, 0xfd987193); + c = md5Round1(c, d, a, b, x[14], 17, 0xa679438e); + b = md5Round1(b, c, d, a, x[15], 22, 0x49b40821); + + // round 2 + a = md5Round2(a, b, c, d, x[1], 5, 0xf61e2562); + d = md5Round2(d, a, b, c, x[6], 9, 0xc040b340); + c = md5Round2(c, d, a, b, x[11], 14, 0x265e5a51); + b = md5Round2(b, c, d, a, x[0], 20, 0xe9b6c7aa); + a = md5Round2(a, b, c, d, x[5], 5, 0xd62f105d); + d = md5Round2(d, a, b, c, x[10], 9, 0x02441453); + c = md5Round2(c, d, a, b, x[15], 14, 0xd8a1e681); + b = md5Round2(b, c, d, a, x[4], 20, 0xe7d3fbc8); + a = md5Round2(a, b, c, d, x[9], 5, 0x21e1cde6); + d = md5Round2(d, a, b, c, x[14], 9, 0xc33707d6); + c = md5Round2(c, d, a, b, x[3], 14, 0xf4d50d87); + b = md5Round2(b, c, d, a, x[8], 20, 0x455a14ed); + a = md5Round2(a, b, c, d, x[13], 5, 0xa9e3e905); + d = md5Round2(d, a, b, c, x[2], 9, 0xfcefa3f8); + c = md5Round2(c, d, a, b, x[7], 14, 0x676f02d9); + b = md5Round2(b, c, d, a, x[12], 20, 0x8d2a4c8a); + + // round 3 + a = md5Round3(a, b, c, d, x[5], 4, 0xfffa3942); + d = md5Round3(d, a, b, c, x[8], 11, 0x8771f681); + c = md5Round3(c, d, a, b, x[11], 16, 0x6d9d6122); + b = md5Round3(b, c, d, a, x[14], 23, 0xfde5380c); + a = md5Round3(a, b, c, d, x[1], 4, 0xa4beea44); + d = md5Round3(d, a, b, c, x[4], 11, 0x4bdecfa9); + c = md5Round3(c, d, a, b, x[7], 16, 0xf6bb4b60); + b = md5Round3(b, c, d, a, x[10], 23, 0xbebfbc70); + a = md5Round3(a, b, c, d, x[13], 4, 0x289b7ec6); + d = md5Round3(d, a, b, c, x[0], 11, 0xeaa127fa); + c = md5Round3(c, d, a, b, x[3], 16, 0xd4ef3085); + b = md5Round3(b, c, d, a, x[6], 23, 0x04881d05); + a = md5Round3(a, b, c, d, x[9], 4, 0xd9d4d039); + d = md5Round3(d, a, b, c, x[12], 11, 0xe6db99e5); + c = md5Round3(c, d, a, b, x[15], 16, 0x1fa27cf8); + b = md5Round3(b, c, d, a, x[2], 23, 0xc4ac5665); + + // round 4 + a = md5Round4(a, b, c, d, x[0], 6, 0xf4292244); + d = md5Round4(d, a, b, c, x[7], 10, 0x432aff97); + c = md5Round4(c, d, a, b, x[14], 15, 0xab9423a7); + b = md5Round4(b, c, d, a, x[5], 21, 0xfc93a039); + a = md5Round4(a, b, c, d, x[12], 6, 0x655b59c3); + d = md5Round4(d, a, b, c, x[3], 10, 0x8f0ccc92); + c = md5Round4(c, d, a, b, x[10], 15, 0xffeff47d); + b = md5Round4(b, c, d, a, x[1], 21, 0x85845dd1); + a = md5Round4(a, b, c, d, x[8], 6, 0x6fa87e4f); + d = md5Round4(d, a, b, c, x[15], 10, 0xfe2ce6e0); + c = md5Round4(c, d, a, b, x[6], 15, 0xa3014314); + b = md5Round4(b, c, d, a, x[13], 21, 0x4e0811a1); + a = md5Round4(a, b, c, d, x[4], 6, 0xf7537e82); + d = md5Round4(d, a, b, c, x[11], 10, 0xbd3af235); + c = md5Round4(c, d, a, b, x[2], 15, 0x2ad7d2bb); + b = md5Round4(b, c, d, a, x[9], 21, 0xeb86d391); + + // increment a, b, c, d + a += aa; + b += bb; + c += cc; + d += dd; + } + + // break digest into bytes + digest[0] = a & 0xff; + digest[1] = (a >>= 8) & 0xff; + digest[2] = (a >>= 8) & 0xff; + digest[3] = (a >>= 8) & 0xff; + digest[4] = b & 0xff; + digest[5] = (b >>= 8) & 0xff; + digest[6] = (b >>= 8) & 0xff; + digest[7] = (b >>= 8) & 0xff; + digest[8] = c & 0xff; + digest[9] = (c >>= 8) & 0xff; + digest[10] = (c >>= 8) & 0xff; + digest[11] = (c >>= 8) & 0xff; + digest[12] = d & 0xff; + digest[13] = (d >>= 8) & 0xff; + digest[14] = (d >>= 8) & 0xff; + digest[15] = (d >>= 8) & 0xff; +} diff --git a/pdf2swf/xpdf/Decrypt.h b/pdf2swf/xpdf/Decrypt.h new file mode 100644 index 00000000..3ea43741 --- /dev/null +++ b/pdf2swf/xpdf/Decrypt.h @@ -0,0 +1,49 @@ +//======================================================================== +// +// Decrypt.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef DECRYPT_H +#define DECRYPT_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "gtypes.h" +#include "GString.h" + +//------------------------------------------------------------------------ +// Decrypt +//------------------------------------------------------------------------ + +class Decrypt { +public: + + // Initialize the decryptor object. + Decrypt(Guchar *fileKey, int objNum, int objGen); + + // Reset decryption. + void reset(); + + // Decrypt one byte. + Guchar decryptByte(Guchar c); + + // Generate a file key. The buffer must have space for + // at least 16 bytes. Checks user key and returns gTrue if okay. + // may be NULL. + static GBool makeFileKey(GString *ownerKey, GString *userKey, + int permissions, GString *fileID, + GString *userPassword, Guchar *fileKey); + +private: + + Guchar objKey[16]; + Guchar state[256]; + Guchar x, y; +}; + +#endif diff --git a/pdf2swf/xpdf/Dict.cc b/pdf2swf/xpdf/Dict.cc new file mode 100644 index 00000000..c9f4feca --- /dev/null +++ b/pdf2swf/xpdf/Dict.cc @@ -0,0 +1,88 @@ +//======================================================================== +// +// Dict.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "Object.h" +#include "XRef.h" +#include "Dict.h" + +//------------------------------------------------------------------------ +// Dict +//------------------------------------------------------------------------ + +Dict::Dict() { + entries = NULL; + size = length = 0; + ref = 1; +} + +Dict::~Dict() { + int i; + + for (i = 0; i < length; ++i) { + gfree(entries[i].key); + entries[i].val.free(); + } + gfree(entries); +} + +void Dict::add(char *key, Object *val) { + if (length + 1 > size) { + size += 8; + entries = (DictEntry *)grealloc(entries, size * sizeof(DictEntry)); + } + entries[length].key = key; + entries[length].val = *val; + ++length; +} + +inline DictEntry *Dict::find(char *key) { + int i; + + for (i = 0; i < length; ++i) { + if (!strcmp(key, entries[i].key)) + return &entries[i]; + } + return NULL; +} + +GBool Dict::is(char *type) { + DictEntry *e; + + return (e = find("Type")) && e->val.isName(type); +} + +Object *Dict::lookup(char *key, Object *obj) { + DictEntry *e; + + return (e = find(key)) ? e->val.fetch(obj) : obj->initNull(); +} + +Object *Dict::lookupNF(char *key, Object *obj) { + DictEntry *e; + + return (e = find(key)) ? e->val.copy(obj) : obj->initNull(); +} + +char *Dict::getKey(int i) { + return entries[i].key; +} + +Object *Dict::getVal(int i, Object *obj) { + return entries[i].val.fetch(obj); +} + +Object *Dict::getValNF(int i, Object *obj) { + return entries[i].val.copy(obj); +} diff --git a/pdf2swf/xpdf/Dict.h b/pdf2swf/xpdf/Dict.h new file mode 100644 index 00000000..cfc64d3b --- /dev/null +++ b/pdf2swf/xpdf/Dict.h @@ -0,0 +1,69 @@ +//======================================================================== +// +// Dict.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef DICT_H +#define DICT_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "Object.h" + +//------------------------------------------------------------------------ +// Dict +//------------------------------------------------------------------------ + +struct DictEntry { + char *key; + Object val; +}; + +class Dict { +public: + + // Constructor. + Dict(); + + // Destructor. + ~Dict(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get number of entries. + int getLength() { return length; } + + // Add an entry. NB: does not copy key. + void add(char *key, Object *val); + + // Check if dictionary is of specified type. + GBool is(char *type); + + // Look up an entry and return the value. Returns a null object + // if is not in the dictionary. + Object *lookup(char *key, Object *obj); + Object *lookupNF(char *key, Object *obj); + + // Iterative accessors. + char *getKey(int i); + Object *getVal(int i, Object *obj); + Object *getValNF(int i, Object *obj); + +private: + + DictEntry *entries; // array of entries + int size; // size of array + int length; // number of entries in dictionary + int ref; // reference count + + DictEntry *find(char *key); +}; + +#endif diff --git a/pdf2swf/xpdf/Error.cc b/pdf2swf/xpdf/Error.cc new file mode 100644 index 00000000..485a7cb4 --- /dev/null +++ b/pdf2swf/xpdf/Error.cc @@ -0,0 +1,50 @@ +//======================================================================== +// +// Error.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include "gtypes.h" +#include "Params.h" +#include "Error.h" + +FILE *errFile; +GBool errQuiet; + +void errorInit() { + if (errQuiet) { + errFile = NULL; + } else { + errFile = stderr; + } +} + +void CDECL error(int pos, char *msg, ...) { + va_list args; + + if (errQuiet) { + return; + } + if (printCommands) { + fflush(stdout); + } + if (pos >= 0) { + fprintf(errFile, "Error (%d): ", pos); + } else { + fprintf(errFile, "Error: "); + } + va_start(args, msg); + vfprintf(errFile, msg, args); + va_end(args); + fprintf(errFile, "\n"); + fflush(errFile); +} diff --git a/pdf2swf/xpdf/Error.h b/pdf2swf/xpdf/Error.h new file mode 100644 index 00000000..f651678c --- /dev/null +++ b/pdf2swf/xpdf/Error.h @@ -0,0 +1,26 @@ +//======================================================================== +// +// Error.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef ERROR_H +#define ERROR_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include +#include "config.h" + +// File to send error (and other) messages to. +extern FILE *errFile; + +extern void errorInit(); + +extern void CDECL error(int pos, char *msg, ...); + +#endif diff --git a/pdf2swf/xpdf/FontEncoding.cc b/pdf2swf/xpdf/FontEncoding.cc new file mode 100644 index 00000000..bf12577e --- /dev/null +++ b/pdf2swf/xpdf/FontEncoding.cc @@ -0,0 +1,143 @@ +//======================================================================== +// +// FontEncoding.cc +// +// Copyright 1999 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include +#include "gmem.h" +#include "FontEncoding.h" + +//------------------------------------------------------------------------ +// FontEncoding +//------------------------------------------------------------------------ + +inline int FontEncoding::hash(char *name) { + Guint h; + + h = (Guint)name[0] & 0xff; + if (h && name[1]) + h = h * 61 + ((Guint)name[1] & 0xff); + return (int)(h % (Guint)fontEncHashSize); +} + +FontEncoding::FontEncoding() { + int i; + + encoding = (char **)gmalloc(256 * sizeof(char *)); + size = 256; + freeEnc = gTrue; + for (i = 0; i < 256; ++i) + encoding[i] = NULL; + for (i = 0; i < fontEncHashSize; ++i) + hashTab[i] = -1; +} + +FontEncoding::FontEncoding(char **encoding, int size) { + int i; + + this->encoding = encoding; + this->size = size; + freeEnc = gFalse; + for (i = 0; i < fontEncHashSize; ++i) + hashTab[i] = -1; + for (i = 0; i < size; ++i) { + if (encoding[i]) + addChar1(i, encoding[i]); + } +} + +FontEncoding::FontEncoding(FontEncoding *fontEnc) { + int i; + + encoding = (char **)gmalloc(fontEnc->size * sizeof(char *)); + size = fontEnc->size; + freeEnc = gTrue; + for (i = 0; i < size; ++i) { + encoding[i] = + fontEnc->encoding[i] ? copyString(fontEnc->encoding[i]) : (char *)NULL; + } + memcpy(hashTab, fontEnc->hashTab, fontEncHashSize * sizeof(short)); +} + +void FontEncoding::addChar(int code, char *name) { + int h, i; + + // replace character associated with code + if (encoding[code]) { + h = hash(encoding[code]); + for (i = 0; i < fontEncHashSize; ++i) { + if (hashTab[h] == code) { + hashTab[h] = -2; + break; + } + if (++h == fontEncHashSize) + h = 0; + } + gfree(encoding[code]); + } + + // associate name with code + encoding[code] = name; + + // insert name in hash table + addChar1(code, name); +} + +void FontEncoding::addChar1(int code, char *name) { + int h, i, code2; + + // insert name in hash table + h = hash(name); + for (i = 0; i < fontEncHashSize; ++i) { + code2 = hashTab[h]; + if (code2 < 0) { + hashTab[h] = code; + break; + } else if (encoding[code2] && !strcmp(encoding[code2], name)) { + // keep the highest code for each char -- this is needed because + // X won't display chars with codes < 32 + if (code > code2) + hashTab[h] = code; + break; + } + if (++h == fontEncHashSize) + h = 0; + } +} + +FontEncoding::~FontEncoding() { + int i; + + if (freeEnc) { + for (i = 0; i < size; ++i) { + if (encoding[i]) + gfree(encoding[i]); + } + gfree(encoding); + } +} + +int FontEncoding::getCharCode(char *name) { + int h, i, code; + + h = hash(name); + for (i = 0; i < fontEncHashSize; ++i) { + code = hashTab[h]; + if (code == -1 || + (code >= 0 && encoding[code] && !strcmp(encoding[code], name))) + return code; + if (++h >= fontEncHashSize) + h = 0; + } + return -1; +} diff --git a/pdf2swf/xpdf/FontEncoding.h b/pdf2swf/xpdf/FontEncoding.h new file mode 100644 index 00000000..7c811536 --- /dev/null +++ b/pdf2swf/xpdf/FontEncoding.h @@ -0,0 +1,64 @@ +//======================================================================== +// +// FontEncoding.h +// +// Copyright 1999 Derek B. Noonburg +// +//======================================================================== + +#ifndef FONTENCODING_H +#define FONTENCODING_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "gtypes.h" + +//------------------------------------------------------------------------ +// FontEncoding +//------------------------------------------------------------------------ + +#define fontEncHashSize 419 + +class FontEncoding { +public: + + // Construct an empty encoding. + FontEncoding(); + + // Construct an encoding from an array of char names. + FontEncoding(char **encoding, int size); + + // Destructor. + ~FontEncoding(); + + // Create a copy of the encoding. + FontEncoding *copy() { return new FontEncoding(this); } + + // Return number of codes in encoding, i.e., max code + 1. + int getSize() { return size; } + + // Add a char to the encoding. + void addChar(int code, char *name); + + // Return the character name associated with . + char *getCharName(int code) { return encoding[code]; } + + // Return the code associated with . + int getCharCode(char *name); + +private: + + FontEncoding(FontEncoding *fontEnc); + int hash(char *name); + void addChar1(int code, char *name); + + char **encoding; // code --> name mapping + int size; // number of codes + GBool freeEnc; // should we free the encoding array? + short // name --> code hash table + hashTab[fontEncHashSize]; +}; + +#endif diff --git a/pdf2swf/xpdf/FontFile.cc b/pdf2swf/xpdf/FontFile.cc new file mode 100644 index 00000000..777b56a3 --- /dev/null +++ b/pdf2swf/xpdf/FontFile.cc @@ -0,0 +1,1633 @@ +//======================================================================== +// +// FontFile.cc +// +// Copyright 1999 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "gmem.h" +#include "Error.h" +#include "FontFile.h" + +#include "StdFontInfo.h" +#include "CompactFontInfo.h" + +//------------------------------------------------------------------------ + +static Guint getWord(Guchar *ptr, int size); +static double getNum(Guchar **ptr, GBool *fp); +static char *getString(int sid, Guchar *stringIdxPtr, + Guchar *stringStartPtr, int stringOffSize, + char *buf); + +//------------------------------------------------------------------------ + +static inline char *nextLine(char *line, char *end) { + while (line < end && *line != '\n' && *line != '\r') + ++line; + while (line < end && *line == '\n' || *line == '\r') + ++line; + return line; +} + +static char hexChars[17] = "0123456789ABCDEF"; + +//------------------------------------------------------------------------ +// FontFile +//------------------------------------------------------------------------ + +FontFile::FontFile() { +} + +FontFile::~FontFile() { +} + +//------------------------------------------------------------------------ +// Type1FontFile +//------------------------------------------------------------------------ + +Type1FontFile::Type1FontFile(char *file, int len) { + char *line, *line1, *p, *p2; + char buf[256]; + char c; + int n, code, i; + + name = NULL; + encoding = NULL; + freeEnc = gTrue; + + for (i = 1, line = file; i <= 100 && line < file + len && !encoding; ++i) { + + // get font name + if (!strncmp(line, "/FontName", 9)) { + strncpy(buf, line, 255); + buf[255] = '\0'; + if ((p = strchr(buf+9, '/')) && + (p = strtok(p+1, " \t\n\r"))) + name = copyString(p); + line = nextLine(line, file + len); + + // get encoding + } else if (!strncmp(line, "/Encoding StandardEncoding def", 30)) { + encoding = type1StdEncoding.copy(); + } else if (!strncmp(line, "/Encoding 256 array", 19)) { + encoding = new FontEncoding(); + for (i = 0; i < 300; ++i) { + line1 = nextLine(line, file + len); + if ((n = line1 - line) > 255) + n = 255; + strncpy(buf, line, n); + buf[n] = '\0'; + for (p = buf; *p == ' ' || *p == '\t'; ++p) ; + if (!strncmp(p, "dup", 3)) { + for (p += 3; *p == ' ' || *p == '\t'; ++p) ; + for (p2 = p; *p2 >= '0' && *p2 <= '9'; ++p2) ; + if (*p2) { + c = *p2; + *p2 = '\0'; + if ((code = atoi(p)) < 256) { + *p2 = c; + for (p = p2; *p == ' ' || *p == '\t'; ++p) ; + if (*p == '/') { + ++p; + for (p2 = p; *p2 && *p2 != ' ' && *p2 != '\t'; ++p2) ; + *p2 = '\0'; + encoding->addChar(code, copyString(p)); + } + } + } + } else { + if (strtok(buf, " \t") && + (p = strtok(NULL, " \t\n\r")) && !strcmp(p, "def")) { + break; + } + } + line = line1; + } + //~ check for getinterval/putinterval junk + + } else { + line = nextLine(line, file + len); + } + } +} + +Type1FontFile::~Type1FontFile() { + if (name) + gfree(name); + if (encoding && freeEnc) + delete encoding; +} + +FontEncoding *Type1FontFile::getEncoding(GBool taken) { + if (taken) + freeEnc = gFalse; + return encoding; +} + +//------------------------------------------------------------------------ +// Type1CFontFile +//------------------------------------------------------------------------ + +Type1CFontFile::Type1CFontFile(char *file, int len) { + char buf[256]; + Guchar *topPtr, *idxStartPtr, *idxPtr0, *idxPtr1; + Guchar *stringIdxPtr, *stringStartPtr; + int topOffSize, idxOffSize, stringOffSize; + int nFonts, nStrings, nGlyphs; + int nCodes, nRanges, nLeft, nSups; + Gushort *glyphNames; + int charset, enc, charstrings; + int charsetFormat, encFormat; + int c, sid; + double op[48]; + double x; + GBool isFP; + int key; + int i, j, n; + + name = NULL; + encoding = NULL; + freeEnc = gTrue; + + // read header + topPtr = (Guchar *)file + (file[2] & 0xff); + topOffSize = file[3] & 0xff; + + // read name index (first font only) + nFonts = getWord(topPtr, 2); + idxOffSize = topPtr[2]; + topPtr += 3; + idxStartPtr = topPtr + (nFonts + 1) * idxOffSize - 1; + idxPtr0 = idxStartPtr + getWord(topPtr, idxOffSize); + idxPtr1 = idxStartPtr + getWord(topPtr + idxOffSize, idxOffSize); + if ((n = idxPtr1 - idxPtr0) > 255) + n = 255; + strncpy(buf, (char *)idxPtr0, n); + buf[n] = '\0'; + name = copyString(buf); + topPtr = idxStartPtr + getWord(topPtr + nFonts * idxOffSize, idxOffSize); + + // read top dict index (first font only) + nFonts = getWord(topPtr, 2); + idxOffSize = topPtr[2]; + topPtr += 3; + idxStartPtr = topPtr + (nFonts + 1) * idxOffSize - 1; + idxPtr0 = idxStartPtr + getWord(topPtr, idxOffSize); + idxPtr1 = idxStartPtr + getWord(topPtr + idxOffSize, idxOffSize); + charset = 0; + enc = 0; + charstrings = 0; + i = 0; + while (idxPtr0 < idxPtr1) { + if (*idxPtr0 <= 27 || *idxPtr0 == 31) { + key = *idxPtr0++; + if (key == 0x0c) + key = (key << 8) | *idxPtr0++; + if (key == 0x0f) { // charset + charset = (int)op[0]; + } else if (key == 0x10) { // encoding + enc = (int)op[0]; + } else if (key == 0x11) { // charstrings + charstrings = (int)op[0]; + } + i = 0; + } else { + x = getNum(&idxPtr0, &isFP); + if (i < 48) + op[i++] = x; + } + } + topPtr = idxStartPtr + getWord(topPtr + nFonts * idxOffSize, idxOffSize); + + // read string index + nStrings = getWord(topPtr, 2); + stringOffSize = topPtr[2]; + topPtr += 3; + stringIdxPtr = topPtr; + stringStartPtr = topPtr + (nStrings + 1) * stringOffSize - 1; + topPtr = stringStartPtr + getWord(topPtr + nStrings * stringOffSize, + stringOffSize); + + // get number of glyphs from charstrings index + topPtr = (Guchar *)file + charstrings; + nGlyphs = getWord(topPtr, 2); + + // read charset + if (charset == 0) { + glyphNames = type1CISOAdobeCharset; + } else if (charset == 1) { + glyphNames = type1CExpertCharset; + } else if (charset == 2) { + glyphNames = type1CExpertSubsetCharset; + } else { + glyphNames = (Gushort *)gmalloc(nGlyphs * sizeof(Gushort)); + glyphNames[0] = 0; + topPtr = (Guchar *)file + charset; + charsetFormat = *topPtr++; + if (charsetFormat == 0) { + for (i = 1; i < nGlyphs; ++i) { + glyphNames[i] = getWord(topPtr, 2); + topPtr += 2; + } + } else if (charsetFormat == 1) { + i = 1; + while (i < nGlyphs) { + c = getWord(topPtr, 2); + topPtr += 2; + nLeft = *topPtr++; + for (j = 0; j <= nLeft; ++j) + glyphNames[i++] = c++; + } + } else if (charsetFormat == 2) { + i = 1; + while (i < nGlyphs) { + c = getWord(topPtr, 2); + topPtr += 2; + nLeft = getWord(topPtr, 2); + topPtr += 2; + for (j = 0; j <= nLeft; ++j) + glyphNames[i++] = c++; + } + } + } + + // read encoding (glyph -> code mapping) + if (enc == 0) { + encoding = type1StdEncoding.copy(); + } else if (enc == 1) { + encoding = type1ExpertEncoding.copy(); + } else { + encoding = new FontEncoding(); + topPtr = (Guchar *)file + enc; + encFormat = *topPtr++; + if ((encFormat & 0x7f) == 0) { + nCodes = 1 + *topPtr++; + if (nCodes > nGlyphs) { + nCodes = nGlyphs; + } + for (i = 1; i < nCodes; ++i) { + c = *topPtr++; + getString(glyphNames[i], stringIdxPtr, stringStartPtr, + stringOffSize, buf); + encoding->addChar(c, copyString(buf)); + } + } else if ((encFormat & 0x7f) == 1) { + nRanges = *topPtr++; + nCodes = 1; + for (i = 0; i < nRanges; ++i) { + c = *topPtr++; + nLeft = *topPtr++; + for (j = 0; j <= nLeft && nCodes < nGlyphs; ++j) { + getString(glyphNames[nCodes], stringIdxPtr, stringStartPtr, + stringOffSize, buf); + encoding->addChar(c, copyString(buf)); + ++nCodes; + ++c; + } + } + } + if (encFormat & 0x80) { + nSups = *topPtr++; + for (i = 0; i < nSups; ++i) { + c = *topPtr++; + sid = getWord(topPtr, 2); + topPtr += 2; + getString(sid, stringIdxPtr, stringStartPtr, + stringOffSize, buf); + encoding->addChar(c, copyString(buf)); + } + } + } + + if (charset > 2) + gfree(glyphNames); +} + +Type1CFontFile::~Type1CFontFile() { + if (name) + gfree(name); + if (encoding && freeEnc) + delete encoding; +} + +FontEncoding *Type1CFontFile::getEncoding(GBool taken) { + if (taken) + freeEnc = gFalse; + return encoding; +} + +static Guint getWord(Guchar *ptr, int size) { + Guint x; + int i; + + x = 0; + for (i = 0; i < size; ++i) + x = (x << 8) + *ptr++; + return x; +} + +static double getNum(Guchar **ptr, GBool *fp) { + static char nybChars[16] = "0123456789.ee -"; + int b0, b, nyb0, nyb1; + double x; + char buf[65]; + int i; + + x = 0; + *fp = gFalse; + b0 = (*ptr)[0]; + if (b0 < 28) { + x = 0; + } else if (b0 == 28) { + x = ((*ptr)[1] << 8) + (*ptr)[2]; + *ptr += 3; + } else if (b0 == 29) { + x = ((*ptr)[1] << 24) + ((*ptr)[2] << 16) + ((*ptr)[3] << 8) + (*ptr)[4]; + *ptr += 5; + } else if (b0 == 30) { + *ptr += 1; + i = 0; + do { + b = *(*ptr)++; + nyb0 = b >> 4; + nyb1 = b & 0x0f; + if (nyb0 == 0xf) + break; + buf[i++] = nybChars[nyb0]; + if (i == 64) + break; + if (nyb0 == 0xc) + buf[i++] = '-'; + if (i == 64) + break; + if (nyb1 == 0xf) + break; + buf[i++] = nybChars[nyb1]; + if (i == 64) + break; + if (nyb1 == 0xc) + buf[i++] = '-'; + } while (i < 64); + buf[i] = '\0'; + x = atof(buf); + *fp = gTrue; + } else if (b0 == 31) { + x = 0; + } else if (b0 < 247) { + x = b0 - 139; + *ptr += 1; + } else if (b0 < 251) { + x = ((b0 - 247) << 8) + (*ptr)[1] + 108; + *ptr += 2; + } else { + x = -((b0 - 251) << 8) - (*ptr)[1] - 108; + *ptr += 2; + } + return x; +} + +static char *getString(int sid, Guchar *stringIdxPtr, + Guchar *stringStartPtr, int stringOffSize, + char *buf) { + Guchar *idxPtr0, *idxPtr1; + int len; + + if (sid < 391) { + strcpy(buf, type1CStdStrings[sid]); + } else { + sid -= 391; + idxPtr0 = stringStartPtr + getWord(stringIdxPtr + sid * stringOffSize, + stringOffSize); + idxPtr1 = stringStartPtr + getWord(stringIdxPtr + (sid+1) * stringOffSize, + stringOffSize); + if ((len = idxPtr1 - idxPtr0) > 255) + len = 255; + strncpy(buf, (char *)idxPtr0, len); + buf[len] = '\0'; + } + return buf; +} + +//------------------------------------------------------------------------ +// Type1CFontConverter +//------------------------------------------------------------------------ + +Type1CFontConverter::Type1CFontConverter(char *file, int len, FILE *out) { + this->file = file; + this->len = len; + this->out = out; + r1 = 55665; + line = 0; +} + +Type1CFontConverter::~Type1CFontConverter() { +} + +void Type1CFontConverter::convert() { + char *fontName; + struct { + int version; + int notice; + int copyright; + int fullName; + int familyName; + int weight; + int isFixedPitch; + double italicAngle; + double underlinePosition; + double underlineThickness; + int paintType; + int charstringType; //~ ??? + double fontMatrix[6]; + int uniqueID; + double fontBBox[4]; + double strokeWidth; //~ ??? + int charset; + int encoding; + int charStrings; + int privateSize; + int privateOffset; + } dict; + char buf[256], eBuf[256]; + Guchar *topPtr, *idxStartPtr, *idxPtr0, *idxPtr1; + Guchar *stringIdxPtr, *stringStartPtr; + int topOffSize, idxOffSize, stringOffSize; + int nFonts, nStrings, nGlyphs; + int nCodes, nRanges, nLeft, nSups; + Gushort *glyphNames; + int charsetFormat, encFormat; + int subrsOffset, nSubrs; + int nCharStrings; + int c, sid; + double x; + GBool isFP; + int key; + int i, j, n; + + // read header + topPtr = (Guchar *)file + (file[2] & 0xff); + topOffSize = file[3] & 0xff; + + // read name (first font only) + nFonts = getWord(topPtr, 2); + idxOffSize = topPtr[2]; + topPtr += 3; + idxStartPtr = topPtr + (nFonts + 1) * idxOffSize - 1; + idxPtr0 = idxStartPtr + getWord(topPtr, idxOffSize); + idxPtr1 = idxStartPtr + getWord(topPtr + idxOffSize, idxOffSize); + if ((n = idxPtr1 - idxPtr0) > 255) + n = 255; + strncpy(buf, (char *)idxPtr0, n); + buf[n] = '\0'; + fontName = copyString(buf); + topPtr = idxStartPtr + getWord(topPtr + nFonts * idxOffSize, idxOffSize); + + // read top dict (first font only) + nFonts = getWord(topPtr, 2); + idxOffSize = topPtr[2]; + topPtr += 3; + idxStartPtr = topPtr + (nFonts + 1) * idxOffSize - 1; + idxPtr0 = idxStartPtr + getWord(topPtr, idxOffSize); + idxPtr1 = idxStartPtr + getWord(topPtr + idxOffSize, idxOffSize); + dict.version = 0; + dict.notice = 0; + dict.copyright = 0; + dict.fullName = 0; + dict.familyName = 0; + dict.weight = 0; + dict.isFixedPitch = 0; + dict.italicAngle = 0; + dict.underlinePosition = -100; + dict.underlineThickness = 50; + dict.paintType = 0; + dict.charstringType = 2; + dict.fontMatrix[0] = 0.001; + dict.fontMatrix[1] = 0; + dict.fontMatrix[2] = 0; + dict.fontMatrix[3] = 0.001; + dict.fontMatrix[4] = 0; + dict.fontMatrix[5] = 0; + dict.uniqueID = 0; + dict.fontBBox[0] = 0; + dict.fontBBox[1] = 0; + dict.fontBBox[2] = 0; + dict.fontBBox[3] = 0; + dict.strokeWidth = 0; + dict.charset = 0; + dict.encoding = 0; + dict.charStrings = 0; + dict.privateSize = 0; + dict.privateOffset = 0; + i = 0; + while (idxPtr0 < idxPtr1) { + if (*idxPtr0 <= 27 || *idxPtr0 == 31) { + key = *idxPtr0++; + if (key == 0x0c) + key = (key << 8) | *idxPtr0++; + switch (key) { + case 0x0000: dict.version = (int)op[0]; break; + case 0x0001: dict.notice = (int)op[0]; break; + case 0x0c00: dict.copyright = (int)op[0]; break; + case 0x0002: dict.fullName = (int)op[0]; break; + case 0x0003: dict.familyName = (int)op[0]; break; + case 0x0004: dict.weight = (int)op[0]; break; + case 0x0c01: dict.isFixedPitch = (int)op[0]; break; + case 0x0c02: dict.italicAngle = op[0]; break; + case 0x0c03: dict.underlinePosition = op[0]; break; + case 0x0c04: dict.underlineThickness = op[0]; break; + case 0x0c05: dict.paintType = (int)op[0]; break; + case 0x0c06: dict.charstringType = (int)op[0]; break; + case 0x0c07: dict.fontMatrix[0] = op[0]; + dict.fontMatrix[1] = op[1]; + dict.fontMatrix[2] = op[2]; + dict.fontMatrix[3] = op[3]; + dict.fontMatrix[4] = op[4]; + dict.fontMatrix[5] = op[5]; break; + case 0x000d: dict.uniqueID = (int)op[0]; break; + case 0x0005: dict.fontBBox[0] = op[0]; + dict.fontBBox[1] = op[1]; + dict.fontBBox[2] = op[2]; + dict.fontBBox[3] = op[3]; break; + case 0x0c08: dict.strokeWidth = op[0]; break; + case 0x000f: dict.charset = (int)op[0]; break; + case 0x0010: dict.encoding = (int)op[0]; break; + case 0x0011: dict.charStrings = (int)op[0]; break; + case 0x0012: dict.privateSize = (int)op[0]; + dict.privateOffset = (int)op[1]; break; + } + i = 0; + } else { + x = getNum(&idxPtr0, &isFP); + if (i < 48) { + op[i] = x; + fp[i++] = isFP; + } + } + } + topPtr = idxStartPtr + getWord(topPtr + nFonts * idxOffSize, idxOffSize); + + // read string index + nStrings = getWord(topPtr, 2); + stringOffSize = topPtr[2]; + topPtr += 3; + stringIdxPtr = topPtr; + stringStartPtr = topPtr + (nStrings + 1) * stringOffSize - 1; + topPtr = stringStartPtr + getWord(topPtr + nStrings * stringOffSize, + stringOffSize); + +#if 1 //~ + // get global subrs + int nGSubrs; + int gSubrOffSize; + + nGSubrs = getWord(topPtr, 2); + gSubrOffSize = topPtr[2]; + topPtr += 3; +#endif + + // write header and font dictionary, up to encoding + fprintf(out, "%%!FontType1-1.0: %s", fontName); + if (dict.version != 0) { + fprintf(out, "%s", + getString(dict.version, stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + fprintf(out, "\n"); + fprintf(out, "11 dict begin\n"); + fprintf(out, "/FontInfo 10 dict dup begin\n"); + if (dict.version != 0) { + fprintf(out, "/version (%s) readonly def\n", + getString(dict.version, stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + if (dict.notice != 0) { + fprintf(out, "/Notice (%s) readonly def\n", + getString(dict.notice, stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + if (dict.copyright != 0) { + fprintf(out, "/Copyright (%s) readonly def\n", + getString(dict.copyright, stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + if (dict.fullName != 0) { + fprintf(out, "/FullName (%s) readonly def\n", + getString(dict.fullName, stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + if (dict.familyName != 0) { + fprintf(out, "/FamilyName (%s) readonly def\n", + getString(dict.familyName, stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + if (dict.weight != 0) { + fprintf(out, "/Weight (%s) readonly def\n", + getString(dict.weight, stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + fprintf(out, "/isFixedPitch %s def\n", dict.isFixedPitch ? "true" : "false"); + fprintf(out, "/ItalicAngle %g def\n", dict.italicAngle); + fprintf(out, "/UnderlinePosition %g def\n", dict.underlinePosition); + fprintf(out, "/UnderlineThickness %g def\n", dict.underlineThickness); + fprintf(out, "end readonly def\n"); + fprintf(out, "/FontName /%s def\n", fontName); + fprintf(out, "/PaintType %d def\n", dict.paintType); + fprintf(out, "/FontType 1 def\n"); + fprintf(out, "/FontMatrix [%g %g %g %g %g %g] readonly def\n", + dict.fontMatrix[0], dict.fontMatrix[1], dict.fontMatrix[2], + dict.fontMatrix[3], dict.fontMatrix[4], dict.fontMatrix[5]); + fprintf(out, "/FontBBox [%g %g %g %g] readonly def\n", + dict.fontBBox[0], dict.fontBBox[1], + dict.fontBBox[2], dict.fontBBox[3]); + if (dict.uniqueID != 0) { + fprintf(out, "/UniqueID %d def\n", dict.uniqueID); + } + + // get number of glyphs from charstrings index + topPtr = (Guchar *)file + dict.charStrings; + nGlyphs = getWord(topPtr, 2); + + // read charset + if (dict.charset == 0) { + glyphNames = type1CISOAdobeCharset; + } else if (dict.charset == 1) { + glyphNames = type1CExpertCharset; + } else if (dict.charset == 2) { + glyphNames = type1CExpertSubsetCharset; + } else { + glyphNames = (Gushort *)gmalloc(nGlyphs * sizeof(Gushort)); + glyphNames[0] = 0; + topPtr = (Guchar *)file + dict.charset; + charsetFormat = *topPtr++; + if (charsetFormat == 0) { + for (i = 1; i < nGlyphs; ++i) { + glyphNames[i] = getWord(topPtr, 2); + topPtr += 2; + } + } else if (charsetFormat == 1) { + i = 1; + while (i < nGlyphs) { + c = getWord(topPtr, 2); + topPtr += 2; + nLeft = *topPtr++; + for (j = 0; j <= nLeft; ++j) + glyphNames[i++] = c++; + } + } else if (charsetFormat == 2) { + i = 1; + while (i < nGlyphs) { + c = getWord(topPtr, 2); + topPtr += 2; + nLeft = getWord(topPtr, 2); + topPtr += 2; + for (j = 0; j <= nLeft; ++j) + glyphNames[i++] = c++; + } + } + } + + // read encoding (glyph -> code mapping), write Type 1 encoding + fprintf(out, "/Encoding "); + if (dict.encoding == 0) { + fprintf(out, "StandardEncoding def\n"); + } else { + fprintf(out, "256 array\n"); + fprintf(out, "0 1 255 {1 index exch /.notdef put} for\n"); + if (dict.encoding == 1) { + for (i = 0; i < 256; ++i) { + if (type1ExpertEncodingNames[i]) + fprintf(out, "dup %d /%s put\n", i, type1ExpertEncodingNames[i]); + } + } else { + topPtr = (Guchar *)file + dict.encoding; + encFormat = *topPtr++; + if ((encFormat & 0x7f) == 0) { + nCodes = 1 + *topPtr++; + if (nCodes > nGlyphs) { + nCodes = nGlyphs; + } + for (i = 1; i < nCodes; ++i) { + c = *topPtr++; + fprintf(out, "dup %d /%s put\n", c, + getString(glyphNames[i], stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + } else if ((encFormat & 0x7f) == 1) { + nRanges = *topPtr++; + nCodes = 1; + for (i = 0; i < nRanges; ++i) { + c = *topPtr++; + nLeft = *topPtr++; + for (j = 0; j <= nLeft && nCodes < nGlyphs; ++j) { + fprintf(out, "dup %d /%s put\n", c, + getString(glyphNames[nCodes], stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + ++nCodes; + ++c; + } + } + } + if (encFormat & 0x80) { + nSups = *topPtr++; + for (i = 0; i < nSups; ++i) { + c = *topPtr++; + sid = getWord(topPtr, 2); + topPtr += 2; + fprintf(out, "dup %d /%s put\n", c, + getString(sid, stringIdxPtr, stringStartPtr, + stringOffSize, buf)); + } + } + } + fprintf(out, "readonly def\n"); + } + fprintf(out, "currentdict end\n"); + fprintf(out, "currentfile eexec\n"); + + // get private dictionary + eexecWrite("\x83\xca\x73\xd5"); + eexecWrite("dup /Private 32 dict dup begin\n"); + eexecWrite("/RD {string currentfile exch readstring pop} executeonly def\n"); + eexecWrite("/ND {noaccess def} executeonly def\n"); + eexecWrite("/NP {noaccess put} executeonly def\n"); + eexecWrite("/MinFeature {16 16} ND\n"); + eexecWrite("/password 5839 def\n"); + subrsOffset = 0; + defaultWidthX = 0; + nominalWidthX = 0; + topPtr = (Guchar *)file + dict.privateOffset; + idxPtr0 = topPtr; + idxPtr1 = idxPtr0 + dict.privateSize; + i = 0; + while (idxPtr0 < idxPtr1) { + if (*idxPtr0 <= 27 || *idxPtr0 == 31) { + key = *idxPtr0++; + if (key == 0x0c) + key = (key << 8) | *idxPtr0++; + switch (key) { + case 0x0006: + getDeltaInt(eBuf, "BlueValues", op, i); + eexecWrite(eBuf); + break; + case 0x0007: + getDeltaInt(eBuf, "OtherBlues", op, i); + eexecWrite(eBuf); + break; + case 0x0008: + getDeltaInt(eBuf, "FamilyBlues", op, i); + eexecWrite(eBuf); + break; + case 0x0009: + getDeltaInt(eBuf, "FamilyOtherBlues", op, i); + eexecWrite(eBuf); + break; + case 0x0c09: + sprintf(eBuf, "/BlueScale %g def\n", op[0]); + eexecWrite(eBuf); + break; + case 0x0c0a: + sprintf(eBuf, "/BlueShift %d def\n", (int)op[0]); + eexecWrite(eBuf); + break; + case 0x0c0b: + sprintf(eBuf, "/BlueFuzz %d def\n", (int)op[0]); + eexecWrite(eBuf); + break; + case 0x000a: + sprintf(eBuf, "/StdHW [%g] def\n", op[0]); + eexecWrite(eBuf); + break; + case 0x000b: + sprintf(eBuf, "/StdVW [%g] def\n", op[0]); + eexecWrite(eBuf); + break; + case 0x0c0c: + getDeltaReal(eBuf, "StemSnapH", op, i); + eexecWrite(eBuf); + break; + case 0x0c0d: + getDeltaReal(eBuf, "StemSnapV", op, i); + eexecWrite(eBuf); + break; + case 0x0c0e: + sprintf(eBuf, "/ForceBold %s def\n", op[0] ? "true" : "false"); + eexecWrite(eBuf); + break; + case 0x0c0f: + sprintf(eBuf, "/ForceBoldThreshold %g def\n", op[0]); + eexecWrite(eBuf); + break; + case 0x0c11: + sprintf(eBuf, "/LanguageGroup %d def\n", (int)op[0]); + eexecWrite(eBuf); + break; + case 0x0c12: + sprintf(eBuf, "/ExpansionFactor %g def\n", op[0]); + eexecWrite(eBuf); + break; + case 0x0c13: + error(-1, "Got Type 1C InitialRandomSeed"); + break; + case 0x0013: + subrsOffset = (int)op[0]; + break; + case 0x0014: + defaultWidthX = op[0]; + defaultWidthXFP = fp[0]; + break; + case 0x0015: + nominalWidthX = op[0]; + nominalWidthXFP = fp[0]; + break; + default: + error(-1, "Uknown Type 1C private dict entry %04x", key); + break; + } + i = 0; + } else { + x = getNum(&idxPtr0, &isFP); + if (i < 48) { + op[i] = x; + fp[i++] = isFP; + } + } + } + + // get subrs + if (subrsOffset != 0) { + topPtr += subrsOffset; + nSubrs = getWord(topPtr, 2); + idxOffSize = topPtr[2]; + topPtr += 3; + sprintf(eBuf, "/Subrs %d array\n", nSubrs); + eexecWrite(eBuf); + idxStartPtr = topPtr + (nSubrs + 1) * idxOffSize - 1; + idxPtr1 = idxStartPtr + getWord(topPtr, idxOffSize); + for (i = 0; i < nSubrs; ++i) { + idxPtr0 = idxPtr1; + idxPtr1 = idxStartPtr + getWord(topPtr + (i+1)*idxOffSize, idxOffSize); + n = idxPtr1 - idxPtr0; +#if 1 //~ + error(-1, "Unimplemented Type 2 subrs"); +#else + sprintf(eBuf, "dup %d %d RD ", i, n); + eexecWrite(eBuf); + cvtGlyph(idxPtr0, n); + eexecWrite(" NP\n"); +#endif + } + eexecWrite("ND\n"); + } + + // get CharStrings + topPtr = (Guchar *)file + dict.charStrings; + nCharStrings = getWord(topPtr, 2); + idxOffSize = topPtr[2]; + topPtr += 3; + sprintf(eBuf, "2 index /CharStrings %d dict dup begin\n", nCharStrings); + eexecWrite(eBuf); + idxStartPtr = topPtr + (nCharStrings + 1) * idxOffSize - 1; + idxPtr1 = idxStartPtr + getWord(topPtr, idxOffSize); + for (i = 0; i < nCharStrings; ++i) { + idxPtr0 = idxPtr1; + idxPtr1 = idxStartPtr + getWord(topPtr + (i+1)*idxOffSize, idxOffSize); + n = idxPtr1 - idxPtr0; + cvtGlyph(getString(glyphNames[i], stringIdxPtr, stringStartPtr, + stringOffSize, buf), + idxPtr0, n); + } + eexecWrite("end\n"); + eexecWrite("end\n"); + eexecWrite("readonly put\n"); + eexecWrite("noaccess put\n"); + eexecWrite("dup /FontName get exch definefont pop\n"); + eexecWrite("mark currentfile closefile\n"); + + // trailer + if (line > 0) + fputc('\n', out); + for (i = 0; i < 8; ++i) { + fprintf(out, "0000000000000000000000000000000000000000000000000000000000000000\n"); + } + fprintf(out, "cleartomark\n"); + + // clean up + if (dict.charset > 2) + gfree(glyphNames); + gfree(fontName); +} + +void Type1CFontConverter::eexecWrite(char *s) { + Guchar *p; + Guchar x; + + for (p = (Guchar *)s; *p; ++p) { + x = *p ^ (r1 >> 8); + r1 = (x + r1) * 52845 + 22719; + fputc(hexChars[x >> 4], out); + fputc(hexChars[x & 0x0f], out); + line += 2; + if (line == 64) { + fputc('\n', out); + line = 0; + } + } +} + +void Type1CFontConverter::cvtGlyph(char *name, Guchar *s, int n) { + int nHints; + int x; + GBool first = gTrue; + char eBuf[256]; + double d, dx, dy; + GBool dFP; + int i, k; + + charBuf = new GString(); + charBuf->append((char)73); + charBuf->append((char)58); + charBuf->append((char)147); + charBuf->append((char)134); + + i = 0; + nOps = 0; + nHints = 0; + while (i < n) { + if (s[i] == 12) { + switch (s[i+1]) { + case 0: // dotsection (should be Type 1 only?) + //~ ignored + break; + case 34: // hflex + if (nOps != 7) { + error(-1, "Wrong number of args (%d) to Type 2 hflex", nOps); + } + eexecDumpNum(op[0], fp[0]); + eexecDumpNum(0, gFalse); + eexecDumpNum(op[1], fp[1]); + eexecDumpNum(op[2], fp[2]); + eexecDumpNum(op[3], fp[3]); + eexecDumpNum(0, gFalse); + eexecDumpOp1(8); + eexecDumpNum(op[4], fp[4]); + eexecDumpNum(0, gFalse); + eexecDumpNum(op[5], fp[5]); + eexecDumpNum(-op[2], fp[2]); + eexecDumpNum(op[6], fp[6]); + eexecDumpNum(0, gFalse); + eexecDumpOp1(8); + break; + case 35: // flex + if (nOps != 13) { + error(-1, "Wrong number of args (%d) to Type 2 flex", nOps); + } + eexecDumpNum(op[0], fp[0]); + eexecDumpNum(op[1], fp[1]); + eexecDumpNum(op[2], fp[2]); + eexecDumpNum(op[3], fp[3]); + eexecDumpNum(op[4], fp[4]); + eexecDumpNum(op[5], fp[5]); + eexecDumpOp1(8); + eexecDumpNum(op[6], fp[6]); + eexecDumpNum(op[7], fp[7]); + eexecDumpNum(op[8], fp[8]); + eexecDumpNum(op[9], fp[9]); + eexecDumpNum(op[10], fp[10]); + eexecDumpNum(op[11], fp[11]); + eexecDumpOp1(8); + break; + case 36: // hflex1 + if (nOps != 9) { + error(-1, "Wrong number of args (%d) to Type 2 hflex1", nOps); + } + eexecDumpNum(op[0], fp[0]); + eexecDumpNum(op[1], fp[1]); + eexecDumpNum(op[2], fp[2]); + eexecDumpNum(op[3], fp[3]); + eexecDumpNum(op[4], fp[4]); + eexecDumpNum(0, gFalse); + eexecDumpOp1(8); + eexecDumpNum(op[5], fp[5]); + eexecDumpNum(0, gFalse); + eexecDumpNum(op[6], fp[6]); + eexecDumpNum(op[7], fp[7]); + eexecDumpNum(op[8], fp[8]); + eexecDumpNum(-(op[1] + op[3] + op[7]), fp[1] | fp[3] | fp[7]); + eexecDumpOp1(8); + break; + case 37: // flex1 + if (nOps != 11) { + error(-1, "Wrong number of args (%d) to Type 2 flex1", nOps); + } + eexecDumpNum(op[0], fp[0]); + eexecDumpNum(op[1], fp[1]); + eexecDumpNum(op[2], fp[2]); + eexecDumpNum(op[3], fp[3]); + eexecDumpNum(op[4], fp[4]); + eexecDumpNum(op[5], fp[5]); + eexecDumpOp1(8); + eexecDumpNum(op[6], fp[6]); + eexecDumpNum(op[7], fp[7]); + eexecDumpNum(op[8], fp[8]); + eexecDumpNum(op[9], fp[9]); + dx = op[0] + op[2] + op[4] + op[6] + op[8]; + dy = op[1] + op[3] + op[5] + op[7] + op[9]; + if (fabs(dx) > fabs(dy)) { + eexecDumpNum(op[10], fp[10]); + eexecDumpNum(-dy, fp[1] | fp[3] | fp[5] | fp[7] | fp[9]); + } else { + eexecDumpNum(-dx, fp[0] | fp[2] | fp[4] | fp[6] | fp[8]); + eexecDumpNum(op[10], fp[10]); + } + eexecDumpOp1(8); + break; + case 3: // and + case 4: // or + case 5: // not + case 8: // store + case 9: // abs + case 10: // add + case 11: // sub + case 12: // div + case 13: // load + case 14: // neg + case 15: // eq + case 18: // drop + case 20: // put + case 21: // get + case 22: // ifelse + case 23: // random + case 24: // mul + case 26: // sqrt + case 27: // dup + case 28: // exch + case 29: // index + case 30: // roll + error(-1, "Unimplemented Type 2 charstring op: 12.%d", s[i+1]); + break; + default: + error(-1, "Illegal Type 2 charstring op: 12.%d", s[i+1]); + break; + } + i += 2; + nOps = 0; + } else if (s[i] == 19) { // hintmask + //~ ignored + if (first) { + cvtGlyphWidth(nOps == 1); + first = gFalse; + } + if (nOps > 0) { + if (nOps & 1) { + error(-1, "Wrong number of args (%d) to Type 2 hintmask/vstemhm", + nOps); + } + nHints += nOps / 2; + } + i += 1 + ((nHints + 7) >> 3); + nOps = 0; + } else if (s[i] == 20) { // cntrmask + //~ ignored + if (first) { + cvtGlyphWidth(nOps == 1); + first = gFalse; + } + if (nOps > 0) { + if (nOps & 1) { + error(-1, "Wrong number of args (%d) to Type 2 cntrmask/vstemhm", + nOps); + } + nHints += nOps / 2; + } + i += 1 + ((nHints + 7) >> 3); + nOps = 0; + } else if (s[i] == 28) { + x = (s[i+1] << 8) + s[i+2]; + if (x & 0x8000) + x |= -1 << 15; + if (nOps < 48) { + fp[nOps] = gFalse; + op[nOps++] = x; + } + i += 3; + } else if (s[i] <= 31) { + switch (s[i]) { + case 4: // vmoveto + if (first) { + cvtGlyphWidth(nOps == 2); + first = gFalse; + } + if (nOps != 1) + error(-1, "Wrong number of args (%d) to Type 2 vmoveto", nOps); + eexecDumpNum(op[0], fp[0]); + eexecDumpOp1(4); + break; + case 5: // rlineto + if (nOps < 2 || nOps % 2 != 0) + error(-1, "Wrong number of args (%d) to Type 2 rlineto", nOps); + for (k = 0; k < nOps; k += 2) { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpOp1(5); + } + break; + case 6: // hlineto + if (nOps < 1) + error(-1, "Wrong number of args (%d) to Type 2 hlineto", nOps); + for (k = 0; k < nOps; ++k) { + eexecDumpNum(op[k], fp[k]); + eexecDumpOp1((k & 1) ? 7 : 6); + } + break; + case 7: // vlineto + if (nOps < 1) + error(-1, "Wrong number of args (%d) to Type 2 vlineto", nOps); + for (k = 0; k < nOps; ++k) { + eexecDumpNum(op[k], fp[k]); + eexecDumpOp1((k & 1) ? 6 : 7); + } + break; + case 8: // rrcurveto + if (nOps < 6 || nOps % 6 != 0) + error(-1, "Wrong number of args (%d) to Type 2 rrcurveto", nOps); + for (k = 0; k < nOps; k += 6) { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpNum(op[k+4], fp[k+4]); + eexecDumpNum(op[k+5], fp[k+5]); + eexecDumpOp1(8); + } + break; + case 14: // endchar / seac + if (first) { + cvtGlyphWidth(nOps == 1 || nOps == 5); + first = gFalse; + } + if (nOps == 4) { + eexecDumpNum(0, 0); + eexecDumpNum(op[0], fp[0]); + eexecDumpNum(op[1], fp[1]); + eexecDumpNum(op[2], fp[2]); + eexecDumpNum(op[3], fp[3]); + eexecDumpOp2(6); + } else if (nOps == 0) { + eexecDumpOp1(14); + } else { + error(-1, "Wrong number of args (%d) to Type 2 endchar", nOps); + } + break; + case 21: // rmoveto + if (first) { + cvtGlyphWidth(nOps == 3); + first = gFalse; + } + if (nOps != 2) + error(-1, "Wrong number of args (%d) to Type 2 rmoveto", nOps); + eexecDumpNum(op[0], fp[0]); + eexecDumpNum(op[1], fp[1]); + eexecDumpOp1(21); + break; + case 22: // hmoveto + if (first) { + cvtGlyphWidth(nOps == 2); + first = gFalse; + } + if (nOps != 1) + error(-1, "Wrong number of args (%d) to Type 2 hmoveto", nOps); + eexecDumpNum(op[0], fp[0]); + eexecDumpOp1(22); + break; + case 24: // rcurveline + if (nOps < 8 || (nOps - 2) % 6 != 0) + error(-1, "Wrong number of args (%d) to Type 2 rcurveline", nOps); + for (k = 0; k < nOps - 2; k += 6) { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpNum(op[k+4], fp[k+4]); + eexecDumpNum(op[k+5], fp[k+5]); + eexecDumpOp1(8); + } + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k]); + eexecDumpOp1(5); + break; + case 25: // rlinecurve + if (nOps < 8 || (nOps - 6) % 2 != 0) + error(-1, "Wrong number of args (%d) to Type 2 rlinecurve", nOps); + for (k = 0; k < nOps - 6; k += 2) { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k]); + eexecDumpOp1(5); + } + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpNum(op[k+4], fp[k+4]); + eexecDumpNum(op[k+5], fp[k+5]); + eexecDumpOp1(8); + break; + case 26: // vvcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) + error(-1, "Wrong number of args (%d) to Type 2 vvcurveto", nOps); + if (nOps % 2 == 1) { + eexecDumpNum(op[0], fp[0]); + eexecDumpNum(op[1], fp[1]); + eexecDumpNum(op[2], fp[2]); + eexecDumpNum(op[3], fp[3]); + eexecDumpNum(0, gFalse); + eexecDumpNum(op[4], fp[4]); + eexecDumpOp1(8); + k = 5; + } else { + k = 0; + } + for (; k < nOps; k += 4) { + eexecDumpNum(0, gFalse); + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(0, gFalse); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpOp1(8); + } + break; + case 27: // hhcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) + error(-1, "Wrong number of args (%d) to Type 2 hhcurveto", nOps); + if (nOps % 2 == 1) { + eexecDumpNum(op[1], fp[1]); + eexecDumpNum(op[0], fp[0]); + eexecDumpNum(op[2], fp[2]); + eexecDumpNum(op[3], fp[3]); + eexecDumpNum(op[4], fp[4]); + eexecDumpNum(0, gFalse); + eexecDumpOp1(8); + k = 5; + } else { + k = 0; + } + for (; k < nOps; k += 4) { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(0, gFalse); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpNum(0, gFalse); + eexecDumpOp1(8); + } + break; + case 30: // vhcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) + error(-1, "Wrong number of args (%d) to Type 2 vhcurveto", nOps); + for (k = 0; k < nOps && k != nOps-5; k += 4) { + if (k % 8 == 0) { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpOp1(30); + } else { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpOp1(31); + } + } + if (k == nOps-5) { + if (k % 8 == 0) { + eexecDumpNum(0, gFalse); + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpNum(op[k+4], fp[k+4]); + } else { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(0, gFalse); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+4], fp[k+4]); + eexecDumpNum(op[k+3], fp[k+3]); + } + eexecDumpOp1(8); + } + break; + case 31: // hvcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) + error(-1, "Wrong number of args (%d) to Type 2 hvcurveto", nOps); + for (k = 0; k < nOps && k != nOps-5; k += 4) { + if (k % 8 == 0) { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpOp1(31); + } else { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpOp1(30); + } + } + if (k == nOps-5) { + if (k % 8 == 0) { + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(0, gFalse); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+4], fp[k+4]); + eexecDumpNum(op[k+3], fp[k+3]); + } else { + eexecDumpNum(0, gFalse); + eexecDumpNum(op[k], fp[k]); + eexecDumpNum(op[k+1], fp[k+1]); + eexecDumpNum(op[k+2], fp[k+2]); + eexecDumpNum(op[k+3], fp[k+3]); + eexecDumpNum(op[k+4], fp[k+4]); + } + eexecDumpOp1(8); + } + break; + case 1: // hstem + if (first) { + cvtGlyphWidth(nOps & 1); + first = gFalse; + } + if (nOps & 1) { + error(-1, "Wrong number of args (%d) to Type 2 hstem", nOps); + } + d = 0; + dFP = gFalse; + for (k = 0; k < nOps; k += 2) { + if (op[k+1] < 0) { + d += op[k] + op[k+1]; + dFP |= fp[k] | fp[k+1]; + eexecDumpNum(d, dFP); + eexecDumpNum(-op[k+1], fp[k+1]); + } else { + d += op[k]; + dFP |= fp[k]; + eexecDumpNum(d, dFP); + eexecDumpNum(op[k+1], fp[k+1]); + d += op[k+1]; + dFP |= fp[k+1]; + } + eexecDumpOp1(1); + } + nHints += nOps / 2; + break; + case 3: // vstem + if (first) { + cvtGlyphWidth(nOps & 1); + first = gFalse; + } + if (nOps & 1) { + error(-1, "Wrong number of args (%d) to Type 2 vstem", nOps); + } + d = 0; + dFP = gFalse; + for (k = 0; k < nOps; k += 2) { + if (op[k+1] < 0) { + d += op[k] + op[k+1]; + dFP |= fp[k] | fp[k+1]; + eexecDumpNum(d, dFP); + eexecDumpNum(-op[k+1], fp[k+1]); + } else { + d += op[k]; + dFP |= fp[k]; + eexecDumpNum(d, dFP); + eexecDumpNum(op[k+1], fp[k+1]); + d += op[k+1]; + dFP |= fp[k+1]; + } + eexecDumpOp1(3); + } + nHints += nOps / 2; + break; + case 18: // hstemhm + //~ ignored + if (first) { + cvtGlyphWidth(nOps & 1); + first = gFalse; + } + if (nOps & 1) { + error(-1, "Wrong number of args (%d) to Type 2 hstemhm", nOps); + } + nHints += nOps / 2; + break; + case 23: // vstemhm + //~ ignored + if (first) { + cvtGlyphWidth(nOps & 1); + first = gFalse; + } + if (nOps & 1) { + error(-1, "Wrong number of args (%d) to Type 2 vstemhm", nOps); + } + nHints += nOps / 2; + break; + case 10: // callsubr + case 11: // return + case 16: // blend + case 29: // callgsubr + error(-1, "Unimplemented Type 2 charstring op: %d", s[i]); + break; + default: + error(-1, "Illegal Type 2 charstring op: %d", s[i]); + break; + } + ++i; + nOps = 0; + } else if (s[i] <= 246) { + if (nOps < 48) { + fp[nOps] = gFalse; + op[nOps++] = (int)s[i] - 139; + } + ++i; + } else if (s[i] <= 250) { + if (nOps < 48) { + fp[nOps] = gFalse; + op[nOps++] = (((int)s[i] - 247) << 8) + (int)s[i+1] + 108; + } + i += 2; + } else if (s[i] <= 254) { + if (nOps < 48) { + fp[nOps] = gFalse; + op[nOps++] = -(((int)s[i] - 251) << 8) - (int)s[i+1] - 108; + } + i += 2; + } else { + x = (s[i+1] << 24) | (s[i+2] << 16) | (s[i+3] << 8) | s[i+4]; + if (x & 0x80000000) + x |= -1 << 31; + if (nOps < 48) { + fp[nOps] = gTrue; + op[nOps++] = (double)x / 65536.0; + } + i += 5; + } + } + + sprintf(eBuf, "/%s %d RD ", name, charBuf->getLength()); + eexecWrite(eBuf); + eexecWriteCharstring((Guchar *)charBuf->getCString(), charBuf->getLength()); + eexecWrite(" ND\n"); + delete charBuf; +} + +void Type1CFontConverter::cvtGlyphWidth(GBool useOp) { + double w; + GBool wFP; + int i; + + if (useOp) { + w = nominalWidthX + op[0]; + wFP = nominalWidthXFP | fp[0]; + for (i = 1; i < nOps; ++i) { + op[i-1] = op[i]; + fp[i-1] = fp[i]; + } + --nOps; + } else { + w = defaultWidthX; + wFP = defaultWidthXFP; + } + eexecDumpNum(0, gFalse); + eexecDumpNum(w, wFP); + eexecDumpOp1(13); +} + +void Type1CFontConverter::eexecDumpNum(double x, GBool fp) { + Guchar buf[12]; + int y, n; + + n = 0; + if (fp) { + if (x >= -32768 && x < 32768) { + y = (int)(x * 256.0); + buf[0] = 255; + buf[1] = (Guchar)(y >> 24); + buf[2] = (Guchar)(y >> 16); + buf[3] = (Guchar)(y >> 8); + buf[4] = (Guchar)y; + buf[5] = 255; + buf[6] = 0; + buf[7] = 0; + buf[8] = 1; + buf[9] = 0; + buf[10] = 12; + buf[11] = 12; + n = 12; + } else { + error(-1, "Type 2 fixed point constant out of range"); + } + } else { + y = (int)x; + if (y >= -107 && y <= 107) { + buf[0] = (Guchar)(y + 139); + n = 1; + } else if (y > 107 && y <= 1131) { + y -= 108; + buf[0] = (Guchar)((y >> 8) + 247); + buf[1] = (Guchar)(y & 0xff); + n = 2; + } else if (y < -107 && y >= -1131) { + y = -y - 108; + buf[0] = (Guchar)((y >> 8) + 251); + buf[1] = (Guchar)(y & 0xff); + n = 2; + } else { + buf[0] = 255; + buf[1] = (Guchar)(y >> 24); + buf[2] = (Guchar)(y >> 16); + buf[3] = (Guchar)(y >> 8); + buf[4] = (Guchar)y; + n = 5; + } + } + charBuf->append((char *)buf, n); +} + +void Type1CFontConverter::eexecDumpOp1(int op) { + charBuf->append((char)op); +} + +void Type1CFontConverter::eexecDumpOp2(int op) { + charBuf->append((char)12); + charBuf->append((char)op); +} + +void Type1CFontConverter::eexecWriteCharstring(Guchar *s, int n) { + Gushort r2; + Guchar x; + int i; + + r2 = 4330; + + for (i = 0; i < n; ++i) { + // charstring encryption + x = s[i]; + x ^= (r2 >> 8); + r2 = (x + r2) * 52845 + 22719; + + // eexec encryption + x ^= (r1 >> 8); + r1 = (x + r1) * 52845 + 22719; + fputc(hexChars[x >> 4], out); + fputc(hexChars[x & 0x0f], out); + line += 2; + if (line == 64) { + fputc('\n', out); + line = 0; + } + } +} + +void Type1CFontConverter::getDeltaInt(char *buf, char *name, double *op, + int n) { + int x, i; + + sprintf(buf, "/%s [", name); + buf += strlen(buf); + x = 0; + for (i = 0; i < n; ++i) { + x += (int)op[i]; + sprintf(buf, "%s%d", i > 0 ? " " : "", x); + buf += strlen(buf); + } + sprintf(buf, "] def\n"); +} + +void Type1CFontConverter::getDeltaReal(char *buf, char *name, double *op, + int n) { + double x; + int i; + + sprintf(buf, "/%s [", name); + buf += strlen(buf); + x = 0; + for (i = 0; i < n; ++i) { + x += op[i]; + sprintf(buf, "%s%g", i > 0 ? " " : "", x); + buf += strlen(buf); + } + sprintf(buf, "] def\n"); +} diff --git a/pdf2swf/xpdf/FontFile.h b/pdf2swf/xpdf/FontFile.h new file mode 100644 index 00000000..ec625ef2 --- /dev/null +++ b/pdf2swf/xpdf/FontFile.h @@ -0,0 +1,117 @@ +//======================================================================== +// +// FontFile.h +// +// Copyright 1999 Derek B. Noonburg +// +//======================================================================== + +#ifndef FONTFILE_H +#define FONTFILE_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include +#include "gtypes.h" +#include "GString.h" +#include "FontEncoding.h" + +//------------------------------------------------------------------------ +// FontFile +//------------------------------------------------------------------------ + +class FontFile { +public: + + FontFile(); + virtual ~FontFile(); + + // Returns the font name, as specified internally by the font file. + // Returns NULL if no name is available. + virtual char *getName() = 0; + + // Returns the custom font encoding, or NULL if the encoding is + // not available. If is set, the caller of this function + // will be responsible for freeing the encoding object. + virtual FontEncoding *getEncoding(GBool taken) = 0; +}; + +//------------------------------------------------------------------------ +// Type1FontFile +//------------------------------------------------------------------------ + +class Type1FontFile: public FontFile { +public: + + Type1FontFile(char *file, int len); + virtual ~Type1FontFile(); + virtual char *getName() { return name; } + virtual FontEncoding *getEncoding(GBool taken); + +private: + + char *name; + FontEncoding *encoding; + GBool freeEnc; +}; + +//------------------------------------------------------------------------ +// Type1CFontFile +//------------------------------------------------------------------------ + +class Type1CFontFile: public FontFile { +public: + + Type1CFontFile(char *file, int len); + virtual ~Type1CFontFile(); + virtual char *getName() { return name; } + virtual FontEncoding *getEncoding(GBool taken); + +private: + + char *name; + FontEncoding *encoding; + GBool freeEnc; +}; + +//------------------------------------------------------------------------ +// Type1CFontConverter +//------------------------------------------------------------------------ + +class Type1CFontConverter { +public: + + Type1CFontConverter(char *file, int len, FILE *out); + ~Type1CFontConverter(); + void convert(); + +private: + + void eexecWrite(char *s); + void cvtGlyph(char *name, Guchar *s, int n); + void cvtGlyphWidth(GBool useOp); + void eexecDumpNum(double x, GBool fp); + void eexecDumpOp1(int op); + void eexecDumpOp2(int op); + void eexecWriteCharstring(Guchar *s, int n); + void getDeltaInt(char *buf, char *name, double *op, int n); + void getDeltaReal(char *buf, char *name, double *op, int n); + + char *file; + int len; + FILE *out; + double op[48]; // operands + GBool fp[48]; // true if operand is fixed point + int nOps; // number of operands + double defaultWidthX; // default glyph width + double nominalWidthX; // nominal glyph width + GBool defaultWidthXFP; // true if defaultWidthX is fixed point + GBool nominalWidthXFP; // true if nominalWidthX is fixed point + Gushort r1; // eexec encryption key + GString *charBuf; // charstring output buffer + int line; // number of eexec chars on current line +}; + +#endif diff --git a/pdf2swf/xpdf/FontInfo.h b/pdf2swf/xpdf/FontInfo.h new file mode 100644 index 00000000..ee85b95b --- /dev/null +++ b/pdf2swf/xpdf/FontInfo.h @@ -0,0 +1,2068 @@ +//======================================================================== +// +// FontInfo.h +// +// This file was automatically generated by makeFontInfo. +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef FONTINFO_H +#define FONTINFO_H + +//------------------------------------------------------------------------ +// Character encodings. +//------------------------------------------------------------------------ + +#define standardEncodingSize 335 +static char *standardEncodingNames[standardEncodingSize] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "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", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + NULL, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + NULL, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + NULL, + "questiondown", + NULL, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + NULL, + "ring", + "cedilla", + NULL, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "AE", + NULL, + "ordfeminine", + NULL, + NULL, + NULL, + NULL, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + NULL, + NULL, + NULL, + NULL, + NULL, + "ae", + NULL, + NULL, + NULL, + "dotlessi", + NULL, + NULL, + "lslash", + "oslash", + "oe", + "germandbls", + NULL, + NULL, + NULL, + NULL, + "Aacute", + "Acircumflex", + "Adieresis", + "Agrave", + "Aring", + "Atilde", + "Ccedilla", + "Eacute", + "Ecircumflex", + "Edieresis", + "Egrave", + "Eth", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Ntilde", + "Oacute", + "Ocircumflex", + "Odieresis", + "Ograve", + "Otilde", + "Scaron", + "Thorn", + "Uacute", + "Ucircumflex", + "Udieresis", + "Ugrave", + "Yacute", + "Ydieresis", + "Zcaron", + "aacute", + "acircumflex", + "adieresis", + "agrave", + "aring", + "atilde", + "brokenbar", + "ccedilla", + "copyright", + "degree", + "divide", + "eacute", + "ecircumflex", + "edieresis", + "egrave", + "eth", + "iacute", + "icircumflex", + "idieresis", + "igrave", + "logicalnot", + "minus", + "mu", + "multiply", + "ntilde", + "oacute", + "ocircumflex", + "odieresis", + "ograve", + "onehalf", + "onequarter", + "onesuperior", + "otilde", + "plusminus", + "registered", + "scaron", + "thorn", + "threequarters", + "threesuperior", + "trademark", + "twosuperior", + "uacute", + "ucircumflex", + "udieresis", + "ugrave", + "yacute", + "ydieresis", + "zcaron" +}; +static FontEncoding standardEncoding(standardEncodingNames, + standardEncodingSize); + +#define symbolEncodingSize 257 +static char *symbolEncodingNames[symbolEncodingSize] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "universal", + "numbersign", + "existential", + "percent", + "ampersand", + "suchthat", + "parenleft", + "parenright", + "asteriskmath", + "plus", + "comma", + "minus", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "congruent", + "Alpha", + "Beta", + "Chi", + "Delta", + "Epsilon", + "Phi", + "Gamma", + "Eta", + "Iota", + "theta1", + "Kappa", + "Lambda", + "Mu", + "Nu", + "Omicron", + "Pi", + "Theta", + "Rho", + "Sigma", + "Tau", + "Upsilon", + "sigma1", + "Omega", + "Xi", + "Psi", + "Zeta", + "bracketleft", + "therefore", + "bracketright", + "perpendicular", + "underscore", + "radicalex", + "alpha", + "beta", + "chi", + "delta", + "epsilon", + "phi", + "gamma", + "eta", + "iota", + "phi1", + "kappa", + "lambda", + "mu", + "nu", + "omicron", + "pi", + "theta", + "rho", + "sigma", + "tau", + "upsilon", + "omega1", + "omega", + "xi", + "psi", + "zeta", + "braceleft", + "bar", + "braceright", + "similar", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Upsilon1", + "minute", + "lessequal", + "fraction", + "infinity", + "florin", + "club", + "diamond", + "heart", + "spade", + "arrowboth", + "arrowleft", + "arrowup", + "arrowright", + "arrowdown", + "degree", + "plusminus", + "second", + "greaterequal", + "multiply", + "proportional", + "partialdiff", + "bullet", + "divide", + "notequal", + "equivalence", + "approxequal", + "ellipsis", + "arrowvertex", + "arrowhorizex", + "carriagereturn", + "aleph", + "Ifraktur", + "Rfraktur", + "weierstrass", + "circlemultiply", + "circleplus", + "emptyset", + "intersection", + "union", + "propersuperset", + "reflexsuperset", + "notsubset", + "propersubset", + "reflexsubset", + "element", + "notelement", + "angle", + "gradient", + "registerserif", + "copyrightserif", + "trademarkserif", + "product", + "radical", + "dotmath", + "logicalnot", + "logicaland", + "logicalor", + "arrowdblboth", + "arrowdblleft", + "arrowdblup", + "arrowdblright", + "arrowdbldown", + "lozenge", + "angleleft", + "registersans", + "copyrightsans", + "trademarksans", + "summation", + "parenlefttp", + "parenleftex", + "parenleftbt", + "bracketlefttp", + "bracketleftex", + "bracketleftbt", + "bracelefttp", + "braceleftmid", + "braceleftbt", + "braceex", + NULL, + "angleright", + "integral", + "integraltp", + "integralex", + "integralbt", + "parenrighttp", + "parenrightex", + "parenrightbt", + "bracketrighttp", + "bracketrightex", + "bracketrightbt", + "bracerighttp", + "bracerightmid", + "bracerightbt", + NULL, + "apple" +}; +static FontEncoding symbolEncoding(symbolEncodingNames, + symbolEncodingSize); + +#define zapfDingbatsEncodingSize 270 +static char *zapfDingbatsEncodingNames[zapfDingbatsEncodingSize] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "a1", + "a2", + "a202", + "a3", + "a4", + "a5", + "a119", + "a118", + "a117", + "a11", + "a12", + "a13", + "a14", + "a15", + "a16", + "a105", + "a17", + "a18", + "a19", + "a20", + "a21", + "a22", + "a23", + "a24", + "a25", + "a26", + "a27", + "a28", + "a6", + "a7", + "a8", + "a9", + "a10", + "a29", + "a30", + "a31", + "a32", + "a33", + "a34", + "a35", + "a36", + "a37", + "a38", + "a39", + "a40", + "a41", + "a42", + "a43", + "a44", + "a45", + "a46", + "a47", + "a48", + "a49", + "a50", + "a51", + "a52", + "a53", + "a54", + "a55", + "a56", + "a57", + "a58", + "a59", + "a60", + "a61", + "a62", + "a63", + "a64", + "a65", + "a66", + "a67", + "a68", + "a69", + "a70", + "a71", + "a72", + "a73", + "a74", + "a203", + "a75", + "a204", + "a76", + "a77", + "a78", + "a79", + "a81", + "a82", + "a83", + "a84", + "a97", + "a98", + "a99", + "a100", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "a101", + "a102", + "a103", + "a104", + "a106", + "a107", + "a108", + "a112", + "a111", + "a110", + "a109", + "a120", + "a121", + "a122", + "a123", + "a124", + "a125", + "a126", + "a127", + "a128", + "a129", + "a130", + "a131", + "a132", + "a133", + "a134", + "a135", + "a136", + "a137", + "a138", + "a139", + "a140", + "a141", + "a142", + "a143", + "a144", + "a145", + "a146", + "a147", + "a148", + "a149", + "a150", + "a151", + "a152", + "a153", + "a154", + "a155", + "a156", + "a157", + "a158", + "a159", + "a160", + "a161", + "a163", + "a164", + "a196", + "a165", + "a192", + "a166", + "a167", + "a168", + "a169", + "a170", + "a171", + "a172", + "a173", + "a162", + "a174", + "a175", + "a176", + "a177", + "a178", + "a179", + "a193", + "a180", + "a199", + "a181", + "a200", + "a182", + NULL, + "a201", + "a183", + "a184", + "a197", + "a185", + "a194", + "a198", + "a186", + "a195", + "a187", + "a188", + "a189", + "a190", + "a191", + NULL, + "a205", + "a206", + "a85", + "a86", + "a87", + "a88", + "a89", + "a90", + "a91", + "a92", + "a93", + "a94", + "a95", + "a96" +}; +static FontEncoding zapfDingbatsEncoding(zapfDingbatsEncodingNames, + zapfDingbatsEncodingSize); + +#define macRomanEncodingSize 256 +static char *macRomanEncodingNames[macRomanEncodingSize] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "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", + NULL, + "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", + NULL, + "AE", + "Oslash", + NULL, + "plusminus", + NULL, + NULL, + "yen", + "mu", + NULL, + NULL, + NULL, + NULL, + NULL, + "ordfeminine", + "ordmasculine", + NULL, + "ae", + "oslash", + "questiondown", + "exclamdown", + "logicalnot", + NULL, + "florin", + NULL, + NULL, + "guillemotleft", + "guillemotright", + "ellipsis", + "space", + "Agrave", + "Atilde", + "Otilde", + "OE", + "oe", + "endash", + "emdash", + "quotedblleft", + "quotedblright", + "quoteleft", + "quoteright", + "divide", + NULL, + "ydieresis", + "Ydieresis", + "fraction", + "currency", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "daggerdbl", + "periodcentered", + "quotesinglbase", + "quotedblbase", + "perthousand", + "Acircumflex", + "Ecircumflex", + "Aacute", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Oacute", + "Ocircumflex", + NULL, + "Ograve", + "Uacute", + "Ucircumflex", + "Ugrave", + "dotlessi", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron" +}; +static FontEncoding macRomanEncoding(macRomanEncodingNames, + macRomanEncodingSize); + +#define winAnsiEncodingSize 256 +static char *winAnsiEncodingNames[winAnsiEncodingSize] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "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", + "bullet", + "bullet", + "quotesinglbase", + "florin", + "quotedblbase", + "ellipsis", + "dagger", + "daggerdbl", + "circumflex", + "perthousand", + "Scaron", + "guilsinglleft", + "OE", + "bullet", + "bullet", + "bullet", + "bullet", + "quoteleft", + "quoteright", + "quotedblleft", + "quotedblright", + "bullet", + "endash", + "emdash", + "tilde", + "trademark", + "scaron", + "guilsinglright", + "oe", + "bullet", + "bullet", + "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 FontEncoding winAnsiEncoding(winAnsiEncodingNames, + winAnsiEncodingSize); + +//------------------------------------------------------------------------ +// Character widths for built-in fonts. +//------------------------------------------------------------------------ + +static Gushort courierWidths[335] = { + 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, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 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, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 0, 600, 600, 600, 600, 0, 600, 600, + 600, 600, 600, 600, 600, 600, 0, 600, + 0, 600, 600, 600, 600, 600, 600, 600, + 600, 0, 600, 600, 0, 600, 600, 600, + 600, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 600, 0, 600, 0, 0, 0, 0, + 600, 600, 600, 600, 0, 0, 0, 0, + 0, 600, 0, 0, 0, 600, 0, 0, + 600, 600, 600, 600, 0, 0, 0, 0, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600 +}; + +static Gushort courierBoldWidths[335] = { + 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, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 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, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 0, 600, 600, 600, 600, 0, 600, 600, + 600, 600, 600, 600, 600, 600, 0, 600, + 0, 600, 600, 600, 600, 600, 600, 600, + 600, 0, 600, 600, 0, 600, 600, 600, + 600, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 600, 0, 600, 0, 0, 0, 0, + 600, 600, 600, 600, 0, 0, 0, 0, + 0, 600, 0, 0, 0, 600, 0, 0, + 600, 600, 600, 600, 0, 0, 0, 0, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600 +}; + +static Gushort courierBoldObliqueWidths[335] = { + 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, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 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, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 0, 600, 600, 600, 600, 0, 600, 600, + 600, 600, 600, 600, 600, 600, 0, 600, + 0, 600, 600, 600, 600, 600, 600, 600, + 600, 0, 600, 600, 0, 600, 600, 600, + 600, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 600, 0, 600, 0, 0, 0, 0, + 600, 600, 600, 600, 0, 0, 0, 0, + 0, 600, 0, 0, 0, 600, 0, 0, + 600, 600, 600, 600, 0, 0, 0, 0, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600 +}; + +static Gushort courierObliqueWidths[335] = { + 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, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 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, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 0, 600, 600, 600, 600, 0, 600, 600, + 600, 600, 600, 600, 600, 600, 0, 600, + 0, 600, 600, 600, 600, 600, 600, 600, + 600, 0, 600, 600, 0, 600, 600, 600, + 600, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 600, 0, 600, 0, 0, 0, 0, + 600, 600, 600, 600, 0, 0, 0, 0, + 0, 600, 0, 0, 0, 600, 0, 0, + 600, 600, 600, 600, 0, 0, 0, 0, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600 +}; + +static Gushort helveticaWidths[335] = { + 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, + 278, 278, 355, 556, 556, 889, 667, 222, + 333, 333, 389, 584, 278, 333, 278, 278, + 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 278, 278, 584, 584, 584, 556, + 1015, 667, 667, 722, 722, 667, 611, 778, + 722, 278, 500, 667, 556, 833, 722, 778, + 667, 778, 722, 667, 611, 722, 667, 944, + 667, 667, 611, 278, 278, 278, 469, 556, + 222, 556, 556, 500, 556, 556, 278, 556, + 556, 222, 222, 500, 222, 833, 556, 556, + 556, 556, 333, 500, 278, 556, 500, 722, + 500, 500, 500, 334, 260, 334, 584, 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, 333, 556, 556, 167, 556, 556, 556, + 556, 191, 333, 556, 333, 333, 500, 500, + 0, 556, 556, 556, 278, 0, 537, 350, + 222, 333, 333, 556, 1000, 1000, 0, 611, + 0, 333, 333, 333, 333, 333, 333, 333, + 333, 0, 333, 333, 0, 333, 333, 333, + 1000, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1000, 0, 370, 0, 0, 0, 0, + 556, 778, 1000, 365, 0, 0, 0, 0, + 0, 889, 0, 0, 0, 278, 0, 0, + 222, 611, 944, 611, 0, 0, 0, 0, + 667, 667, 667, 667, 667, 667, 722, 667, + 667, 667, 667, 722, 278, 278, 278, 278, + 722, 778, 778, 778, 778, 778, 667, 667, + 722, 722, 722, 722, 667, 667, 611, 556, + 556, 556, 556, 556, 556, 260, 500, 737, + 400, 584, 556, 556, 556, 556, 556, 278, + 278, 278, 278, 584, 584, 556, 584, 556, + 556, 556, 556, 556, 834, 834, 333, 556, + 584, 737, 500, 556, 834, 333, 1000, 333, + 556, 556, 556, 556, 500, 500, 500 +}; + +static Gushort helveticaBoldWidths[335] = { + 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, + 278, 333, 474, 556, 556, 889, 722, 278, + 333, 333, 389, 584, 278, 333, 278, 278, + 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 333, 333, 584, 584, 584, 611, + 975, 722, 722, 722, 722, 667, 611, 778, + 722, 278, 556, 722, 611, 833, 722, 778, + 667, 778, 722, 667, 611, 722, 667, 944, + 667, 667, 611, 333, 278, 333, 584, 556, + 278, 556, 611, 556, 611, 556, 333, 611, + 611, 278, 278, 556, 278, 889, 611, 611, + 611, 611, 389, 556, 333, 611, 556, 778, + 556, 556, 500, 389, 280, 389, 584, 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, 333, 556, 556, 167, 556, 556, 556, + 556, 238, 500, 556, 333, 333, 611, 611, + 0, 556, 556, 556, 278, 0, 556, 350, + 278, 500, 500, 556, 1000, 1000, 0, 611, + 0, 333, 333, 333, 333, 333, 333, 333, + 333, 0, 333, 333, 0, 333, 333, 333, + 1000, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1000, 0, 370, 0, 0, 0, 0, + 611, 778, 1000, 365, 0, 0, 0, 0, + 0, 889, 0, 0, 0, 278, 0, 0, + 278, 611, 944, 611, 0, 0, 0, 0, + 722, 722, 722, 722, 722, 722, 722, 667, + 667, 667, 667, 722, 278, 278, 278, 278, + 722, 778, 778, 778, 778, 778, 667, 667, + 722, 722, 722, 722, 667, 667, 611, 556, + 556, 556, 556, 556, 556, 280, 556, 737, + 400, 584, 556, 556, 556, 556, 611, 278, + 278, 278, 278, 584, 584, 611, 584, 611, + 611, 611, 611, 611, 834, 834, 333, 611, + 584, 737, 556, 611, 834, 333, 1000, 333, + 611, 611, 611, 611, 556, 556, 500 +}; + +static Gushort helveticaBoldObliqueWidths[335] = { + 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, + 278, 333, 474, 556, 556, 889, 722, 278, + 333, 333, 389, 584, 278, 333, 278, 278, + 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 333, 333, 584, 584, 584, 611, + 975, 722, 722, 722, 722, 667, 611, 778, + 722, 278, 556, 722, 611, 833, 722, 778, + 667, 778, 722, 667, 611, 722, 667, 944, + 667, 667, 611, 333, 278, 333, 584, 556, + 278, 556, 611, 556, 611, 556, 333, 611, + 611, 278, 278, 556, 278, 889, 611, 611, + 611, 611, 389, 556, 333, 611, 556, 778, + 556, 556, 500, 389, 280, 389, 584, 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, 333, 556, 556, 167, 556, 556, 556, + 556, 238, 500, 556, 333, 333, 611, 611, + 0, 556, 556, 556, 278, 0, 556, 350, + 278, 500, 500, 556, 1000, 1000, 0, 611, + 0, 333, 333, 333, 333, 333, 333, 333, + 333, 0, 333, 333, 0, 333, 333, 333, + 1000, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1000, 0, 370, 0, 0, 0, 0, + 611, 778, 1000, 365, 0, 0, 0, 0, + 0, 889, 0, 0, 0, 278, 0, 0, + 278, 611, 944, 611, 0, 0, 0, 0, + 722, 722, 722, 722, 722, 722, 722, 667, + 667, 667, 667, 722, 278, 278, 278, 278, + 722, 778, 778, 778, 778, 778, 667, 667, + 722, 722, 722, 722, 667, 667, 611, 556, + 556, 556, 556, 556, 556, 280, 556, 737, + 400, 584, 556, 556, 556, 556, 611, 278, + 278, 278, 278, 584, 584, 611, 584, 611, + 611, 611, 611, 611, 834, 834, 333, 611, + 584, 737, 556, 611, 834, 333, 1000, 333, + 611, 611, 611, 611, 556, 556, 500 +}; + +static Gushort helveticaObliqueWidths[335] = { + 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, + 278, 278, 355, 556, 556, 889, 667, 222, + 333, 333, 389, 584, 278, 333, 278, 278, + 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 278, 278, 584, 584, 584, 556, + 1015, 667, 667, 722, 722, 667, 611, 778, + 722, 278, 500, 667, 556, 833, 722, 778, + 667, 778, 722, 667, 611, 722, 667, 944, + 667, 667, 611, 278, 278, 278, 469, 556, + 222, 556, 556, 500, 556, 556, 278, 556, + 556, 222, 222, 500, 222, 833, 556, 556, + 556, 556, 333, 500, 278, 556, 500, 722, + 500, 500, 500, 334, 260, 334, 584, 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, 333, 556, 556, 167, 556, 556, 556, + 556, 191, 333, 556, 333, 333, 500, 500, + 0, 556, 556, 556, 278, 0, 537, 350, + 222, 333, 333, 556, 1000, 1000, 0, 611, + 0, 333, 333, 333, 333, 333, 333, 333, + 333, 0, 333, 333, 0, 333, 333, 333, + 1000, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1000, 0, 370, 0, 0, 0, 0, + 556, 778, 1000, 365, 0, 0, 0, 0, + 0, 889, 0, 0, 0, 278, 0, 0, + 222, 611, 944, 611, 0, 0, 0, 0, + 667, 667, 667, 667, 667, 667, 722, 667, + 667, 667, 667, 722, 278, 278, 278, 278, + 722, 778, 778, 778, 778, 778, 667, 667, + 722, 722, 722, 722, 667, 667, 611, 556, + 556, 556, 556, 556, 556, 260, 500, 737, + 400, 584, 556, 556, 556, 556, 556, 278, + 278, 278, 278, 584, 584, 556, 584, 556, + 556, 556, 556, 556, 834, 834, 333, 556, + 584, 737, 500, 556, 834, 333, 1000, 333, + 556, 556, 556, 556, 500, 500, 500 +}; + +static Gushort symbolWidths[257] = { + 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, + 250, 333, 713, 500, 549, 833, 778, 439, + 333, 333, 500, 549, 250, 549, 250, 278, + 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 278, 278, 549, 549, 549, 444, + 549, 722, 667, 722, 612, 611, 763, 603, + 722, 333, 631, 722, 686, 889, 722, 722, + 768, 741, 556, 592, 611, 690, 439, 768, + 645, 795, 611, 333, 863, 333, 658, 500, + 500, 631, 549, 549, 494, 439, 521, 411, + 603, 329, 603, 549, 549, 576, 521, 549, + 549, 521, 549, 603, 439, 576, 713, 686, + 493, 686, 494, 480, 200, 480, 549, 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, 620, 247, 549, 167, 713, 500, 753, + 753, 753, 753, 1042, 987, 603, 987, 603, + 400, 549, 411, 549, 549, 713, 494, 460, + 549, 549, 549, 549, 1000, 603, 1000, 658, + 823, 686, 795, 987, 768, 768, 823, 768, + 768, 713, 713, 713, 713, 713, 713, 713, + 768, 713, 790, 790, 890, 823, 549, 250, + 713, 603, 603, 1042, 987, 603, 987, 603, + 494, 329, 790, 790, 786, 713, 384, 384, + 384, 384, 384, 384, 494, 494, 494, 494, + 0, 329, 274, 686, 686, 686, 384, 384, + 384, 384, 384, 384, 494, 494, 494, 0, + 790 +}; + +static Gushort timesBoldWidths[335] = { + 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, + 250, 333, 555, 500, 500, 1000, 833, 333, + 333, 333, 500, 570, 250, 333, 250, 278, + 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 333, 333, 570, 570, 570, 500, + 930, 722, 667, 722, 722, 667, 611, 778, + 778, 389, 500, 778, 667, 944, 722, 778, + 611, 778, 722, 556, 667, 722, 722, 1000, + 722, 722, 667, 333, 278, 333, 581, 500, + 333, 500, 556, 444, 556, 444, 333, 500, + 556, 278, 333, 556, 278, 833, 556, 500, + 556, 556, 444, 389, 333, 556, 500, 722, + 500, 500, 444, 394, 220, 394, 520, 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, 333, 500, 500, 167, 500, 500, 500, + 500, 278, 500, 500, 333, 333, 556, 556, + 0, 500, 500, 500, 250, 0, 540, 350, + 333, 500, 500, 500, 1000, 1000, 0, 500, + 0, 333, 333, 333, 333, 333, 333, 333, + 333, 0, 333, 333, 0, 333, 333, 333, + 1000, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1000, 0, 300, 0, 0, 0, 0, + 667, 778, 1000, 330, 0, 0, 0, 0, + 0, 722, 0, 0, 0, 278, 0, 0, + 278, 500, 722, 556, 0, 0, 0, 0, + 722, 722, 722, 722, 722, 722, 722, 667, + 667, 667, 667, 722, 389, 389, 389, 389, + 722, 778, 778, 778, 778, 778, 556, 611, + 722, 722, 722, 722, 722, 722, 667, 500, + 500, 500, 500, 500, 500, 220, 444, 747, + 400, 570, 444, 444, 444, 444, 500, 278, + 278, 278, 278, 570, 570, 556, 570, 556, + 500, 500, 500, 500, 750, 750, 300, 500, + 570, 747, 389, 556, 750, 300, 1000, 300, + 556, 556, 556, 556, 500, 500, 444 +}; + +static Gushort timesBoldItalicWidths[335] = { + 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, + 250, 389, 555, 500, 500, 833, 778, 333, + 333, 333, 500, 570, 250, 333, 250, 278, + 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 333, 333, 570, 570, 570, 500, + 832, 667, 667, 667, 722, 667, 667, 722, + 778, 389, 500, 667, 611, 889, 722, 722, + 611, 722, 667, 556, 611, 722, 667, 889, + 667, 611, 611, 333, 278, 333, 570, 500, + 333, 500, 500, 444, 500, 444, 333, 500, + 556, 278, 278, 500, 278, 778, 556, 500, + 500, 500, 389, 389, 278, 556, 444, 667, + 500, 444, 389, 348, 220, 348, 570, 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, 389, 500, 500, 167, 500, 500, 500, + 500, 278, 500, 500, 333, 333, 556, 556, + 0, 500, 500, 500, 250, 0, 500, 350, + 333, 500, 500, 500, 1000, 1000, 0, 500, + 0, 333, 333, 333, 333, 333, 333, 333, + 333, 0, 333, 333, 0, 333, 333, 333, + 1000, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 944, 0, 266, 0, 0, 0, 0, + 611, 722, 944, 300, 0, 0, 0, 0, + 0, 722, 0, 0, 0, 278, 0, 0, + 278, 500, 722, 500, 0, 0, 0, 0, + 667, 667, 667, 667, 667, 667, 667, 667, + 667, 667, 667, 722, 389, 389, 389, 389, + 722, 722, 722, 722, 722, 722, 556, 611, + 722, 722, 722, 722, 611, 611, 611, 500, + 500, 500, 500, 500, 500, 220, 444, 747, + 400, 570, 444, 444, 444, 444, 500, 278, + 278, 278, 278, 606, 606, 576, 570, 556, + 500, 500, 500, 500, 750, 750, 300, 500, + 570, 747, 389, 500, 750, 300, 1000, 300, + 556, 556, 556, 556, 444, 444, 389 +}; + +static Gushort timesItalicWidths[335] = { + 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, + 250, 333, 420, 500, 500, 833, 778, 333, + 333, 333, 500, 675, 250, 333, 250, 278, + 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 333, 333, 675, 675, 675, 500, + 920, 611, 611, 667, 722, 611, 611, 722, + 722, 333, 444, 667, 556, 833, 667, 722, + 611, 722, 611, 500, 556, 722, 611, 833, + 611, 556, 556, 389, 278, 389, 422, 500, + 333, 500, 500, 444, 500, 444, 278, 500, + 500, 278, 278, 444, 278, 722, 500, 500, + 500, 500, 389, 389, 278, 500, 444, 667, + 444, 444, 389, 400, 275, 400, 541, 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, 389, 500, 500, 167, 500, 500, 500, + 500, 214, 556, 500, 333, 333, 500, 500, + 0, 500, 500, 500, 250, 0, 523, 350, + 333, 556, 556, 500, 889, 1000, 0, 500, + 0, 333, 333, 333, 333, 333, 333, 333, + 333, 0, 333, 333, 0, 333, 333, 333, + 889, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 889, 0, 276, 0, 0, 0, 0, + 556, 722, 944, 310, 0, 0, 0, 0, + 0, 667, 0, 0, 0, 278, 0, 0, + 278, 500, 667, 500, 0, 0, 0, 0, + 611, 611, 611, 611, 611, 611, 667, 611, + 611, 611, 611, 722, 333, 333, 333, 333, + 667, 722, 722, 722, 722, 722, 500, 611, + 722, 722, 722, 722, 556, 556, 556, 500, + 500, 500, 500, 500, 500, 275, 444, 760, + 400, 675, 444, 444, 444, 444, 500, 278, + 278, 278, 278, 675, 675, 500, 675, 500, + 500, 500, 500, 500, 750, 750, 300, 500, + 675, 760, 389, 500, 750, 300, 980, 300, + 500, 500, 500, 500, 444, 444, 389 +}; + +static Gushort timesRomanWidths[335] = { + 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, + 250, 333, 408, 500, 500, 833, 778, 333, + 333, 333, 500, 564, 250, 333, 250, 278, + 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 278, 278, 564, 564, 564, 444, + 921, 722, 667, 667, 722, 611, 556, 722, + 722, 333, 389, 722, 611, 889, 722, 722, + 556, 722, 667, 556, 611, 722, 722, 944, + 722, 722, 611, 333, 278, 333, 469, 500, + 333, 444, 500, 444, 500, 444, 333, 500, + 500, 278, 278, 500, 278, 778, 500, 500, + 500, 500, 333, 389, 278, 500, 500, 722, + 500, 500, 444, 480, 200, 480, 541, 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, 333, 500, 500, 167, 500, 500, 500, + 500, 180, 444, 500, 333, 333, 556, 556, + 0, 500, 500, 500, 250, 0, 453, 350, + 333, 444, 444, 500, 1000, 1000, 0, 444, + 0, 333, 333, 333, 333, 333, 333, 333, + 333, 0, 333, 333, 0, 333, 333, 333, + 1000, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 889, 0, 276, 0, 0, 0, 0, + 611, 722, 889, 310, 0, 0, 0, 0, + 0, 667, 0, 0, 0, 278, 0, 0, + 278, 500, 722, 500, 0, 0, 0, 0, + 722, 722, 722, 722, 722, 722, 667, 611, + 611, 611, 611, 722, 333, 333, 333, 333, + 722, 722, 722, 722, 722, 722, 556, 556, + 722, 722, 722, 722, 722, 722, 611, 444, + 444, 444, 444, 444, 444, 200, 444, 760, + 400, 564, 444, 444, 444, 444, 500, 278, + 278, 278, 278, 564, 564, 500, 564, 500, + 500, 500, 500, 500, 750, 750, 300, 500, + 564, 760, 389, 500, 750, 300, 980, 300, + 500, 500, 500, 500, 500, 500, 444 +}; + +static Gushort zapfDingbatsWidths[270] = { + 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, + 278, 974, 961, 974, 980, 719, 789, 790, + 791, 690, 960, 939, 549, 855, 911, 933, + 911, 945, 974, 755, 846, 762, 761, 571, + 677, 763, 760, 759, 754, 494, 552, 537, + 577, 692, 786, 788, 788, 790, 793, 794, + 816, 823, 789, 841, 823, 833, 816, 831, + 923, 744, 723, 749, 790, 792, 695, 776, + 768, 792, 759, 707, 708, 682, 701, 826, + 815, 789, 789, 707, 687, 696, 689, 786, + 787, 713, 791, 785, 791, 873, 761, 762, + 762, 759, 759, 892, 892, 788, 784, 438, + 138, 277, 415, 392, 392, 668, 668, 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, 732, 544, 544, 910, 667, 760, 760, + 776, 595, 694, 626, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 894, 838, 1016, 458, + 748, 924, 748, 918, 927, 928, 928, 834, + 873, 828, 924, 924, 917, 930, 931, 463, + 883, 836, 836, 867, 867, 696, 696, 874, + 0, 874, 760, 946, 771, 865, 771, 888, + 967, 888, 831, 873, 927, 970, 918, 0, + 509, 410, 509, 410, 234, 234, 390, 390, + 276, 276, 317, 317, 334, 334 +}; + +//------------------------------------------------------------------------ +// Built-in font table. +//------------------------------------------------------------------------ + +struct BuiltinFont { + char *name; + Gushort *widths; + FontEncoding *encoding; +}; + +#define numBuiltinFonts ((int)(sizeof(builtinFonts)/sizeof(BuiltinFont))) + +static BuiltinFont builtinFonts[] = { + {"Courier", courierWidths, &standardEncoding}, + {"Courier-Bold", courierBoldWidths, &standardEncoding}, + {"Courier-BoldOblique", courierBoldObliqueWidths, &standardEncoding}, + {"Courier-Oblique", courierObliqueWidths, &standardEncoding}, + {"Helvetica", helveticaWidths, &standardEncoding}, + {"Helvetica-Bold", helveticaBoldWidths, &standardEncoding}, + {"Helvetica-BoldOblique", helveticaBoldObliqueWidths, &standardEncoding}, + {"Helvetica-Oblique", helveticaObliqueWidths, &standardEncoding}, + {"Symbol", symbolWidths, &symbolEncoding}, + {"Times-Bold", timesBoldWidths, &standardEncoding}, + {"Times-BoldItalic", timesBoldItalicWidths, &standardEncoding}, + {"Times-Italic", timesItalicWidths, &standardEncoding}, + {"Times-Roman", timesRomanWidths, &standardEncoding}, + {"ZapfDingbats", zapfDingbatsWidths, &zapfDingbatsEncoding} +}; + +#endif diff --git a/pdf2swf/xpdf/FormWidget.cc b/pdf2swf/xpdf/FormWidget.cc new file mode 100644 index 00000000..76428d05 --- /dev/null +++ b/pdf2swf/xpdf/FormWidget.cc @@ -0,0 +1,129 @@ +//======================================================================== +// +// FormWidget.cc +// +// Copyright 2000 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include "gmem.h" +#include "Object.h" +#include "Gfx.h" +#include "FormWidget.h" + +//------------------------------------------------------------------------ +// FormWidget +//------------------------------------------------------------------------ + +FormWidget::FormWidget(Dict *dict) { + Object obj1, obj2; + double t; + + ok = gFalse; + + if (dict->lookup("AP", &obj1)->isDict()) { + obj1.dictLookupNF("N", &obj2); + //~ this doesn't handle appearances with multiple states -- + //~ need to look at AS key to get state and then get the + //~ corresponding entry from the N dict + if (obj2.isRef()) { + obj2.copy(&appearance); + ok = gTrue; + } + obj2.free(); + } + obj1.free(); + + if (dict->lookup("Rect", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + //~ should check object types here + obj1.arrayGet(0, &obj2); + xMin = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + yMin = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2, &obj2); + xMax = obj2.getNum(); + obj2.free(); + obj1.arrayGet(3, &obj2); + yMax = obj2.getNum(); + obj2.free(); + if (xMin > xMax) { + t = xMin; xMin = xMax; xMax = t; + } + if (yMin > yMax) { + t = yMin; yMin = yMax; yMax = t; + } + } else { + //~ this should return an error + xMin = yMin = 0; + xMax = yMax = 1; + } + obj1.free(); +} + +FormWidget::~FormWidget() { + appearance.free(); +} + +void FormWidget::draw(Gfx *gfx) { + Object obj; + + if (appearance.fetch(&obj)->isStream()) { + gfx->doWidgetForm(&obj, xMin, yMin, xMax, yMax); + } + obj.free(); +} + +//------------------------------------------------------------------------ +// FormWidgets +//------------------------------------------------------------------------ + +FormWidgets::FormWidgets(Object *annots) { + FormWidget *widget; + Object obj1, obj2; + int size; + int i; + + widgets = NULL; + size = 0; + nWidgets = 0; + + if (annots->isArray()) { + for (i = 0; i < annots->arrayGetLength(); ++i) { + if (annots->arrayGet(i, &obj1)->isDict()) { + obj1.dictLookup("Subtype", &obj2); + if (obj2.isName("Widget") || + obj2.isName("Stamp")) { + widget = new FormWidget(obj1.getDict()); + if (widget->isOk()) { + if (nWidgets >= size) { + size += 16; + widgets = (FormWidget **)grealloc(widgets, + size * sizeof(FormWidget *)); + } + widgets[nWidgets++] = widget; + } else { + delete widget; + } + } + obj2.free(); + } + obj1.free(); + } + } +} + +FormWidgets::~FormWidgets() { + int i; + + for (i = 0; i < nWidgets; ++i) { + delete widgets[i]; + } + gfree(widgets); +} diff --git a/pdf2swf/xpdf/FormWidget.h b/pdf2swf/xpdf/FormWidget.h new file mode 100644 index 00000000..d746083b --- /dev/null +++ b/pdf2swf/xpdf/FormWidget.h @@ -0,0 +1,65 @@ +//======================================================================== +// +// FormWidget.h +// +// Copyright 2000 Derek B. Noonburg +// +//======================================================================== + +#ifndef FORMWIDGET_H +#define FORMWIDGET_H + +#ifdef __GNUC__ +#pragma interface +#endif + +class Gfx; + +//------------------------------------------------------------------------ +// FormWidget +//------------------------------------------------------------------------ + +class FormWidget { +public: + + FormWidget(Dict *dict); + ~FormWidget(); + GBool isOk() { return ok; } + + void draw(Gfx *gfx); + + // Get appearance object. + Object *getAppearance(Object *obj) { return appearance.fetch(obj); } + +private: + + Object appearance; // a reference to the Form XObject stream + // for the normal appearance + double xMin, yMin, // widget rectangle + xMax, yMax; + GBool ok; +}; + +//------------------------------------------------------------------------ +// FormWidgets +//------------------------------------------------------------------------ + +class FormWidgets { +public: + + // Extract widgets from array of annotations. + FormWidgets(Object *annots); + + ~FormWidgets(); + + // Iterate through list of widgets. + int getNumWidgets() { return nWidgets; } + FormWidget *getWidget(int i) { return widgets[i]; } + +private: + + FormWidget **widgets; + int nWidgets; +}; + +#endif diff --git a/pdf2swf/xpdf/GString.cc b/pdf2swf/xpdf/GString.cc new file mode 100644 index 00000000..7b8f2718 --- /dev/null +++ b/pdf2swf/xpdf/GString.cc @@ -0,0 +1,223 @@ +//======================================================================== +// +// GString.cc +// +// Simple variable-length string type. +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include +#include "gtypes.h" +#include "GString.h" + +static inline int size(int len) { + int delta; + + delta = len < 256 ? 7 : 255; + return ((len + 1) + delta) & ~delta; +} + +inline void GString::resize(int length1) { + char *s1; + + if (!s) { + s = new char[size(length1)]; + } else if (size(length1) != size(length)) { + s1 = new char[size(length1)]; + memcpy(s1, s, length + 1); + delete[] s; + s = s1; + } +} + +GString::GString() { + s = NULL; + resize(length = 0); + s[0] = '\0'; +} + +GString::GString(const char *s1) { + int n = strlen(s1); + + s = NULL; + resize(length = n); + memcpy(s, s1, n + 1); +} + +GString::GString(const char *s1, int length1) { + s = NULL; + resize(length = length1); + memcpy(s, s1, length * sizeof(char)); + s[length] = '\0'; +} + +GString::GString(GString *str) { + s = NULL; + resize(length = str->getLength()); + memcpy(s, str->getCString(), length + 1); +} + +GString::GString(GString *str1, GString *str2) { + int n1 = str1->getLength(); + int n2 = str2->getLength(); + + s = NULL; + resize(length = n1 + n2); + memcpy(s, str1->getCString(), n1); + memcpy(s + n1, str2->getCString(), n2 + 1); +} + +GString *GString::fromInt(int x) { + char buf[24]; // enough space for 64-bit ints plus a little extra + GBool neg; + Guint y; + int i; + + i = 24; + if (x == 0) { + buf[--i] = '0'; + } else { + if ((neg = x < 0)) { + y = (Guint)-x; + } else { + y = (Guint)x; + } + while (i > 0 && y > 0) { + buf[--i] = '0' + y % 10; + y /= 10; + } + if (neg && i > 0) { + buf[--i] = '-'; + } + } + return new GString(buf + i, 24 - i); +} + +GString::~GString() { + delete[] s; +} + +GString *GString::clear() { + s[length = 0] = '\0'; + resize(0); + return this; +} + +GString *GString::append(char c) { + resize(length + 1); + s[length++] = c; + s[length] = '\0'; + return this; +} + +GString *GString::append(GString *str) { + int n = str->getLength(); + + resize(length + n); + memcpy(s + length, str->getCString(), n + 1); + length += n; + return this; +} + +GString *GString::append(const char *str) { + int n = strlen(str); + + resize(length + n); + memcpy(s + length, str, n + 1); + length += n; + return this; +} + +GString *GString::append(const char *str, int length1) { + resize(length + length1); + memcpy(s + length, str, length1); + length += length1; + s[length] = '\0'; + return this; +} + +GString *GString::insert(int i, char c) { + int j; + + resize(length + 1); + for (j = length + 1; j > i; --j) + s[j] = s[j-1]; + s[i] = c; + ++length; + return this; +} + +GString *GString::insert(int i, GString *str) { + int n = str->getLength(); + int j; + + resize(length + n); + for (j = length; j >= i; --j) + s[j+n] = s[j]; + memcpy(s+i, str->getCString(), n); + length += n; + return this; +} + +GString *GString::insert(int i, const char *str) { + int n = strlen(str); + int j; + + resize(length + n); + for (j = length; j >= i; --j) + s[j+n] = s[j]; + memcpy(s+i, str, n); + length += n; + return this; +} + +GString *GString::insert(int i, const char *str, int length1) { + int j; + + resize(length + length1); + for (j = length; j >= i; --j) + s[j+length1] = s[j]; + memcpy(s+i, str, length1); + length += length1; + return this; +} + +GString *GString::del(int i, int n) { + int j; + + if (n > 0) { + for (j = i; j <= length - n; ++j) + s[j] = s[j + n]; + resize(length -= n); + } + return this; +} + +GString *GString::upperCase() { + int i; + + for (i = 0; i < length; ++i) { + if (islower(s[i])) + s[i] = toupper(s[i]); + } + return this; +} + +GString *GString::lowerCase() { + int i; + + for (i = 0; i < length; ++i) { + if (isupper(s[i])) + s[i] = tolower(s[i]); + } + return this; +} diff --git a/pdf2swf/xpdf/GString.h b/pdf2swf/xpdf/GString.h new file mode 100644 index 00000000..4c3b95f3 --- /dev/null +++ b/pdf2swf/xpdf/GString.h @@ -0,0 +1,95 @@ +//======================================================================== +// +// GString.h +// +// Simple variable-length string type. +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef GSTRING_H +#define GSTRING_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include + +class GString { +public: + + // Create an empty string. + GString(); + + // Create a string from a C string. + GString(const char *s1); + + // Create a string from chars at . This string + // can contain null characters. + GString (const char *s1, int length1); + + // Copy a string. + GString(GString *str); + GString *copy() { return new GString(this); } + + // Concatenate two strings. + GString(GString *str1, GString *str2); + + // Convert an integer to a string. + static GString *fromInt(int x); + + // Destructor. + ~GString(); + + // Get length. + int getLength() { return length; } + + // Get C string. + char *getCString() { return s; } + + // Get th character. + char getChar(int i) { return s[i]; } + + // Change th character. + void setChar(int i, char c) { s[i] = c; } + + // Clear string to zero length. + GString *clear(); + + // Append a character or string. + GString *append(char c); + GString *append(GString *str); + GString *append(const char *str); + GString *append(const char *str, int length1); + + // Insert a character or string. + GString *insert(int i, char c); + GString *insert(int i, GString *str); + GString *insert(int i, const char *str); + GString *insert(int i, const char *str, int length1); + + // Delete a character or range of characters. + GString *del(int i, int n = 1); + + // Convert string to all-upper/all-lower case. + GString *upperCase(); + GString *lowerCase(); + + // Compare two strings: -1:< 0:= +1:> + // These functions assume the strings do not contain null characters. + int cmp(GString *str) { return strcmp(s, str->getCString()); } + int cmpN(GString *str, int n) { return strncmp(s, str->getCString(), n); } + int cmp(const char *s1) { return strcmp(s, s1); } + int cmpN(const char *s1, int n) { return strncmp(s, s1, n); } + +private: + + int length; + char *s; + + void resize(int length1); +}; + +#endif diff --git a/pdf2swf/xpdf/Gfx.cc b/pdf2swf/xpdf/Gfx.cc new file mode 100644 index 00000000..0096d4b3 --- /dev/null +++ b/pdf2swf/xpdf/Gfx.cc @@ -0,0 +1,2107 @@ +//======================================================================== +// +// Gfx.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include +#include "gmem.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" +#include "GfxFont.h" +#include "GfxState.h" +#include "OutputDev.h" +#include "Params.h" +#include "Error.h" +#include "Gfx.h" + +//------------------------------------------------------------------------ +// Operator table +//------------------------------------------------------------------------ + +Operator Gfx::opTab[] = { + {"\"", 3, {tchkNum, tchkNum, tchkString}, + &Gfx::opMoveSetShowText}, + {"'", 1, {tchkString}, + &Gfx::opMoveShowText}, + {"B", 0, {tchkNone}, + &Gfx::opFillStroke}, + {"B*", 0, {tchkNone}, + &Gfx::opEOFillStroke}, + {"BDC", 2, {tchkName, tchkProps}, + &Gfx::opBeginMarkedContent}, + {"BI", 0, {tchkNone}, + &Gfx::opBeginImage}, + {"BMC", 1, {tchkName}, + &Gfx::opBeginMarkedContent}, + {"BT", 0, {tchkNone}, + &Gfx::opBeginText}, + {"BX", 0, {tchkNone}, + &Gfx::opBeginIgnoreUndef}, + {"CS", 1, {tchkName}, + &Gfx::opSetStrokeColorSpace}, + {"DP", 2, {tchkName, tchkProps}, + &Gfx::opMarkPoint}, + {"Do", 1, {tchkName}, + &Gfx::opXObject}, + {"EI", 0, {tchkNone}, + &Gfx::opEndImage}, + {"EMC", 0, {tchkNone}, + &Gfx::opEndMarkedContent}, + {"ET", 0, {tchkNone}, + &Gfx::opEndText}, + {"EX", 0, {tchkNone}, + &Gfx::opEndIgnoreUndef}, + {"F", 0, {tchkNone}, + &Gfx::opFill}, + {"G", 1, {tchkNum}, + &Gfx::opSetStrokeGray}, + {"ID", 0, {tchkNone}, + &Gfx::opImageData}, + {"J", 1, {tchkInt}, + &Gfx::opSetLineCap}, + {"K", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeCMYKColor}, + {"M", 1, {tchkNum}, + &Gfx::opSetMiterLimit}, + {"MP", 1, {tchkName}, + &Gfx::opMarkPoint}, + {"Q", 0, {tchkNone}, + &Gfx::opRestore}, + {"RG", 3, {tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeRGBColor}, + {"S", 0, {tchkNone}, + &Gfx::opStroke}, + {"SC", -4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeColor}, + {"SCN", -5, {tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN}, + &Gfx::opSetStrokeColorN}, + {"T*", 0, {tchkNone}, + &Gfx::opTextNextLine}, + {"TD", 2, {tchkNum, tchkNum}, + &Gfx::opTextMoveSet}, + {"TJ", 1, {tchkArray}, + &Gfx::opShowSpaceText}, + {"TL", 1, {tchkNum}, + &Gfx::opSetTextLeading}, + {"Tc", 1, {tchkNum}, + &Gfx::opSetCharSpacing}, + {"Td", 2, {tchkNum, tchkNum}, + &Gfx::opTextMove}, + {"Tf", 2, {tchkName, tchkNum}, + &Gfx::opSetFont}, + {"Tj", 1, {tchkString}, + &Gfx::opShowText}, + {"Tm", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opSetTextMatrix}, + {"Tr", 1, {tchkInt}, + &Gfx::opSetTextRender}, + {"Ts", 1, {tchkNum}, + &Gfx::opSetTextRise}, + {"Tw", 1, {tchkNum}, + &Gfx::opSetWordSpacing}, + {"Tz", 1, {tchkNum}, + &Gfx::opSetHorizScaling}, + {"W", 0, {tchkNone}, + &Gfx::opClip}, + {"W*", 0, {tchkNone}, + &Gfx::opEOClip}, + {"b", 0, {tchkNone}, + &Gfx::opCloseFillStroke}, + {"b*", 0, {tchkNone}, + &Gfx::opCloseEOFillStroke}, + {"c", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opCurveTo}, + {"cm", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opConcat}, + {"cs", 1, {tchkName}, + &Gfx::opSetFillColorSpace}, + {"d", 2, {tchkArray, tchkNum}, + &Gfx::opSetDash}, + {"d0", 2, {tchkNum, tchkNum}, + &Gfx::opSetCharWidth}, + {"d1", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opSetCacheDevice}, + {"f", 0, {tchkNone}, + &Gfx::opFill}, + {"f*", 0, {tchkNone}, + &Gfx::opEOFill}, + {"g", 1, {tchkNum}, + &Gfx::opSetFillGray}, + {"gs", 1, {tchkName}, + &Gfx::opSetExtGState}, + {"h", 0, {tchkNone}, + &Gfx::opClosePath}, + {"i", 1, {tchkNum}, + &Gfx::opSetFlat}, + {"j", 1, {tchkInt}, + &Gfx::opSetLineJoin}, + {"k", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillCMYKColor}, + {"l", 2, {tchkNum, tchkNum}, + &Gfx::opLineTo}, + {"m", 2, {tchkNum, tchkNum}, + &Gfx::opMoveTo}, + {"n", 0, {tchkNone}, + &Gfx::opEndPath}, + {"q", 0, {tchkNone}, + &Gfx::opSave}, + {"re", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opRectangle}, + {"rg", 3, {tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillRGBColor}, + {"ri", 1, {tchkName}, + &Gfx::opSetRenderingIntent}, + {"s", 0, {tchkNone}, + &Gfx::opCloseStroke}, + {"sc", -4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillColor}, + {"scn", -5, {tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN}, + &Gfx::opSetFillColorN}, + {"sh", 1, {tchkName}, + &Gfx::opShFill}, + {"v", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opCurveTo1}, + {"w", 1, {tchkNum}, + &Gfx::opSetLineWidth}, + {"y", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opCurveTo2}, +}; + +#define numOps (sizeof(opTab) / sizeof(Operator)) + +//------------------------------------------------------------------------ + +GBool printCommands = gFalse; + +//------------------------------------------------------------------------ +// GfxResources +//------------------------------------------------------------------------ + +GfxResources::GfxResources(Dict *resDict, GfxResources *next) { + Object obj1; + + if (resDict) { + + // build font dictionary + fonts = NULL; + resDict->lookup("Font", &obj1); + if (obj1.isDict()) { + fonts = new GfxFontDict(obj1.getDict()); + } + obj1.free(); + + // get XObject dictionary + resDict->lookup("XObject", &xObjDict); + + // get color space dictionary + resDict->lookup("ColorSpace", &colorSpaceDict); + + // get pattern dictionary + resDict->lookup("Pattern", &patternDict); + + // get graphics state parameter dictionary + resDict->lookup("ExtGState", &gStateDict); + + } else { + fonts = NULL; + xObjDict.initNull(); + colorSpaceDict.initNull(); + patternDict.initNull(); + gStateDict.initNull(); + } + + this->next = next; +} + +GfxResources::~GfxResources() { + if (fonts) { + delete fonts; + } + xObjDict.free(); + colorSpaceDict.free(); + patternDict.free(); + gStateDict.free(); +} + +GfxFont *GfxResources::lookupFont(char *name) { + GfxFont *font; + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->fonts) { + if ((font = resPtr->fonts->lookup(name))) + return font; + } + } + error(-1, "Unknown font tag '%s'", name); + return NULL; +} + +GBool GfxResources::lookupXObject(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->xObjDict.isDict()) { + if (!resPtr->xObjDict.dictLookup(name, obj)->isNull()) + return gTrue; + obj->free(); + } + } + error(-1, "XObject '%s' is unknown", name); + return gFalse; +} + +GBool GfxResources::lookupXObjectNF(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->xObjDict.isDict()) { + if (!resPtr->xObjDict.dictLookupNF(name, obj)->isNull()) + return gTrue; + obj->free(); + } + } + error(-1, "XObject '%s' is unknown", name); + return gFalse; +} + +void GfxResources::lookupColorSpace(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->colorSpaceDict.isDict()) { + if (!resPtr->colorSpaceDict.dictLookup(name, obj)->isNull()) { + return; + } + obj->free(); + } + } + obj->initNull(); +} + +GfxPattern *GfxResources::lookupPattern(char *name) { + GfxResources *resPtr; + GfxPattern *pattern; + Object obj; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->patternDict.isDict()) { + if (!resPtr->patternDict.dictLookup(name, &obj)->isNull()) { + pattern = GfxPattern::parse(&obj); + obj.free(); + return pattern; + } + obj.free(); + } + } + error(-1, "Unknown pattern '%s'", name); + return NULL; +} + +GBool GfxResources::lookupGState(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->gStateDict.isDict()) { + if (!resPtr->gStateDict.dictLookup(name, obj)->isNull()) { + return gTrue; + } + obj->free(); + } + } + error(-1, "ExtGState '%s' is unknown", name); + return gFalse; +} + +//------------------------------------------------------------------------ +// Gfx +//------------------------------------------------------------------------ + +Gfx::Gfx(OutputDev *out1, int pageNum, Dict *resDict, + double dpi, double x1, double y1, double x2, double y2, GBool crop, + double cropX1, double cropY1, double cropX2, double cropY2, + int rotate) { + int i; + + // start the resource stack + res = new GfxResources(resDict, NULL); + + // initialize + out = out1; + state = new GfxState(dpi, x1, y1, x2, y2, rotate, out->upsideDown()); + fontChanged = gFalse; + clip = clipNone; + ignoreUndef = 0; + out->startPage(pageNum, state); + out->setDefaultCTM(state->getCTM()); + out->updateAll(state); + for (i = 0; i < 6; ++i) { + baseMatrix[i] = state->getCTM()[i]; + } + + // set crop box + if (crop) { + state->moveTo(cropX1, cropY1); + state->lineTo(cropX2, cropY1); + state->lineTo(cropX2, cropY2); + state->lineTo(cropX1, cropY2); + state->closePath(); + out->clip(state); + state->clearPath(); + } +} + +Gfx::~Gfx() { + GfxResources *resPtr; + + while (state->hasSaves()) { + state = state->restore(); + out->restoreState(state); + } + out->endPage(); + while (res) { + resPtr = res->getNext(); + delete res; + res = resPtr; + } + if (state) + delete state; +} + +void Gfx::display(Object *obj, GBool topLevel) { + Object obj2; + int i; + + if (obj->isArray()) { + for (i = 0; i < obj->arrayGetLength(); ++i) { + obj->arrayGet(i, &obj2); + if (!obj2.isStream()) { + error(-1, "Weird page contents"); + obj2.free(); + return; + } + obj2.free(); + } + } else if (!obj->isStream()) { + error(-1, "Weird page contents"); + return; + } + parser = new Parser(new Lexer(obj)); + go(topLevel); + delete parser; + parser = NULL; +} + +void Gfx::go(GBool topLevel) { + Object obj; + Object args[maxArgs]; + int numCmds, numArgs; + int i; + + // scan a sequence of objects + numCmds = 0; + numArgs = 0; + parser->getObj(&obj); + while (!obj.isEOF()) { + + // got a command - execute it + if (obj.isCmd()) { + if (printCommands) { + obj.print(stdout); + for (i = 0; i < numArgs; ++i) { + printf(" "); + args[i].print(stdout); + } + printf("\n"); + } + execOp(&obj, args, numArgs); + obj.free(); + for (i = 0; i < numArgs; ++i) + args[i].free(); + numArgs = 0; + + // periodically update display + if (++numCmds == 200) { + out->dump(); + numCmds = 0; + } + + // got an argument - save it + } else if (numArgs < maxArgs) { + args[numArgs++] = obj; + + // too many arguments - something is wrong + } else { + error(getPos(), "Too many args in content stream"); + if (printCommands) { + printf("throwing away arg: "); + obj.print(stdout); + printf("\n"); + } + obj.free(); + } + + // grab the next object + parser->getObj(&obj); + } + obj.free(); + + // args at end with no command + if (numArgs > 0) { + error(getPos(), "Leftover args in content stream"); + if (printCommands) { + printf("%d leftovers:", numArgs); + for (i = 0; i < numArgs; ++i) { + printf(" "); + args[i].print(stdout); + } + printf("\n"); + } + for (i = 0; i < numArgs; ++i) + args[i].free(); + } + + // update display + if (topLevel && numCmds > 0) { + out->dump(); + } + + // clean up + if (printCommands) { + fflush(stdout); + } +} + +void Gfx::execOp(Object *cmd, Object args[], int numArgs) { + Operator *op; + char *name; + int i; + + // find operator + name = cmd->getName(); + if (!(op = findOp(name))) { + if (ignoreUndef == 0) + error(getPos(), "Unknown operator '%s'", name); + return; + } + + // type check args + if (op->numArgs >= 0) { + if (numArgs != op->numArgs) { + error(getPos(), "Wrong number (%d) of args to '%s' operator", + numArgs, name); + return; + } + } else { + if (numArgs > -op->numArgs) { + error(getPos(), "Too many (%d) args to '%s' operator", + numArgs, name); + return; + } + } + for (i = 0; i < numArgs; ++i) { + if (!checkArg(&args[i], op->tchk[i])) { + error(getPos(), "Arg #%d to '%s' operator is wrong type (%s)", + i, name, args[i].getTypeName()); + return; + } + } + + // do it + (this->*op->func)(args, numArgs); +} + +Operator *Gfx::findOp(char *name) { + int a, b, m, cmp; + + a = -1; + b = numOps; + // invariant: opTab[a] < name < opTab[b] + while (b - a > 1) { + m = (a + b) / 2; + cmp = strcmp(opTab[m].name, name); + if (cmp < 0) + a = m; + else if (cmp > 0) + b = m; + else + a = b = m; + } + if (cmp != 0) + return NULL; + return &opTab[a]; +} + +GBool Gfx::checkArg(Object *arg, TchkType type) { + switch (type) { + case tchkBool: return arg->isBool(); + case tchkInt: return arg->isInt(); + case tchkNum: return arg->isNum(); + case tchkString: return arg->isString(); + case tchkName: return arg->isName(); + case tchkArray: return arg->isArray(); + case tchkProps: return arg->isDict() || arg->isName(); + case tchkSCN: return arg->isNum() || arg->isName(); + case tchkNone: return gFalse; + } + return gFalse; +} + +int Gfx::getPos() { + return parser ? parser->getPos() : -1; +} + +//------------------------------------------------------------------------ +// graphics state operators +//------------------------------------------------------------------------ + +void Gfx::opSave(Object args[], int numArgs) { + out->saveState(state); + state = state->save(); +} + +void Gfx::opRestore(Object args[], int numArgs) { + state = state->restore(); + out->restoreState(state); + + // Some PDF producers (Macromedia FreeHand) generate a save (q) and + // restore (Q) inside a path sequence. The PDF spec seems to imply + // that this is illegal. Calling clearPath() here implements the + // behavior apparently expected by this software. + state->clearPath(); +} + +void Gfx::opConcat(Object args[], int numArgs) { + state->concatCTM(args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + out->updateCTM(state, args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + fontChanged = gTrue; +} + +void Gfx::opSetDash(Object args[], int numArgs) { + Array *a; + int length; + Object obj; + double *dash; + int i; + + a = args[0].getArray(); + length = a->getLength(); + if (length == 0) { + dash = NULL; + } else { + dash = (double *)gmalloc(length * sizeof(double)); + for (i = 0; i < length; ++i) { + dash[i] = a->get(i, &obj)->getNum(); + obj.free(); + } + } + state->setLineDash(dash, length, args[1].getNum()); + out->updateLineDash(state); +} + +void Gfx::opSetFlat(Object args[], int numArgs) { + state->setFlatness((int)args[0].getNum()); + out->updateFlatness(state); +} + +void Gfx::opSetLineJoin(Object args[], int numArgs) { + state->setLineJoin(args[0].getInt()); + out->updateLineJoin(state); +} + +void Gfx::opSetLineCap(Object args[], int numArgs) { + state->setLineCap(args[0].getInt()); + out->updateLineCap(state); +} + +void Gfx::opSetMiterLimit(Object args[], int numArgs) { + state->setMiterLimit(args[0].getNum()); + out->updateMiterLimit(state); +} + +void Gfx::opSetLineWidth(Object args[], int numArgs) { + state->setLineWidth(args[0].getNum()); + out->updateLineWidth(state); +} + +void Gfx::opSetExtGState(Object args[], int numArgs) { + Object obj1, obj2; + + if (!res->lookupGState(args[0].getName(), &obj1)) { + return; + } + if (!obj1.isDict()) { + error(getPos(), "ExtGState '%s' is wrong type", args[0].getName()); + obj1.free(); + return; + } + if (obj1.dictLookup("ca", &obj2)->isNum()) { + state->setFillOpacity(obj2.getNum()); + out->updateFillOpacity(state); + } + obj2.free(); + if (obj1.dictLookup("CA", &obj2)->isNum()) { + state->setStrokeOpacity(obj2.getNum()); + out->updateStrokeOpacity(state); + } + obj2.free(); + obj1.free(); +} + +void Gfx::opSetRenderingIntent(Object args[], int numArgs) { +} + +//------------------------------------------------------------------------ +// color operators +//------------------------------------------------------------------------ + +void Gfx::opSetFillGray(Object args[], int numArgs) { + GfxColor color; + + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceGrayColorSpace()); + color.c[0] = args[0].getNum(); + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeGray(Object args[], int numArgs) { + GfxColor color; + + state->setStrokePattern(NULL); + state->setStrokeColorSpace(new GfxDeviceGrayColorSpace()); + color.c[0] = args[0].getNum(); + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillCMYKColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceCMYKColorSpace()); + for (i = 0; i < 4; ++i) { + color.c[i] = args[i].getNum(); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setStrokePattern(NULL); + state->setStrokeColorSpace(new GfxDeviceCMYKColorSpace()); + for (i = 0; i < 4; ++i) { + color.c[i] = args[i].getNum(); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillRGBColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceRGBColorSpace()); + for (i = 0; i < 3; ++i) { + color.c[i] = args[i].getNum(); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setStrokePattern(NULL); + state->setStrokeColorSpace(new GfxDeviceRGBColorSpace()); + for (i = 0; i < 3; ++i) { + color.c[i] = args[i].getNum(); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillColorSpace(Object args[], int numArgs) { + Object obj; + GfxColorSpace *colorSpace; + GfxColor color; + int i; + + state->setFillPattern(NULL); + res->lookupColorSpace(args[0].getName(), &obj); + if (obj.isNull()) { + colorSpace = GfxColorSpace::parse(&args[0]); + } else { + colorSpace = GfxColorSpace::parse(&obj); + } + obj.free(); + if (colorSpace) { + state->setFillColorSpace(colorSpace); + } else { + error(getPos(), "Bad color space"); + } + for (i = 0; i < gfxColorMaxComps; ++i) { + color.c[i] = 0; + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeColorSpace(Object args[], int numArgs) { + Object obj; + GfxColorSpace *colorSpace; + GfxColor color; + int i; + + state->setStrokePattern(NULL); + res->lookupColorSpace(args[0].getName(), &obj); + if (obj.isNull()) { + colorSpace = GfxColorSpace::parse(&args[0]); + } else { + colorSpace = GfxColorSpace::parse(&obj); + } + obj.free(); + if (colorSpace) { + state->setStrokeColorSpace(colorSpace); + } else { + error(getPos(), "Bad color space"); + } + for (i = 0; i < gfxColorMaxComps; ++i) { + color.c[i] = 0; + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setFillPattern(NULL); + for (i = 0; i < numArgs; ++i) { + color.c[i] = args[i].getNum(); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setStrokePattern(NULL); + for (i = 0; i < numArgs; ++i) { + color.c[i] = args[i].getNum(); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillColorN(Object args[], int numArgs) { + GfxColor color; + GfxPattern *pattern; + int i; + + if (state->getFillColorSpace()->getMode() == csPattern) { + if (numArgs > 1) { + for (i = 0; i < numArgs && i < 4; ++i) { + if (args[i].isNum()) { + color.c[i] = args[i].getNum(); + } + } + state->setFillColor(&color); + out->updateFillColor(state); + } + if (args[numArgs-1].isName() && + (pattern = res->lookupPattern(args[numArgs-1].getName()))) { + state->setFillPattern(pattern); + } + + } else { + state->setFillPattern(NULL); + for (i = 0; i < numArgs && i < 4; ++i) { + if (args[i].isNum()) { + color.c[i] = args[i].getNum(); + } + } + state->setFillColor(&color); + out->updateFillColor(state); + } +} + +void Gfx::opSetStrokeColorN(Object args[], int numArgs) { + GfxColor color; + GfxPattern *pattern; + int i; + + if (state->getStrokeColorSpace()->getMode() == csPattern) { + if (numArgs > 1) { + for (i = 0; i < numArgs && i < 4; ++i) { + if (args[i].isNum()) { + color.c[i] = args[i].getNum(); + } + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); + } + if (args[numArgs-1].isName() && + (pattern = res->lookupPattern(args[numArgs-1].getName()))) { + state->setStrokePattern(pattern); + } + + } else { + state->setStrokePattern(NULL); + for (i = 0; i < numArgs && i < 4; ++i) { + if (args[i].isNum()) { + color.c[i] = args[i].getNum(); + } + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); + } +} + +//------------------------------------------------------------------------ +// path segment operators +//------------------------------------------------------------------------ + +void Gfx::opMoveTo(Object args[], int numArgs) { + state->moveTo(args[0].getNum(), args[1].getNum()); +} + +void Gfx::opLineTo(Object args[], int numArgs) { + if (!state->isCurPt()) { + error(getPos(), "No current point in lineto"); + return; + } + state->lineTo(args[0].getNum(), args[1].getNum()); +} + +void Gfx::opCurveTo(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(getPos(), "No current point in curveto"); + return; + } + x1 = args[0].getNum(); + y1 = args[1].getNum(); + x2 = args[2].getNum(); + y2 = args[3].getNum(); + x3 = args[4].getNum(); + y3 = args[5].getNum(); + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opCurveTo1(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(getPos(), "No current point in curveto1"); + return; + } + x1 = state->getCurX(); + y1 = state->getCurY(); + x2 = args[0].getNum(); + y2 = args[1].getNum(); + x3 = args[2].getNum(); + y3 = args[3].getNum(); + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opCurveTo2(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(getPos(), "No current point in curveto2"); + return; + } + x1 = args[0].getNum(); + y1 = args[1].getNum(); + x2 = args[2].getNum(); + y2 = args[3].getNum(); + x3 = x2; + y3 = y2; + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opRectangle(Object args[], int numArgs) { + double x, y, w, h; + + x = args[0].getNum(); + y = args[1].getNum(); + w = args[2].getNum(); + h = args[3].getNum(); + state->moveTo(x, y); + state->lineTo(x + w, y); + state->lineTo(x + w, y + h); + state->lineTo(x, y + h); + state->closePath(); +} + +void Gfx::opClosePath(Object args[], int numArgs) { + if (!state->isPath()) { + error(getPos(), "No current point in closepath"); + return; + } + state->closePath(); +} + +//------------------------------------------------------------------------ +// path painting operators +//------------------------------------------------------------------------ + +void Gfx::opEndPath(Object args[], int numArgs) { + doEndPath(); +} + +void Gfx::opStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in stroke"); + return; + } + if (state->isPath()) + out->stroke(state); + doEndPath(); +} + +void Gfx::opCloseStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in closepath/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + out->stroke(state); + } + doEndPath(); +} + +void Gfx::opFill(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in fill"); + return; + } + if (state->isPath()) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + } + doEndPath(); +} + +void Gfx::opEOFill(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in eofill"); + return; + } + if (state->isPath()) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + } + doEndPath(); +} + +void Gfx::opFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in fill/stroke"); + return; + } + if (state->isPath()) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + out->stroke(state); + } + doEndPath(); +} + +void Gfx::opCloseFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in closepath/fill/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + out->stroke(state); + } + doEndPath(); +} + +void Gfx::opEOFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in eofill/stroke"); + return; + } + if (state->isPath()) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + out->stroke(state); + } + doEndPath(); +} + +void Gfx::opCloseEOFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in closepath/eofill/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + out->stroke(state); + } + doEndPath(); +} + +void Gfx::opShFill(Object args[], int numArgs) { +} + +void Gfx::doPatternFill(GBool eoFill) { + GfxPatternColorSpace *patCS; + GfxPattern *pattern; + GfxTilingPattern *tPat; + GfxColorSpace *cs; + GfxPath *path; + GfxSubpath *subpath; + double xMin, yMin, xMax, yMax, x, y, x1, y1; + int xi0, yi0, xi1, yi1, xi, yi; + double *ctm, *btm, *ptm; + double m[6], ictm[6], m1[6], im[6]; + double det; + double xstep, ystep; + int i, j; + + // get color space + patCS = (GfxPatternColorSpace *)state->getFillColorSpace(); + + // get pattern + if (!(pattern = state->getFillPattern())) { + return; + } + if (pattern->getType() != 1) { + return; + } + tPat = (GfxTilingPattern *)pattern; + + // construct a (pattern space) -> (current space) transform matrix + ctm = state->getCTM(); + btm = baseMatrix; + ptm = tPat->getMatrix(); + // iCTM = invert CTM + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; + // m1 = PTM * BTM = PTM * base transform matrix + m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2]; + m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3]; + m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2]; + m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3]; + m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4]; + m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5]; + // m = m1 * iCTM = (PTM * BTM) * (iCTM) + m[0] = m1[0] * ictm[0] + m1[1] * ictm[2]; + m[1] = m1[0] * ictm[1] + m1[1] * ictm[3]; + m[2] = m1[2] * ictm[0] + m1[3] * ictm[2]; + m[3] = m1[2] * ictm[1] + m1[3] * ictm[3]; + m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4]; + m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5]; + + // construct a (current space) -> (pattern space) transform matrix + det = 1 / (m[0] * m[3] - m[1] * m[2]); + im[0] = m[3] * det; + im[1] = -m[1] * det; + im[2] = -m[2] * det; + im[3] = m[0] * det; + im[4] = (m[2] * m[5] - m[3] * m[4]) * det; + im[5] = (m[1] * m[4] - m[0] * m[5]) * det; + + // compute bounding box of current path, in pattern space + xMin = xMax = yMin = yMax = 0; // make gcc happy + path = state->getPath(); + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + for (j = 0; j < subpath->getNumPoints(); ++j) { + x = subpath->getX(j); + y = subpath->getY(j); + x1 = x * im[0] + y * im[2] + im[4]; + y1 = x * im[1] + y * im[3] + im[5]; + if (i == 0 && j == 0) { + xMin = xMax = x1; + yMin = yMax = y1; + } else { + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + } + } + } + + // save current graphics state + out->saveState(state); + state = state->save(); + + // set underlying color space (for uncolored tiling patterns) + if (tPat->getPaintType() == 2 && (cs = patCS->getUnder())) { + state->setFillColorSpace(cs->copy()); + } else { + state->setFillColorSpace(new GfxDeviceGrayColorSpace()); + } + state->setFillPattern(NULL); + out->updateFillColor(state); + + // clip to current path + if (eoFill) { + out->eoClip(state); + } else { + out->clip(state); + } + state->clearPath(); + + // draw the pattern + //~ this should treat negative steps differently -- start at right/top + //~ edge instead of left/bottom (?) + xstep = fabs(tPat->getXStep()); + ystep = fabs(tPat->getYStep()); + xi0 = (int)floor(xMin / xstep); + xi1 = (int)ceil(xMax / xstep); + yi0 = (int)floor(yMin / ystep); + yi1 = (int)ceil(yMax / ystep); + for (i = 0; i < 4; ++i) { + m1[i] = m[i]; + } + for (yi = yi0; yi < yi1; ++yi) { + for (xi = xi0; xi < xi1; ++xi) { + x = xi * xstep; + y = yi * ystep; + m1[4] = x * m[0] + y * m[2] + m[4]; + m1[5] = x * m[1] + y * m[3] + m[5]; + doForm1(tPat->getContentStream(), tPat->getResDict(), + m1, tPat->getBBox()); + } + } + + // restore graphics state + state = state->restore(); + out->restoreState(state); +} + +void Gfx::doEndPath() { + if (state->isPath()) { + if (clip == clipNormal) + out->clip(state); + else if (clip == clipEO) + out->eoClip(state); + } + clip = clipNone; + state->clearPath(); +} + +//------------------------------------------------------------------------ +// path clipping operators +//------------------------------------------------------------------------ + +void Gfx::opClip(Object args[], int numArgs) { + clip = clipNormal; +} + +void Gfx::opEOClip(Object args[], int numArgs) { + clip = clipEO; +} + +//------------------------------------------------------------------------ +// text object operators +//------------------------------------------------------------------------ + +void Gfx::opBeginText(Object args[], int numArgs) { + state->setTextMat(1, 0, 0, 1, 0, 0); + state->textMoveTo(0, 0); + out->updateTextMat(state); + out->updateTextPos(state); + fontChanged = gTrue; +} + +void Gfx::opEndText(Object args[], int numArgs) { +} + +//------------------------------------------------------------------------ +// text state operators +//------------------------------------------------------------------------ + +void Gfx::opSetCharSpacing(Object args[], int numArgs) { + state->setCharSpace(args[0].getNum()); + out->updateCharSpace(state); +} + +void Gfx::opSetFont(Object args[], int numArgs) { + GfxFont *font; + + if (!(font = res->lookupFont(args[0].getName()))) { + return; + } + if (printCommands) { + printf(" font: '%s' %g\n", + font->getName() ? font->getName()->getCString() : "???", + args[1].getNum()); + } + state->setFont(font, args[1].getNum()); + fontChanged = gTrue; +} + +void Gfx::opSetTextLeading(Object args[], int numArgs) { + state->setLeading(args[0].getNum()); +} + +void Gfx::opSetTextRender(Object args[], int numArgs) { + state->setRender(args[0].getInt()); + out->updateRender(state); +} + +void Gfx::opSetTextRise(Object args[], int numArgs) { + state->setRise(args[0].getNum()); + out->updateRise(state); +} + +void Gfx::opSetWordSpacing(Object args[], int numArgs) { + state->setWordSpace(args[0].getNum()); + out->updateWordSpace(state); +} + +void Gfx::opSetHorizScaling(Object args[], int numArgs) { + state->setHorizScaling(args[0].getNum()); + out->updateHorizScaling(state); +} + +//------------------------------------------------------------------------ +// text positioning operators +//------------------------------------------------------------------------ + +void Gfx::opTextMove(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX() + args[0].getNum(); + ty = state->getLineY() + args[1].getNum(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +void Gfx::opTextMoveSet(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX() + args[0].getNum(); + ty = args[1].getNum(); + state->setLeading(-ty); + ty += state->getLineY(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +void Gfx::opSetTextMatrix(Object args[], int numArgs) { + state->setTextMat(args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + state->textMoveTo(0, 0); + out->updateTextMat(state); + out->updateTextPos(state); + fontChanged = gTrue; +} + +void Gfx::opTextNextLine(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +//------------------------------------------------------------------------ +// text string operators +//------------------------------------------------------------------------ + +void Gfx::opShowText(Object args[], int numArgs) { + if (!state->getFont()) { + error(getPos(), "No font in show"); + return; + } + doShowText(args[0].getString()); +} + +void Gfx::opMoveShowText(Object args[], int numArgs) { + double tx, ty; + + if (!state->getFont()) { + error(getPos(), "No font in move/show"); + return; + } + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); + doShowText(args[0].getString()); +} + +void Gfx::opMoveSetShowText(Object args[], int numArgs) { + double tx, ty; + + if (!state->getFont()) { + error(getPos(), "No font in move/set/show"); + return; + } + state->setWordSpace(args[0].getNum()); + state->setCharSpace(args[1].getNum()); + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateWordSpace(state); + out->updateCharSpace(state); + out->updateTextPos(state); + doShowText(args[2].getString()); +} + +void Gfx::opShowSpaceText(Object args[], int numArgs) { + Array *a; + Object obj; + int i; + + if (!state->getFont()) { + error(getPos(), "No font in show/space"); + return; + } + a = args[0].getArray(); + for (i = 0; i < a->getLength(); ++i) { + a->get(i, &obj); + if (obj.isNum()) { + state->textShift(-obj.getNum() * 0.001 * state->getFontSize()); + out->updateTextShift(state, obj.getNum()); + } else if (obj.isString()) { + doShowText(obj.getString()); + } else { + error(getPos(), "Element of show/space array must be number or string"); + } + obj.free(); + } +} + +void Gfx::doShowText(GString *s) { + GfxFont *font; + GfxFontEncoding16 *enc; + Guchar *p; + Guchar c8; + int c16; + GString *s16; + char s16a[2]; + int m, n; +#if 0 //~type3 + double dx, dy, width, height, w, h, x, y; + double oldCTM[6], newCTM[6]; + double *mat; + Object charProc; + Parser *oldParser; + int i; +#else + double dx, dy, width, height, w, h, sWidth, sHeight; +#endif + + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + font = state->getFont(); + + //----- 16-bit font + if (font->is16Bit()) { + enc = font->getEncoding16(); + if (out->useDrawChar()) { + out->beginString(state, s); + s16 = NULL; + } else { + s16 = new GString(); + } + sWidth = sHeight = 0; + state->textTransformDelta(0, state->getRise(), &dx, &dy); + p = (Guchar *)s->getCString(); + n = s->getLength(); + while (n > 0) { + m = getNextChar16(enc, p, &c16); + if (enc->wMode == 0) { + width = state->getFontSize() * state->getHorizScaling() * + font->getWidth16(c16) + + state->getCharSpace(); + if (c16 == ' ') { + width += state->getWordSpace(); + } + height = 0; + } else { + width = 0; + height = state->getFontSize() * font->getHeight16(c16); + } + state->textTransformDelta(width, height, &w, &h); + if (out->useDrawChar()) { + out->drawChar16(state, state->getCurX() + dx, state->getCurY() + dy, + w, h, c16); + state->textShift(width, height); + } else { + s16a[0] = (char)(c16 >> 8); + s16a[1] = (char)c16; + s16->append(s16a, 2); + sWidth += w; + sHeight += h; + } + n -= m; + p += m; + } + if (out->useDrawChar()) { + out->endString(state); + } else { + out->drawString16(state, s16); + delete s16; + state->textShift(sWidth, sHeight); + } + + //----- 8-bit font + } else { +#if 0 //~type3 + //~ also check out->renderType3() + if (font->getType() == fontType3) { + out->beginString(state, s); + mat = state->getCTM(); + for (i = 0; i < 6; ++i) { + oldCTM[i] = mat[i]; + } + mat = state->getTextMat(); + newCTM[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2]; + newCTM[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3]; + newCTM[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2]; + newCTM[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3]; + mat = font->getFontMatrix(); + newCTM[0] = mat[0] * newCTM[0] + mat[1] * newCTM[2]; + newCTM[1] = mat[0] * newCTM[1] + mat[1] * newCTM[3]; + newCTM[2] = mat[2] * newCTM[0] + mat[3] * newCTM[2]; + newCTM[3] = mat[2] * newCTM[1] + mat[3] * newCTM[3]; + newCTM[0] *= state->getFontSize(); + newCTM[3] *= state->getFontSize(); + newCTM[0] *= state->getHorizScaling(); + newCTM[2] *= state->getHorizScaling(); + state->textTransformDelta(0, state->getRise(), &dx, &dy); + oldParser = parser; + for (p = (Guchar *)s->getCString(), n = s->getLength(); n; ++p, --n) { + c8 = *p; + font->getCharProc(c8, &charProc); + state->transform(state->getCurX() + dx, state->getCurY() + dy, &x, &y); + state->setCTM(newCTM[0], newCTM[1], newCTM[2], newCTM[3], x, y); + //~ out->updateCTM(???) + if (charProc.isStream()) { + display(&charProc, gFalse); + } else { + error(getPos(), "Missing or bad Type3 CharProc entry"); + } + state->setCTM(oldCTM[0], oldCTM[1], oldCTM[2], + oldCTM[3], oldCTM[4], oldCTM[5]); + //~ out->updateCTM(???) - use gsave/grestore instead? + charProc.free(); + width = state->getFontSize() * state->getHorizScaling() * + font->getWidth(c8) + + state->getCharSpace(); + if (c8 == ' ') { + width += state->getWordSpace(); + } + state->textShift(width); + } + parser = oldParser; + out->endString(state); + } else +#endif + if (out->useDrawChar()) { + out->beginString(state, s); + state->textTransformDelta(0, state->getRise(), &dx, &dy); + for (p = (Guchar *)s->getCString(), n = s->getLength(); n; ++p, --n) { + c8 = *p; + width = state->getFontSize() * state->getHorizScaling() * + font->getWidth(c8) + + state->getCharSpace(); + if (c8 == ' ') + width += state->getWordSpace(); + state->textTransformDelta(width, 0, &w, &h); + out->drawChar(state, state->getCurX() + dx, state->getCurY() + dy, + w, h, c8); + state->textShift(width); + } + out->endString(state); + } else { + out->drawString(state, s); + width = state->getFontSize() * state->getHorizScaling() * + font->getWidth(s) + + s->getLength() * state->getCharSpace(); + for (p = (Guchar *)s->getCString(), n = s->getLength(); n; ++p, --n) { + if (*p == ' ') + width += state->getWordSpace(); + } + state->textShift(width); + } + } +} + +int Gfx::getNextChar16(GfxFontEncoding16 *enc, Guchar *p, int *c16) { + int n; + int code; + int a, b, m; + + n = enc->codeLen[*p]; + if (n == 1) { + *c16 = enc->map1[*p]; + } else { + code = (p[0] << 8) + p[1]; + a = 0; + b = enc->map2Len; + // invariant: map2[2*a] <= code < map2[2*b] + while (b - a > 1) { + m = (a + b) / 2; + if (enc->map2[2*m] <= code) + a = m; + else if (enc->map2[2*m] > code) + b = m; + else + break; + } + *c16 = enc->map2[2*a+1] + (code - enc->map2[2*a]); + } + return n; +} + +//------------------------------------------------------------------------ +// XObject operators +//------------------------------------------------------------------------ + +void Gfx::opXObject(Object args[], int numArgs) { + Object obj1, obj2, refObj; +#if OPI_SUPPORT + Object opiDict; +#endif + + if (!res->lookupXObject(args[0].getName(), &obj1)) { + return; + } + if (!obj1.isStream()) { + error(getPos(), "XObject '%s' is wrong type", args[0].getName()); + obj1.free(); + return; + } +#if OPI_SUPPORT + obj1.streamGetDict()->lookup("OPI", &opiDict); + if (opiDict.isDict()) { + out->opiBegin(state, opiDict.getDict()); + } +#endif + obj1.streamGetDict()->lookup("Subtype", &obj2); + if (obj2.isName("Image")) { + res->lookupXObjectNF(args[0].getName(), &refObj); + doImage(&refObj, obj1.getStream(), gFalse); + refObj.free(); + } else if (obj2.isName("Form")) { + doForm(&obj1); + } else if (obj2.isName()) { + error(getPos(), "Unknown XObject subtype '%s'", obj2.getName()); + } else { + error(getPos(), "XObject subtype is missing or wrong type"); + } + obj2.free(); +#if OPI_SUPPORT + if (opiDict.isDict()) { + out->opiEnd(state, opiDict.getDict()); + } + opiDict.free(); +#endif + obj1.free(); +} + +void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) { + Dict *dict; + Object obj1, obj2; + int width, height; + int bits; + GBool mask; + GfxColorSpace *colorSpace; + GfxImageColorMap *colorMap; + GBool invert; + + // get stream dict + dict = str->getDict(); + + // get size + dict->lookup("Width", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("W", &obj1); + } + if (!obj1.isInt()) + goto err2; + width = obj1.getInt(); + obj1.free(); + dict->lookup("Height", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("H", &obj1); + } + if (!obj1.isInt()) + goto err2; + height = obj1.getInt(); + obj1.free(); + + // image or mask? + dict->lookup("ImageMask", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("IM", &obj1); + } + mask = gFalse; + if (obj1.isBool()) + mask = obj1.getBool(); + else if (!obj1.isNull()) + goto err2; + obj1.free(); + + // bit depth + dict->lookup("BitsPerComponent", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("BPC", &obj1); + } + if (!obj1.isInt()) + goto err2; + bits = obj1.getInt(); + obj1.free(); + + // display a mask + if (mask) { + + // check for inverted mask + if (bits != 1) + goto err1; + invert = gFalse; + dict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("D", &obj1); + } + if (obj1.isArray()) { + obj1.arrayGet(0, &obj2); + if (obj2.isInt() && obj2.getInt() == 1) + invert = gTrue; + obj2.free(); + } else if (!obj1.isNull()) { + goto err2; + } + obj1.free(); + + // draw it + out->drawImageMask(state, ref, str, width, height, invert, inlineImg); + + } else { + + // get color space and color map + dict->lookup("ColorSpace", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("CS", &obj1); + } + if (obj1.isName()) { + res->lookupColorSpace(obj1.getName(), &obj2); + if (!obj2.isNull()) { + obj1.free(); + obj1 = obj2; + } else { + obj2.free(); + } + } + colorSpace = GfxColorSpace::parse(&obj1); + obj1.free(); + if (!colorSpace) { + goto err1; + } + dict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("D", &obj1); + } + colorMap = new GfxImageColorMap(bits, &obj1, colorSpace); + obj1.free(); + if (!colorMap->isOk()) { + delete colorMap; + goto err1; + } + + // draw it + out->drawImage(state, ref, str, width, height, colorMap, inlineImg); + delete colorMap; + str->close(); + } + + return; + + err2: + obj1.free(); + err1: + error(getPos(), "Bad image parameters"); +} + +void Gfx::doForm(Object *str) { + Dict *dict; + Object matrixObj, bboxObj; + double m[6], bbox[6]; + Object resObj; + Dict *resDict; + Object obj1; + int i; + + // get stream dict + dict = str->streamGetDict(); + + // check form type + dict->lookup("FormType", &obj1); + if (!(obj1.isInt() && obj1.getInt() == 1)) { + error(getPos(), "Unknown form type"); + } + obj1.free(); + + // get bounding box + dict->lookup("BBox", &bboxObj); + if (!bboxObj.isArray()) { + matrixObj.free(); + bboxObj.free(); + error(getPos(), "Bad form bounding box"); + return; + } + for (i = 0; i < 4; ++i) { + bboxObj.arrayGet(i, &obj1); + bbox[i] = obj1.getNum(); + obj1.free(); + } + bboxObj.free(); + + // get matrix + dict->lookup("Matrix", &matrixObj); + if (matrixObj.isArray()) { + for (i = 0; i < 6; ++i) { + matrixObj.arrayGet(i, &obj1); + m[i] = obj1.getNum(); + obj1.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + matrixObj.free(); + + // get resources + dict->lookup("Resources", &resObj); + resDict = resObj.isDict() ? resObj.getDict() : NULL; + + // draw it + doForm1(str, resDict, m, bbox); + + resObj.free(); +} + +void Gfx::doWidgetForm(Object *str, double xMin, double yMin, + double xMax, double yMax) { + Dict *dict, *resDict; + Object matrixObj, bboxObj, resObj; + Object obj1; + double m[6], bbox[6]; + double sx, sy; + int i; + + // get stream dict + dict = str->streamGetDict(); + + // get bounding box + dict->lookup("BBox", &bboxObj); + if (!bboxObj.isArray()) { + bboxObj.free(); + error(getPos(), "Bad form bounding box"); + return; + } + for (i = 0; i < 4; ++i) { + bboxObj.arrayGet(i, &obj1); + bbox[i] = obj1.getNum(); + obj1.free(); + } + bboxObj.free(); + + // get matrix + dict->lookup("Matrix", &matrixObj); + if (matrixObj.isArray()) { + for (i = 0; i < 6; ++i) { + matrixObj.arrayGet(i, &obj1); + m[i] = obj1.getNum(); + obj1.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + matrixObj.free(); + + // scale form bbox to widget rectangle + sx = fabs((xMax - xMin) / (bbox[2] - bbox[0])); + sy = fabs((yMax - yMin) / (bbox[3] - bbox[1])); + m[0] *= sx; m[1] *= sy; + m[2] *= sx; m[3] *= sy; + m[4] *= sx; m[5] *= sy; + + // translate to widget rectangle + m[4] += xMin; + m[5] += yMin; + + // get resources + dict->lookup("Resources", &resObj); + resDict = resObj.isDict() ? resObj.getDict() : NULL; + + // draw it + doForm1(str, resDict, m, bbox); + + resObj.free(); + bboxObj.free(); +} + +void Gfx::doForm1(Object *str, Dict *resDict, double *matrix, double *bbox) { + Parser *oldParser; + double oldBaseMatrix[6]; + GfxResources *resPtr; + int i; + + // push new resources on stack + res = new GfxResources(resDict, res); + + // save current graphics state + out->saveState(state); + state = state->save(); + + // save current parser + oldParser = parser; + + // set form transformation matrix + state->concatCTM(matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5]); + out->updateCTM(state, matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5]); + + // set new base matrix + for (i = 0; i < 6; ++i) { + oldBaseMatrix[i] = baseMatrix[i]; + baseMatrix[i] = state->getCTM()[i]; + } + + // set form bounding box + state->moveTo(bbox[0], bbox[1]); + state->lineTo(bbox[2], bbox[1]); + state->lineTo(bbox[2], bbox[3]); + state->lineTo(bbox[0], bbox[3]); + state->closePath(); + out->clip(state); + state->clearPath(); + + // draw the form + display(str, gFalse); + + // restore base matrix + for (i = 0; i < 6; ++i) { + baseMatrix[i] = oldBaseMatrix[i]; + } + + // restore parser + parser = oldParser; + + // restore graphics state + state = state->restore(); + out->restoreState(state); + + // pop resource stack + resPtr = res->getNext(); + delete res; + res = resPtr; + + return; +} + +//------------------------------------------------------------------------ +// in-line image operators +//------------------------------------------------------------------------ + +void Gfx::opBeginImage(Object args[], int numArgs) { + Stream *str; + int c1, c2; + + // build dict/stream + str = buildImageStream(); + + // display the image + if (str) { + doImage(NULL, str, gTrue); + + // skip 'EI' tag + c1 = str->getBaseStream()->getChar(); + c2 = str->getBaseStream()->getChar(); + while (!(c1 == 'E' && c2 == 'I') && c2 != EOF) { + c1 = c2; + c2 = str->getBaseStream()->getChar(); + } + delete str; + } +} + +Stream *Gfx::buildImageStream() { + Object dict; + Object obj; + char *key; + Stream *str; + + // build dictionary + dict.initDict(); + parser->getObj(&obj); + while (!obj.isCmd("ID") && !obj.isEOF()) { + if (!obj.isName()) { + error(getPos(), "Inline image dictionary key must be a name object"); + obj.free(); + parser->getObj(&obj); + } else { + key = copyString(obj.getName()); + obj.free(); + parser->getObj(&obj); + if (obj.isEOF() || obj.isError()) + break; + dict.dictAdd(key, &obj); + } + parser->getObj(&obj); + } + if (obj.isEOF()) + error(getPos(), "End of file in inline image"); + obj.free(); + + // make stream + str = new EmbedStream(parser->getStream(), &dict); + str = str->addFilters(&dict); + + return str; +} + +void Gfx::opImageData(Object args[], int numArgs) { + error(getPos(), "Internal: got 'ID' operator"); +} + +void Gfx::opEndImage(Object args[], int numArgs) { + error(getPos(), "Internal: got 'EI' operator"); +} + +//------------------------------------------------------------------------ +// type 3 font operators +//------------------------------------------------------------------------ + +void Gfx::opSetCharWidth(Object args[], int numArgs) { + error(getPos(), "Encountered 'd0' operator in content stream"); +} + +void Gfx::opSetCacheDevice(Object args[], int numArgs) { + error(getPos(), "Encountered 'd1' operator in content stream"); +} + +//------------------------------------------------------------------------ +// compatibility operators +//------------------------------------------------------------------------ + +void Gfx::opBeginIgnoreUndef(Object args[], int numArgs) { + ++ignoreUndef; +} + +void Gfx::opEndIgnoreUndef(Object args[], int numArgs) { + if (ignoreUndef > 0) + --ignoreUndef; +} + +//------------------------------------------------------------------------ +// marked content operators +//------------------------------------------------------------------------ + +void Gfx::opBeginMarkedContent(Object args[], int numArgs) { + if (printCommands) { + printf(" marked content: %s ", args[0].getName()); + if (numArgs == 2) + args[2].print(stdout); + printf("\n"); + } +} + +void Gfx::opEndMarkedContent(Object args[], int numArgs) { +} + +void Gfx::opMarkPoint(Object args[], int numArgs) { + if (printCommands) { + printf(" mark point: %s ", args[0].getName()); + if (numArgs == 2) + args[2].print(stdout); + printf("\n"); + } +} diff --git a/pdf2swf/xpdf/Gfx.h b/pdf2swf/xpdf/Gfx.h new file mode 100644 index 00000000..34d8f992 --- /dev/null +++ b/pdf2swf/xpdf/Gfx.h @@ -0,0 +1,234 @@ +//======================================================================== +// +// Gfx.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef GFX_H +#define GFX_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "gtypes.h" + +class GString; +class Array; +class Stream; +class Parser; +class Dict; +class OutputDev; +class GfxFontDict; +class GfxFont; +struct GfxFontEncoding16; +class GfxPattern; +class GfxState; +class Gfx; + +//------------------------------------------------------------------------ +// Gfx +//------------------------------------------------------------------------ + +enum GfxClipType { + clipNone, + clipNormal, + clipEO +}; + +enum TchkType { + tchkBool, // boolean + tchkInt, // integer + tchkNum, // number (integer or real) + tchkString, // string + tchkName, // name + tchkArray, // array + tchkProps, // properties (dictionary or name) + tchkSCN, // scn/SCN args (number of name) + tchkNone // used to avoid empty initializer lists +}; + +#define maxArgs 8 + +struct Operator { + char name[4]; + int numArgs; + TchkType tchk[maxArgs]; + void (Gfx::*func)(Object args[], int numArgs); +}; + +class GfxResources { +public: + + GfxResources(Dict *resDict, GfxResources *next); + ~GfxResources(); + + GfxFont *lookupFont(char *name); + GBool lookupXObject(char *name, Object *obj); + GBool lookupXObjectNF(char *name, Object *obj); + void lookupColorSpace(char *name, Object *obj); + GfxPattern *lookupPattern(char *name); + GBool lookupGState(char *name, Object *obj); + + GfxResources *getNext() { return next; } + +private: + + GfxFontDict *fonts; + Object xObjDict; + Object colorSpaceDict; + Object patternDict; + Object gStateDict; + GfxResources *next; +}; + +class Gfx { +public: + + // Constructor for regular output. + Gfx(OutputDev *out1, int pageNum, Dict *resDict, + double dpi, double x1, double y1, double x2, double y2, GBool crop, + double cropX1, double cropY1, double cropX2, double cropY2, + int rotate); + + // Destructor. + ~Gfx(); + + // Interpret a stream or array of streams. + void display(Object *obj, GBool topLevel = gTrue); + + void doWidgetForm(Object *str, double xMin, double yMin, + double xMax, double yMax); + +private: + + OutputDev *out; // output device + GfxResources *res; // resource stack + + GfxState *state; // current graphics state + GBool fontChanged; // set if font or text matrix has changed + GfxClipType clip; // do a clip? + int ignoreUndef; // current BX/EX nesting level + double baseMatrix[6]; // default matrix for most recent + // page/form/pattern + + Parser *parser; // parser for page content stream(s) + + static Operator opTab[]; // table of operators + + void go(GBool topLevel); + void execOp(Object *cmd, Object args[], int numArgs); + Operator *findOp(char *name); + GBool checkArg(Object *arg, TchkType type); + int getPos(); + + // graphics state operators + void opSave(Object args[], int numArgs); + void opRestore(Object args[], int numArgs); + void opConcat(Object args[], int numArgs); + void opSetDash(Object args[], int numArgs); + void opSetFlat(Object args[], int numArgs); + void opSetLineJoin(Object args[], int numArgs); + void opSetLineCap(Object args[], int numArgs); + void opSetMiterLimit(Object args[], int numArgs); + void opSetLineWidth(Object args[], int numArgs); + void opSetExtGState(Object args[], int numArgs); + void opSetRenderingIntent(Object args[], int numArgs); + + // color operators + void opSetFillGray(Object args[], int numArgs); + void opSetStrokeGray(Object args[], int numArgs); + void opSetFillCMYKColor(Object args[], int numArgs); + void opSetStrokeCMYKColor(Object args[], int numArgs); + void opSetFillRGBColor(Object args[], int numArgs); + void opSetStrokeRGBColor(Object args[], int numArgs); + void opSetFillColorSpace(Object args[], int numArgs); + void opSetStrokeColorSpace(Object args[], int numArgs); + void opSetFillColor(Object args[], int numArgs); + void opSetStrokeColor(Object args[], int numArgs); + void opSetFillColorN(Object args[], int numArgs); + void opSetStrokeColorN(Object args[], int numArgs); + + // path segment operators + void opMoveTo(Object args[], int numArgs); + void opLineTo(Object args[], int numArgs); + void opCurveTo(Object args[], int numArgs); + void opCurveTo1(Object args[], int numArgs); + void opCurveTo2(Object args[], int numArgs); + void opRectangle(Object args[], int numArgs); + void opClosePath(Object args[], int numArgs); + + // path painting operators + void opEndPath(Object args[], int numArgs); + void opStroke(Object args[], int numArgs); + void opCloseStroke(Object args[], int numArgs); + void opFill(Object args[], int numArgs); + void opEOFill(Object args[], int numArgs); + void opFillStroke(Object args[], int numArgs); + void opCloseFillStroke(Object args[], int numArgs); + void opEOFillStroke(Object args[], int numArgs); + void opCloseEOFillStroke(Object args[], int numArgs); + void opShFill(Object args[], int numArgs); + void doPatternFill(GBool eoFill); + void doEndPath(); + + // path clipping operators + void opClip(Object args[], int numArgs); + void opEOClip(Object args[], int numArgs); + + // text object operators + void opBeginText(Object args[], int numArgs); + void opEndText(Object args[], int numArgs); + + // text state operators + void opSetCharSpacing(Object args[], int numArgs); + void opSetFont(Object args[], int numArgs); + void opSetTextLeading(Object args[], int numArgs); + void opSetTextRender(Object args[], int numArgs); + void opSetTextRise(Object args[], int numArgs); + void opSetWordSpacing(Object args[], int numArgs); + void opSetHorizScaling(Object args[], int numArgs); + + // text positioning operators + void opTextMove(Object args[], int numArgs); + void opTextMoveSet(Object args[], int numArgs); + void opSetTextMatrix(Object args[], int numArgs); + void opTextNextLine(Object args[], int numArgs); + + // text string operators + void opShowText(Object args[], int numArgs); + void opMoveShowText(Object args[], int numArgs); + void opMoveSetShowText(Object args[], int numArgs); + void opShowSpaceText(Object args[], int numArgs); + void doShowText(GString *s); + int getNextChar16(GfxFontEncoding16 *enc, Guchar *p, int *c16); + + // XObject operators + void opXObject(Object args[], int numArgs); + void doImage(Object *ref, Stream *str, GBool inlineImg); + void doForm(Object *str); + void doForm1(Object *str, Dict *resDict, double *matrix, double *bbox); + + // in-line image operators + void opBeginImage(Object args[], int numArgs); + Stream *buildImageStream(); + void opImageData(Object args[], int numArgs); + void opEndImage(Object args[], int numArgs); + + // type 3 font operators + void opSetCharWidth(Object args[], int numArgs); + void opSetCacheDevice(Object args[], int numArgs); + + // compatibility operators + void opBeginIgnoreUndef(Object args[], int numArgs); + void opEndIgnoreUndef(Object args[], int numArgs); + + // marked content operators + void opBeginMarkedContent(Object args[], int numArgs); + void opEndMarkedContent(Object args[], int numArgs); + void opMarkPoint(Object args[], int numArgs); +}; + +#endif diff --git a/pdf2swf/xpdf/GfxFont.cc b/pdf2swf/xpdf/GfxFont.cc new file mode 100644 index 00000000..16b311b3 --- /dev/null +++ b/pdf2swf/xpdf/GfxFont.cc @@ -0,0 +1,1018 @@ +//======================================================================== +// +// GfxFont.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "GString.h" +#include "gmem.h" +#include "gfile.h" +#include "config.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Error.h" +#include "Params.h" +#include "FontFile.h" +#include "GfxFont.h" + +#include "FontInfo.h" +#if JAPANESE_SUPPORT +#include "Japan12CMapInfo.h" +#endif +#if CHINESE_GB_SUPPORT +#include "GB12CMapInfo.h" +#endif +#if CHINESE_CNS_SUPPORT +#include "CNS13CMapInfo.h" +#endif + +//------------------------------------------------------------------------ + +static int CDECL cmpWidthExcep(const void *w1, const void *w2); +static int CDECL cmpWidthExcepV(const void *w1, const void *w2); + +//------------------------------------------------------------------------ + +static Gushort *defCharWidths[12] = { + courierWidths, + courierObliqueWidths, + courierBoldWidths, + courierBoldObliqueWidths, + helveticaWidths, + helveticaObliqueWidths, + helveticaBoldWidths, + helveticaBoldObliqueWidths, + timesRomanWidths, + timesItalicWidths, + timesBoldWidths, + timesBoldItalicWidths +}; + +//------------------------------------------------------------------------ +// GfxFont +//------------------------------------------------------------------------ + +GfxFont::GfxFont(char *tag1, Ref id1, Dict *fontDict) { + BuiltinFont *builtinFont; + Object obj1, obj2, obj3, obj4; + int missingWidth; + char *name2, *p; + int i; + + // get font tag and ID + tag = new GString(tag1); + id = id1; + + // get font type + type = fontUnknownType; + fontDict->lookup("Subtype", &obj1); + if (obj1.isName("Type1")) + type = fontType1; + else if (obj1.isName("Type1C")) + type = fontType1C; + else if (obj1.isName("Type3")) + type = fontType3; + else if (obj1.isName("TrueType")) + type = fontTrueType; + else if (obj1.isName("Type0")) + type = fontType0; + obj1.free(); + is16 = gFalse; + + // get base font name + name = NULL; + fontDict->lookup("BaseFont", &obj1); + if (obj1.isName()) + name = new GString(obj1.getName()); + obj1.free(); + + // Newer Adobe tools are using Base14-compatible TrueType fonts + // without embedding them, so munge the names into the equivalent + // PostScript names. This is a kludge -- it would be nice if Adobe + // followed their own spec. + if (type == fontTrueType) { + p = name->getCString(); + name2 = NULL; + if (!strncmp(p, "Arial", 5)) { + if (!strcmp(p+5, ",Bold")) { + name2 = "Helvetica-Bold"; + } else if (!strcmp(p+5, ",Italic")) { + name2 = "Helvetica-Oblique"; + } else if (!strcmp(p+5, ",BoldItalic")) { + name2 = "Helvetica-BoldOblique"; + } else { + name2 = "Helvetica"; + } + } else if (!strncmp(p, "TimesNewRoman", 13)) { + if (!strcmp(p+13, ",Bold")) { + name2 = "Times-Bold"; + } else if (!strcmp(p+13, ",Italic")) { + name2 = "Times-Italic"; + } else if (!strcmp(p+13, ",BoldItalic")) { + name2 = "Times-BoldItalic"; + } else { + name2 = "Times-Roman"; + } + } else if (!strncmp(p, "CourierNew", 10)) { + if (!strcmp(p+10, ",Bold")) { + name2 = "Courier-Bold"; + } else if (!strcmp(p+10, ",Italic")) { + name2 = "Courier-Oblique"; + } else if (!strcmp(p+10, ",BoldItalic")) { + name2 = "Courier-BoldOblique"; + } else { + name2 = "Courier"; + } + } + if (name2) { + delete name; + name = new GString(name2); + } + } + + // is it a built-in font? + builtinFont = NULL; + if (name) { + for (i = 0; i < numBuiltinFonts; ++i) { + if (!strcmp(builtinFonts[i].name, name->getCString())) { + builtinFont = &builtinFonts[i]; + break; + } + } + } + + // assume Times-Roman by default (for substitution purposes) + flags = fontSerif; + + // get info from font descriptor + embFontName = NULL; + embFontID.num = -1; + embFontID.gen = -1; + missingWidth = 0; + fontDict->lookup("FontDescriptor", &obj1); + if (obj1.isDict()) { + + // get flags + obj1.dictLookup("Flags", &obj2); + if (obj2.isInt()) + flags = obj2.getInt(); + obj2.free(); + + // get name + obj1.dictLookup("FontName", &obj2); + if (obj2.isName()) + embFontName = new GString(obj2.getName()); + obj2.free(); + + // look for embedded font file + if (type == fontType1) { + obj1.dictLookupNF("FontFile", &obj2); + if (obj2.isRef()) + embFontID = obj2.getRef(); + obj2.free(); + } + if (embFontID.num == -1 && type == fontTrueType) { + obj1.dictLookupNF("FontFile2", &obj2); + if (obj2.isRef()) + embFontID = obj2.getRef(); + obj2.free(); + } + if (embFontID.num == -1) { + obj1.dictLookupNF("FontFile3", &obj2); + if (obj2.isRef()) { + embFontID = obj2.getRef(); + obj2.fetch(&obj3); + if (obj3.isStream()) { + obj3.streamGetDict()->lookup("Subtype", &obj4); + if (obj4.isName("Type1")) + type = fontType1; + else if (obj4.isName("Type1C")) + type = fontType1C; + else if (obj4.isName("Type3")) + type = fontType3; + else if (obj4.isName("TrueType")) + type = fontTrueType; + else if (obj4.isName("Type0")) + type = fontType0; + obj4.free(); + } + obj3.free(); + } + obj2.free(); + } + + // look for MissingWidth + obj1.dictLookup("MissingWidth", &obj2); + if (obj2.isInt()) { + missingWidth = obj2.getInt(); + } + obj2.free(); + } + obj1.free(); + + // get Type3 font definition + if (type == fontType3) { + fontDict->lookup("CharProcs", &charProcs); + if (!charProcs.isDict()) { + error(-1, "Missing or invalid CharProcs dictionary in Type 3 font"); + charProcs.free(); + } + } + + // look for an external font file + extFontFile = NULL; + if (type == fontType1 && name) + findExtFontFile(); + + // get font matrix + fontMat[0] = fontMat[3] = 1; + fontMat[1] = fontMat[2] = fontMat[4] = fontMat[5] = 0; + if (fontDict->lookup("FontMatrix", &obj1)->isArray()) { + for (i = 0; i < 6 && i < obj1.arrayGetLength(); ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) + fontMat[i] = obj2.getNum(); + obj2.free(); + } + } + obj1.free(); + + // get encoding and character widths + if (type == fontType0) { + getType0EncAndWidths(fontDict); + } else { + getEncAndWidths(fontDict, builtinFont, missingWidth); + } +} + +GfxFont::~GfxFont() { + delete tag; + if (name) { + delete name; + } + if (!is16 && encoding) { + delete encoding; + } + if (embFontName) { + delete embFontName; + } + if (extFontFile) { + delete extFontFile; + } + if (charProcs.isDict()) { + charProcs.free(); + } + if (is16) { + gfree(widths16.exceps); + gfree(widths16.excepsV); + } +} + +double GfxFont::getWidth(GString *s) { + double w; + int i; + + w = 0; + for (i = 0; i < s->getLength(); ++i) + w += widths[s->getChar(i) & 0xff]; + return w; +} + +double GfxFont::getWidth16(int c) { + double w; + int a, b, m; + + w = widths16.defWidth; + a = -1; + b = widths16.numExceps; + // invariant: widths16.exceps[a].last < c < widths16.exceps[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths16.exceps[m].last < c) { + a = m; + } else if (c < widths16.exceps[m].first) { + b = m; + } else { + w = widths16.exceps[m].width; + break; + } + } + return w; +} + +double GfxFont::getHeight16(int c) { + double h; + int a, b, m; + + h = widths16.defHeight; + a = -1; + b = widths16.numExcepsV; + // invariant: widths16.excepsV[a].last < c < widths16.excepsV[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths16.excepsV[m].last < c) { + a = m; + } else if (c < widths16.excepsV[m].first) { + b = m; + } else { + h = widths16.excepsV[m].height; + break; + } + } + return h; +} + +double GfxFont::getOriginX16(int c) { + double vx; + int a, b, m; + + vx = widths16.defWidth / 2; + a = -1; + b = widths16.numExcepsV; + // invariant: widths16.excepsV[a].last < c < widths16.excepsV[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths16.excepsV[m].last < c) { + a = m; + } else if (c < widths16.excepsV[m].first) { + b = m; + } else { + vx = widths16.excepsV[m].vx; + break; + } + } + return vx; +} + +double GfxFont::getOriginY16(int c) { + double vy; + int a, b, m; + + vy = widths16.defVY; + a = -1; + b = widths16.numExcepsV; + // invariant: widths16.excepsV[a].last < c < widths16.excepsV[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths16.excepsV[m].last < c) { + a = m; + } else if (c < widths16.excepsV[m].first) { + b = m; + } else { + vy = widths16.excepsV[m].vy; + break; + } + } + return vy; +} + +Object *GfxFont::getCharProc(int code, Object *proc) { + if (charProcs.isDict()) { + charProcs.dictLookup(encoding->getCharName(code), proc); + } else { + proc->initNull(); + } + return proc; +} + +void GfxFont::getEncAndWidths(Dict *fontDict, BuiltinFont *builtinFont, + int missingWidth) { + Object obj1, obj2, obj3; + char *buf; + int len; + FontFile *fontFile; + int code, i; + + // Encodings start with a base encoding, which can come from + // (in order of priority): + // 1. FontDict.Encoding or FontDict.Encoding.BaseEncoding + // - MacRoman / WinAnsi / Standard + // 2. embedded font file + // 3. default: + // - builtin --> builtin encoding + // - TrueType --> MacRomanEncoding + // - others --> StandardEncoding + // and then add a list of differences from + // FontDict.Encoding.Differences. + + // check FontDict for base encoding + encoding = NULL; + fontDict->lookup("Encoding", &obj1); + if (obj1.isDict()) { + obj1.dictLookup("BaseEncoding", &obj2); + if (obj2.isName("MacRomanEncoding")) { + encoding = macRomanEncoding.copy(); + } else if (obj2.isName("WinAnsiEncoding")) { + encoding = winAnsiEncoding.copy(); + } else if (obj2.isName("StandardEncoding")) { + encoding = standardEncoding.copy(); + } + obj2.free(); + } else if (obj1.isName("MacRomanEncoding")) { + encoding = macRomanEncoding.copy(); + } else if (obj1.isName("WinAnsiEncoding")) { + encoding = winAnsiEncoding.copy(); + } else if (obj1.isName("StandardEncoding")) { + encoding = standardEncoding.copy(); + } + obj1.free(); + + // check embedded or external font file for base encoding + if ((type == fontType1 || type == fontType1C) && + (extFontFile || embFontID.num >= 0)) { + if (extFontFile) + buf = readExtFontFile(&len); + else + buf = readEmbFontFile(&len); + if (buf) { + if (type == fontType1) + fontFile = new Type1FontFile(buf, len); + else + fontFile = new Type1CFontFile(buf, len); + if (fontFile->getName()) { + if (embFontName) + delete embFontName; + embFontName = new GString(fontFile->getName()); + } + if (!encoding) + encoding = fontFile->getEncoding(gTrue); + delete fontFile; + gfree(buf); + } + } + + // get default base encoding + if (!encoding) { + if (builtinFont) + encoding = builtinFont->encoding->copy(); + else if (type == fontTrueType) + encoding = macRomanEncoding.copy(); + else + encoding = standardEncoding.copy(); + } + + // merge differences into encoding + fontDict->lookup("Encoding", &obj1); + if (obj1.isDict()) { + obj1.dictLookup("Differences", &obj2); + if (obj2.isArray()) { + code = 0; + for (i = 0; i < obj2.arrayGetLength(); ++i) { + obj2.arrayGet(i, &obj3); + if (obj3.isInt()) { + code = obj3.getInt(); + } else if (obj3.isName()) { + if (code < 256) + encoding->addChar(code, copyString(obj3.getName())); + ++code; + } else { + error(-1, "Wrong type in font encoding resource differences (%s)", + obj3.getTypeName()); + } + obj3.free(); + } + } + obj2.free(); + } + obj1.free(); + + // get character widths + if (builtinFont) + makeWidths(fontDict, builtinFont->encoding, builtinFont->widths, + missingWidth); + else + makeWidths(fontDict, NULL, NULL, missingWidth); +} + +void GfxFont::findExtFontFile() { + char **path; + FILE *f; + + for (path = fontPath; *path; ++path) { + extFontFile = appendToPath(new GString(*path), name->getCString()); + f = fopen(extFontFile->getCString(), "rb"); + if (!f) { + extFontFile->append(".pfb"); + f = fopen(extFontFile->getCString(), "rb"); + } + if (!f) { + extFontFile->del(extFontFile->getLength() - 4, 4); + extFontFile->append(".pfa"); + f = fopen(extFontFile->getCString(), "rb"); + } + if (f) { + fclose(f); + break; + } + delete extFontFile; + extFontFile = NULL; + } +} + +char *GfxFont::readExtFontFile(int *len) { + FILE *f; + char *buf; + + if (!(f = fopen(extFontFile->getCString(), "rb"))) { + error(-1, "Internal: external font file '%s' vanished", extFontFile); + return NULL; + } + fseek(f, 0, SEEK_END); + *len = (int)ftell(f); + fseek(f, 0, SEEK_SET); + buf = (char *)gmalloc(*len); + if ((int)fread(buf, 1, *len, f) != *len) + error(-1, "Error reading external font file '%s'", extFontFile); + fclose(f); + return buf; +} + +char *GfxFont::readEmbFontFile(int *len) { + char *buf; + Object obj1, obj2; + Stream *str; + int c; + int size, i; + + obj1.initRef(embFontID.num, embFontID.gen); + obj1.fetch(&obj2); + if (!obj2.isStream()) { + error(-1, "Embedded font file is not a stream"); + obj2.free(); + obj1.free(); + embFontID.num = -1; + return NULL; + } + str = obj2.getStream(); + + buf = NULL; + i = size = 0; + str->reset(); + while ((c = str->getChar()) != EOF) { + if (i == size) { + size += 4096; + buf = (char *)grealloc(buf, size); + } + buf[i++] = c; + } + *len = i; + str->close(); + + obj2.free(); + obj1.free(); + + return buf; +} + +void GfxFont::makeWidths(Dict *fontDict, FontEncoding *builtinEncoding, + Gushort *builtinWidths, int missingWidth) { + Object obj1, obj2; + int firstChar, lastChar; + int code, code2; + char *charName; + Gushort *defWidths; + int index; + double mult; + + // initialize all widths + for (code = 0; code < 256; ++code) { + widths[code] = missingWidth * 0.001; + } + + // use widths from built-in font + if (builtinEncoding) { + code2 = 0; // to make gcc happy + for (code = 0; code < 256; ++code) { + if ((charName = encoding->getCharName(code)) && + (code2 = builtinEncoding->getCharCode(charName)) >= 0) + widths[code] = builtinWidths[code2] * 0.001; + } + + // get widths from font dict + } else { + fontDict->lookup("FirstChar", &obj1); + firstChar = obj1.isInt() ? obj1.getInt() : 0; + obj1.free(); + fontDict->lookup("LastChar", &obj1); + lastChar = obj1.isInt() ? obj1.getInt() : 255; + obj1.free(); + if (type == fontType3) + mult = fontMat[0]; + else + mult = 0.001; + fontDict->lookup("Widths", &obj1); + if (obj1.isArray()) { + for (code = firstChar; code <= lastChar; ++code) { + obj1.arrayGet(code - firstChar, &obj2); + if (obj2.isNum()) + widths[code] = obj2.getNum() * mult; + obj2.free(); + } + } else { + + // couldn't find widths -- use defaults +#if 0 //~ + //~ certain PDF generators apparently don't include widths + //~ for Arial and TimesNewRoman -- and this error message + //~ is a nuisance + error(-1, "No character widths resource for non-builtin font"); +#endif + if (isFixedWidth()) + index = 0; + else if (isSerif()) + index = 8; + else + index = 4; + if (isBold()) + index += 2; + if (isItalic()) + index += 1; + defWidths = defCharWidths[index]; + code2 = 0; // to make gcc happy + for (code = 0; code < 256; ++code) { + if ((charName = encoding->getCharName(code)) && + (code2 = standardEncoding.getCharCode(charName)) >= 0) + widths[code] = defWidths[code2] * 0.001; + } + } + obj1.free(); + } +} + +void GfxFont::getType0EncAndWidths(Dict *fontDict) { + Object obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8; + int excepsSize; + int i, j, k, n; + + widths16.exceps = NULL; + widths16.excepsV = NULL; + + // get the CIDFont + fontDict->lookup("DescendantFonts", &obj1); + if (!obj1.isArray() || obj1.arrayGetLength() != 1) { + error(-1, "Bad DescendantFonts entry for Type 0 font"); + goto err1; + } + obj1.arrayGet(0, &obj2); + if (!obj2.isDict()) { + error(-1, "Bad descendant font of Type 0 font"); + goto err2; + } + + // get font info + obj2.dictLookup("CIDSystemInfo", &obj3); + if (!obj3.isDict()) { + error(-1, "Bad CIDSystemInfo in Type 0 font descendant"); + goto err3; + } + obj3.dictLookup("Registry", &obj4); + obj3.dictLookup("Ordering", &obj5); + if (obj4.isString() && obj5.isString()) { + if (obj4.getString()->cmp("Adobe") == 0 && + obj5.getString()->cmp("Japan1") == 0) { +#if JAPANESE_SUPPORT + is16 = gTrue; + enc16.charSet = font16AdobeJapan12; +#else + error(-1, "Xpdf was compiled without Japanese font support"); + goto err4; +#endif + } else if (obj4.getString()->cmp("Adobe") == 0 && + obj5.getString()->cmp("GB1") == 0) { +#if CHINESE_GB_SUPPORT + is16 = gTrue; + enc16.charSet = font16AdobeGB12; +#else + error(-1, "Xpdf was compiled without Chinese GB font support"); + goto err4; +#endif + } else if (obj4.getString()->cmp("Adobe") == 0 && + obj5.getString()->cmp("CNS1") == 0) { +#if CHINESE_CNS_SUPPORT + is16 = gTrue; + enc16.charSet = font16AdobeCNS13; +#else + error(-1, "Xpdf was compiled without Chinese CNS font support"); + goto err4; +#endif + } else { + error(-1, "Uknown Type 0 character set: %s-%s", + obj4.getString()->getCString(), obj5.getString()->getCString()); + goto err4; + } + } else { + error(-1, "Unknown Type 0 character set"); + goto err4; + } + obj5.free(); + obj4.free(); + obj3.free(); + + // get default char width + obj2.dictLookup("DW", &obj3); + if (obj3.isInt()) + widths16.defWidth = obj3.getInt() * 0.001; + else + widths16.defWidth = 1.0; + obj3.free(); + + // get default char metrics for vertical font + obj2.dictLookup("DW2", &obj3); + widths16.defVY = 0.880; + widths16.defHeight = -1; + if (obj3.isArray() && obj3.arrayGetLength() == 2) { + obj3.arrayGet(0, &obj4); + if (obj4.isInt()) { + widths16.defVY = obj4.getInt() * 0.001; + } + obj4.free(); + obj3.arrayGet(1, &obj4); + if (obj4.isInt()) { + widths16.defHeight = obj4.getInt() * 0.001; + } + obj4.free(); + } + obj3.free(); + + // get char width exceptions + widths16.exceps = NULL; + widths16.numExceps = 0; + obj2.dictLookup("W", &obj3); + if (obj3.isArray()) { + excepsSize = 0; + k = 0; + i = 0; + while (i+1 < obj3.arrayGetLength()) { + obj3.arrayGet(i, &obj4); + obj3.arrayGet(i+1, &obj5); + if (obj4.isInt() && obj5.isInt()) { + obj3.arrayGet(i+2, &obj6); + if (!obj6.isNum()) { + error(-1, "Bad widths array in Type 0 font"); + obj6.free(); + obj5.free(); + obj4.free(); + break; + } + if (k == excepsSize) { + excepsSize += 16; + widths16.exceps = (GfxFontWidthExcep *) + grealloc(widths16.exceps, + excepsSize * sizeof(GfxFontWidthExcep)); + } + widths16.exceps[k].first = obj4.getInt(); + widths16.exceps[k].last = obj5.getInt(); + widths16.exceps[k].width = obj6.getNum() * 0.001; + obj6.free(); + ++k; + i += 3; + } else if (obj4.isInt() && obj5.isArray()) { + if (k + obj5.arrayGetLength() >= excepsSize) { + excepsSize = (k + obj5.arrayGetLength() + 15) & ~15; + widths16.exceps = (GfxFontWidthExcep *) + grealloc(widths16.exceps, + excepsSize * sizeof(GfxFontWidthExcep)); + } + n = obj4.getInt(); + for (j = 0; j < obj5.arrayGetLength(); ++j) { + obj5.arrayGet(j, &obj6); + if (!obj6.isNum()) { + error(-1, "Bad widths array in Type 0 font"); + obj6.free(); + break; + } + widths16.exceps[k].first = widths16.exceps[k].last = n++; + widths16.exceps[k].width = obj6.getNum() * 0.001; + obj6.free(); + ++k; + } + i += 2; + } else { + error(-1, "Bad widths array in Type 0 font"); + obj6.free(); + obj5.free(); + obj4.free(); + break; + } + obj5.free(); + obj4.free(); + } + widths16.numExceps = k; + if (k > 0) + qsort(widths16.exceps, k, sizeof(GfxFontWidthExcep), &cmpWidthExcep); + } + obj3.free(); + + // get char metric exceptions for vertical font + widths16.excepsV = NULL; + widths16.numExcepsV = 0; + obj2.dictLookup("W2", &obj3); + if (obj3.isArray()) { + excepsSize = 0; + k = 0; + i = 0; + while (i+1 < obj3.arrayGetLength()) { + obj3.arrayGet(i, &obj4); + obj3.arrayGet(i+1, &obj5); + if (obj4.isInt() && obj5.isInt()) { + obj3.arrayGet(i+2, &obj6); + obj3.arrayGet(i+3, &obj7); + obj3.arrayGet(i+4, &obj8); + if (!obj6.isNum() || !obj7.isNum() || !obj8.isNum()) { + error(-1, "Bad widths (W2) array in Type 0 font"); + obj8.free(); + obj7.free(); + obj6.free(); + obj5.free(); + obj4.free(); + break; + } + if (k == excepsSize) { + excepsSize += 16; + widths16.excepsV = (GfxFontWidthExcepV *) + grealloc(widths16.excepsV, + excepsSize * sizeof(GfxFontWidthExcepV)); + } + widths16.excepsV[k].first = obj4.getInt(); + widths16.excepsV[k].last = obj5.getInt(); + widths16.excepsV[k].height = obj6.getNum() * 0.001; + widths16.excepsV[k].vx = obj7.getNum() * 0.001; + widths16.excepsV[k].vy = obj8.getNum() * 0.001; + obj8.free(); + obj7.free(); + obj6.free(); + ++k; + i += 5; + } else if (obj4.isInt() && obj5.isArray()) { + if (k + obj5.arrayGetLength() / 3 >= excepsSize) { + excepsSize = (k + obj5.arrayGetLength() / 3 + 15) & ~15; + widths16.excepsV = (GfxFontWidthExcepV *) + grealloc(widths16.excepsV, + excepsSize * sizeof(GfxFontWidthExcepV)); + } + n = obj4.getInt(); + for (j = 0; j < obj5.arrayGetLength(); j += 3) { + obj5.arrayGet(j, &obj6); + obj5.arrayGet(j+1, &obj7); + obj5.arrayGet(j+1, &obj8); + if (!obj6.isNum() || !obj7.isNum() || !obj8.isNum()) { + error(-1, "Bad widths (W2) array in Type 0 font"); + obj6.free(); + break; + } + widths16.excepsV[k].first = widths16.exceps[k].last = n++; + widths16.excepsV[k].height = obj6.getNum() * 0.001; + widths16.excepsV[k].vx = obj7.getNum() * 0.001; + widths16.excepsV[k].vy = obj8.getNum() * 0.001; + obj8.free(); + obj7.free(); + obj6.free(); + ++k; + } + i += 2; + } else { + error(-1, "Bad widths array in Type 0 font"); + obj5.free(); + obj4.free(); + break; + } + obj5.free(); + obj4.free(); + } + widths16.numExcepsV = k; + if (k > 0) { + qsort(widths16.excepsV, k, sizeof(GfxFontWidthExcepV), &cmpWidthExcepV); + } + } + obj3.free(); + + obj2.free(); + obj1.free(); + + // get encoding (CMap) + fontDict->lookup("Encoding", &obj1); + if (!obj1.isName()) { + error(-1, "Bad encoding for Type 0 font"); + goto err1; + } +#if JAPANESE_SUPPORT + if (enc16.charSet == font16AdobeJapan12) { + for (i = 0; gfxJapan12Tab[i].name; ++i) { + if (!strcmp(obj1.getName(), gfxJapan12Tab[i].name)) + break; + } + if (!gfxJapan12Tab[i].name) { + error(-1, "Unknown encoding '%s' for Adobe-Japan1-2 font", + obj1.getName()); + goto err1; + } + enc16.enc = gfxJapan12Tab[i].enc; + } +#endif +#if CHINESE_GB_SUPPORT + if (enc16.charSet == font16AdobeGB12) { + for (i = 0; gfxGB12Tab[i].name; ++i) { + if (!strcmp(obj1.getName(), gfxGB12Tab[i].name)) + break; + } + if (!gfxGB12Tab[i].name) { + error(-1, "Unknown encoding '%s' for Adobe-GB1-2 font", + obj1.getName()); + goto err1; + } + enc16.enc = gfxGB12Tab[i].enc; + } +#endif +#if CHINESE_CNS_SUPPORT + if (enc16.charSet == font16AdobeCNS13) { + for (i = 0; gfxCNS13Tab[i].name; ++i) { + if (!strcmp(obj1.getName(), gfxCNS13Tab[i].name)) + break; + } + if (!gfxCNS13Tab[i].name) { + error(-1, "Unknown encoding '%s' for Adobe-CNS1-3 font", + obj1.getName()); + goto err1; + } + enc16.enc = gfxCNS13Tab[i].enc; + } +#endif + obj1.free(); + + return; + + err4: + obj5.free(); + obj4.free(); + err3: + obj3.free(); + err2: + obj2.free(); + err1: + obj1.free(); + //~ fix this --> add 16-bit font support to FontFile + encoding = new FontEncoding(); + makeWidths(fontDict, NULL, NULL, 0); +} + +static int CDECL cmpWidthExcep(const void *w1, const void *w2) { + return ((GfxFontWidthExcep *)w1)->first - ((GfxFontWidthExcep *)w2)->first; +} + +static int CDECL cmpWidthExcepV(const void *w1, const void *w2) { + return ((GfxFontWidthExcepV *)w1)->first - ((GfxFontWidthExcepV *)w2)->first; +} + +//------------------------------------------------------------------------ +// GfxFontDict +//------------------------------------------------------------------------ + +GfxFontDict::GfxFontDict(Dict *fontDict) { + int i; + Object obj1, obj2; + + numFonts = fontDict->getLength(); + fonts = (GfxFont **)gmalloc(numFonts * sizeof(GfxFont *)); + for (i = 0; i < numFonts; ++i) { + fontDict->getValNF(i, &obj1); + obj1.fetch(&obj2); + if (obj1.isRef() && obj2.isDict()) { + fonts[i] = new GfxFont(fontDict->getKey(i), obj1.getRef(), + obj2.getDict()); + } else { + error(-1, "font resource is not a dictionary"); + fonts[i] = NULL; + } + obj1.free(); + obj2.free(); + } +} + +GfxFontDict::~GfxFontDict() { + int i; + + for (i = 0; i < numFonts; ++i) + delete fonts[i]; + gfree(fonts); +} + +GfxFont *GfxFontDict::lookup(char *tag) { + int i; + + for (i = 0; i < numFonts; ++i) { + if (fonts[i]->matches(tag)) + return fonts[i]; + } + return NULL; +} diff --git a/pdf2swf/xpdf/GfxFont.h b/pdf2swf/xpdf/GfxFont.h new file mode 100644 index 00000000..0435d90e --- /dev/null +++ b/pdf2swf/xpdf/GfxFont.h @@ -0,0 +1,240 @@ +//======================================================================== +// +// GfxFont.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef GFXFONT_H +#define GFXFONT_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "gtypes.h" +#include "GString.h" +#include "Object.h" +#include "FontEncoding.h" + +class Dict; +struct BuiltinFont; + +//------------------------------------------------------------------------ +// GfxFontCharSet16 +//------------------------------------------------------------------------ + +enum GfxFontCharSet16 { + font16AdobeJapan12, // Adobe-Japan1-2 + font16AdobeGB12, // Adobe-GB1-2 (Chinese) + font16AdobeCNS13 // Adobe-CNS1-3 (Chinese) +}; + +//------------------------------------------------------------------------ +// GfxFontEncoding16 +//------------------------------------------------------------------------ + +struct GfxFontEncoding16 { + int wMode; // writing mode (0=horizontal, 1=vertical) + Guchar codeLen[256]; // length of codes, in bytes, indexed by + // first byte of code + Gushort map1[256]; // one-byte code mapping: + // map1[code] --> 16-bit char selector + Gushort *map2; // two-byte code mapping + // map2[2*i] --> first code in range + // map2[2*i+1] --> 16-bit char selector + // for map2[2*i] + int map2Len; // length of map2 array (divided by 2) +}; + +//------------------------------------------------------------------------ +// GfxFontWidths16 +//------------------------------------------------------------------------ + +struct GfxFontWidthExcep { + int first; // this record applies to + int last; // chars .. + double width; // char width +}; + +struct GfxFontWidthExcepV { + int first; // this record applies to + int last; // chars .. + double height; // char height + double vx, vy; // origin position +}; + +struct GfxFontWidths16 { + double defWidth; // default char width + double defHeight; // default char height + double defVY; // default origin position + GfxFontWidthExcep *exceps; // exceptions + int numExceps; // number of valid entries in exceps + GfxFontWidthExcepV *excepsV; // exceptions for vertical font + int numExcepsV; // number of valid entries in excepsV +}; + +//------------------------------------------------------------------------ +// GfxFont +//------------------------------------------------------------------------ + +#define fontFixedWidth (1 << 0) +#define fontSerif (1 << 1) +#define fontSymbolic (1 << 2) +#define fontItalic (1 << 6) +#define fontBold (1 << 18) + +enum GfxFontType { + fontUnknownType, + fontType1, + fontType1C, + fontType3, + fontTrueType, + fontType0 +}; + +class GfxFont { +public: + + // Constructor. + GfxFont(char *tag1, Ref id1, Dict *fontDict); + + // Destructor. + ~GfxFont(); + + // Get font tag. + GString *getTag() { return tag; } + + // Get font dictionary ID. + Ref getID() { return id; } + + // Does this font match the tag? + GBool matches(char *tag1) { return !tag->cmp(tag1); } + + // Get base font name. + GString *getName() { return name; } + + // Get font type. + GfxFontType getType() { return type; } + + // Does this font use 16-bit characters? + GBool is16Bit() { return is16; } + + // Get embedded font ID, i.e., a ref for the font file stream. + // Returns false if there is no embedded font. + GBool getEmbeddedFontID(Ref *embID) + { *embID = embFontID; return embFontID.num >= 0; } + + // Get the PostScript font name for the embedded font. Returns + // NULL if there is no embedded font. + char *getEmbeddedFontName() + { return embFontName ? embFontName->getCString() : (char *)NULL; } + + // Get the name of the external font file. Returns NULL if there + // is no external font file. + GString *getExtFontFile() { return extFontFile; } + + // Get font descriptor flags. + GBool isFixedWidth() { return flags & fontFixedWidth; } + GBool isSerif() { return flags & fontSerif; } + GBool isSymbolic() { return flags & fontSymbolic; } + GBool isItalic() { return flags & fontItalic; } + GBool isBold() { return flags & fontBold; } + + // Get width of a character or string. + double getWidth(Guchar c) { return widths[c]; } + double getWidth(GString *s); + + // Get character metrics for 16-bit font. + double getWidth16(int c); + double getHeight16(int c); + double getOriginX16(int c); + double getOriginY16(int c); + + // Return the encoding. + FontEncoding *getEncoding() { return encoding; } + + // Return the character name associated with . + char *getCharName(int code) { return encoding->getCharName(code); } + + // Return the code associated with . + int getCharCode(char *charName) { return encoding->getCharCode(charName); } + + // Return the Type 3 CharProc for the character associated with . + Object *getCharProc(int code, Object *proc); + + // Return the 16-bit character set and encoding. + GfxFontCharSet16 getCharSet16() { return enc16.charSet; } + GfxFontEncoding16 *getEncoding16() { return enc16.enc; } + + // Get the writing mode (0=horizontal, 1=vertical). + int getWMode16() { return enc16.enc->wMode; } + + // Return the font matrix. + double *getFontMatrix() { return fontMat; } + + // Read an external or embedded font file into a buffer. + char *readExtFontFile(int *len); + char *readEmbFontFile(int *len); + +private: + + void getEncAndWidths(Dict *fontDict, BuiltinFont *builtinFont, + int missingWidth); + void findExtFontFile(); + void makeWidths(Dict *fontDict, FontEncoding *builtinEncoding, + Gushort *builtinWidths, int missingWidth); + void getType0EncAndWidths(Dict *fontDict); + + GString *tag; // PDF font tag + Ref id; // reference (used as unique ID) + GString *name; // font name + int flags; // font descriptor flags + GfxFontType type; // type of font + GBool is16; // set if font uses 16-bit chars + GString *embFontName; // name of embedded font + Ref embFontID; // ref to embedded font file stream + GString *extFontFile; // external font file name + Object charProcs; // Type3 CharProcs dictionary + double fontMat[6]; // font matrix + union { + FontEncoding *encoding; // 8-bit font encoding + struct { + GfxFontCharSet16 charSet; // 16-bit character set + GfxFontEncoding16 *enc; // 16-bit encoding (CMap) + } enc16; + }; + union { + double widths[256]; // width of each char for 8-bit font + GfxFontWidths16 widths16; // char widths for 16-bit font + }; +}; + +//------------------------------------------------------------------------ +// GfxFontDict +//------------------------------------------------------------------------ + +class GfxFontDict { +public: + + // Build the font dictionary, given the PDF font dictionary. + GfxFontDict(Dict *fontDict); + + // Destructor. + ~GfxFontDict(); + + // Get the specified font. + GfxFont *lookup(char *tag); + + // Iterative access. + int getNumFonts() { return numFonts; } + GfxFont *getFont(int i) { return fonts[i]; } + +private: + + GfxFont **fonts; // list of fonts + int numFonts; // number of fonts +}; + +#endif diff --git a/pdf2swf/xpdf/GfxState.cc b/pdf2swf/xpdf/GfxState.cc new file mode 100644 index 00000000..1abf9a56 --- /dev/null +++ b/pdf2swf/xpdf/GfxState.cc @@ -0,0 +1,2271 @@ +//======================================================================== +// +// GfxState.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include // for memcpy() +#include "gmem.h" +#include "Error.h" +#include "Object.h" +#include "Array.h" +#include "GfxState.h" + +//------------------------------------------------------------------------ + +static inline double clip01(double x) { + return (x < 0) ? 0 : ((x > 1) ? 1 : x); +} + +//------------------------------------------------------------------------ +// GfxColorSpace +//------------------------------------------------------------------------ + +GfxColorSpace::GfxColorSpace() { +} + +GfxColorSpace::~GfxColorSpace() { +} + +GfxColorSpace *GfxColorSpace::parse(Object *csObj) { + GfxColorSpace *cs; + Object obj1; + + cs = NULL; + if (csObj->isName()) { + if (csObj->isName("DeviceGray") || csObj->isName("G")) { + cs = new GfxDeviceGrayColorSpace(); + } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) { + cs = new GfxDeviceRGBColorSpace(); + } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) { + cs = new GfxDeviceCMYKColorSpace(); + } else if (csObj->isName("Pattern")) { + cs = new GfxPatternColorSpace(NULL); + } else { + error(-1, "Bad color space '%s'", csObj->getName()); + } + } else if (csObj->isArray()) { + csObj->arrayGet(0, &obj1); + if (obj1.isName("DeviceGray") || obj1.isName("G")) { + cs = new GfxDeviceGrayColorSpace(); + } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) { + cs = new GfxDeviceRGBColorSpace(); + } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) { + cs = new GfxDeviceCMYKColorSpace(); + } else if (obj1.isName("CalGray")) { + cs = GfxCalGrayColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("CalRGB")) { + cs = GfxCalRGBColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Lab")) { + cs = GfxLabColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("ICCBased")) { + cs = GfxICCBasedColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Indexed") || obj1.isName("I")) { + cs = GfxIndexedColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Separation")) { + cs = GfxSeparationColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("DeviceN")) { + cs = GfxDeviceNColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Pattern")) { + cs = GfxPatternColorSpace::parse(csObj->getArray()); + } else { + error(-1, "Bad color space '%s'", csObj->getName()); + } + obj1.free(); + } else { + error(-1, "Bad color space - expected name or array"); + } + return cs; +} + +void GfxColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel) { + int i; + + for (i = 0; i < getNComps(); ++i) { + decodeLow[i] = 0; + decodeRange[i] = 1; + } +} + +//------------------------------------------------------------------------ +// GfxDeviceGrayColorSpace +//------------------------------------------------------------------------ + +GfxDeviceGrayColorSpace::GfxDeviceGrayColorSpace() { +} + +GfxDeviceGrayColorSpace::~GfxDeviceGrayColorSpace() { +} + +GfxColorSpace *GfxDeviceGrayColorSpace::copy() { + return new GfxDeviceGrayColorSpace(); +} + +void GfxDeviceGrayColorSpace::getGray(GfxColor *color, double *gray) { + *gray = clip01(color->c[0]); +} + +void GfxDeviceGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = rgb->g = rgb->b = clip01(color->c[0]); +} + +void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = clip01(1 - color->c[0]); +} + +//------------------------------------------------------------------------ +// GfxCalGrayColorSpace +//------------------------------------------------------------------------ + +GfxCalGrayColorSpace::GfxCalGrayColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + gamma = 1; +} + +GfxCalGrayColorSpace::~GfxCalGrayColorSpace() { +} + +GfxColorSpace *GfxCalGrayColorSpace::copy() { + GfxCalGrayColorSpace *cs; + + cs = new GfxCalGrayColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->gamma = gamma; + return cs; +} + +GfxColorSpace *GfxCalGrayColorSpace::parse(Array *arr) { + GfxCalGrayColorSpace *cs; + Object obj1, obj2, obj3; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(-1, "Bad CalGray color space"); + obj1.free(); + return NULL; + } + cs = new GfxCalGrayColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Gamma", &obj2)->isNum()) { + cs->gamma = obj2.getNum(); + } + obj2.free(); + obj1.free(); + return cs; +} + +void GfxCalGrayColorSpace::getGray(GfxColor *color, double *gray) { + *gray = clip01(color->c[0]); +} + +void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = rgb->g = rgb->b = clip01(color->c[0]); +} + +void GfxCalGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = clip01(1 - color->c[0]); +} + +//------------------------------------------------------------------------ +// GfxDeviceRGBColorSpace +//------------------------------------------------------------------------ + +GfxDeviceRGBColorSpace::GfxDeviceRGBColorSpace() { +} + +GfxDeviceRGBColorSpace::~GfxDeviceRGBColorSpace() { +} + +GfxColorSpace *GfxDeviceRGBColorSpace::copy() { + return new GfxDeviceRGBColorSpace(); +} + +void GfxDeviceRGBColorSpace::getGray(GfxColor *color, double *gray) { + *gray = clip01(0.299 * color->c[0] + + 0.587 * color->c[1] + + 0.114 * color->c[2]); +} + +void GfxDeviceRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = clip01(color->c[0]); + rgb->g = clip01(color->c[1]); + rgb->b = clip01(color->c[2]); +} + +void GfxDeviceRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + double c, m, y, k; + + c = clip01(1 - color->c[0]); + m = clip01(1 - color->c[1]); + y = clip01(1 - color->c[2]); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +//------------------------------------------------------------------------ +// GfxCalRGBColorSpace +//------------------------------------------------------------------------ + +GfxCalRGBColorSpace::GfxCalRGBColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + gammaR = gammaG = gammaB = 1; + m[0] = 1; m[1] = 0; m[2] = 0; + m[3] = 0; m[4] = 1; m[5] = 0; + m[6] = 0; m[7] = 0; m[8] = 1; +} + +GfxCalRGBColorSpace::~GfxCalRGBColorSpace() { +} + +GfxColorSpace *GfxCalRGBColorSpace::copy() { + GfxCalRGBColorSpace *cs; + int i; + + cs = new GfxCalRGBColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->gammaR = gammaR; + cs->gammaG = gammaG; + cs->gammaB = gammaB; + for (i = 0; i < 9; ++i) { + cs->m[i] = m[i]; + } + return cs; +} + +GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr) { + GfxCalRGBColorSpace *cs; + Object obj1, obj2, obj3; + int i; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(-1, "Bad CalRGB color space"); + obj1.free(); + return NULL; + } + cs = new GfxCalRGBColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Gamma", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->gammaR = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->gammaG = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->gammaB = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Matrix", &obj2)->isArray() && + obj2.arrayGetLength() == 9) { + for (i = 0; i < 9; ++i) { + obj2.arrayGet(i, &obj3); + cs->m[i] = obj3.getNum(); + obj3.free(); + } + } + obj2.free(); + obj1.free(); + return cs; +} + +void GfxCalRGBColorSpace::getGray(GfxColor *color, double *gray) { + *gray = clip01(0.299 * color->c[0] + + 0.587 * color->c[1] + + 0.114 * color->c[2]); +} + +void GfxCalRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = clip01(color->c[0]); + rgb->g = clip01(color->c[1]); + rgb->b = clip01(color->c[2]); +} + +void GfxCalRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + double c, m, y, k; + + c = clip01(1 - color->c[0]); + m = clip01(1 - color->c[1]); + y = clip01(1 - color->c[2]); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +//------------------------------------------------------------------------ +// GfxDeviceCMYKColorSpace +//------------------------------------------------------------------------ + +GfxDeviceCMYKColorSpace::GfxDeviceCMYKColorSpace() { +} + +GfxDeviceCMYKColorSpace::~GfxDeviceCMYKColorSpace() { +} + +GfxColorSpace *GfxDeviceCMYKColorSpace::copy() { + return new GfxDeviceCMYKColorSpace(); +} + +void GfxDeviceCMYKColorSpace::getGray(GfxColor *color, double *gray) { + *gray = clip01(1 - color->c[3] + - 0.299 * color->c[0] + - 0.587 * color->c[1] + - 0.114 * color->c[2]); +} + +void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = clip01(1 - (color->c[0] + color->c[3])); + rgb->g = clip01(1 - (color->c[1] + color->c[3])); + rgb->b = clip01(1 - (color->c[2] + color->c[3])); +} + +void GfxDeviceCMYKColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = clip01(color->c[0]); + cmyk->m = clip01(color->c[1]); + cmyk->y = clip01(color->c[2]); + cmyk->k = clip01(color->c[3]); +} + +//------------------------------------------------------------------------ +// GfxLabColorSpace +//------------------------------------------------------------------------ + +// This is the inverse of MatrixLMN in Example 4.10 from the PostScript +// Language Reference, Third Edition. +static double xyzrgb[3][3] = { + { 3.240449, -1.537136, -0.498531 }, + { -0.969265, 1.876011, 0.041556 }, + { 0.055643, -0.204026, 1.057229 } +}; + +GfxLabColorSpace::GfxLabColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + aMin = bMin = -100; + aMax = bMax = 100; +} + +GfxLabColorSpace::~GfxLabColorSpace() { +} + +GfxColorSpace *GfxLabColorSpace::copy() { + GfxLabColorSpace *cs; + + cs = new GfxLabColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->aMin = aMin; + cs->aMax = aMax; + cs->bMin = bMin; + cs->bMax = bMax; + cs->kr = kr; + cs->kg = kg; + cs->kb = kb; + return cs; +} + +GfxColorSpace *GfxLabColorSpace::parse(Array *arr) { + GfxLabColorSpace *cs; + Object obj1, obj2, obj3; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(-1, "Bad Lab color space"); + obj1.free(); + return NULL; + } + cs = new GfxLabColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Range", &obj2)->isArray() && + obj2.arrayGetLength() == 4) { + obj2.arrayGet(0, &obj3); + cs->aMin = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->aMax = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->bMin = obj3.getNum(); + obj3.free(); + obj2.arrayGet(3, &obj3); + cs->bMax = obj3.getNum(); + obj3.free(); + } + obj2.free(); + obj1.free(); + + cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX + + xyzrgb[0][1] * cs->whiteY + + xyzrgb[0][2] * cs->whiteZ); + cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX + + xyzrgb[1][1] * cs->whiteY + + xyzrgb[1][2] * cs->whiteZ); + cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX + + xyzrgb[2][1] * cs->whiteY + + xyzrgb[2][2] * cs->whiteZ); + + return cs; +} + +void GfxLabColorSpace::getGray(GfxColor *color, double *gray) { + GfxRGB rgb; + + getRGB(color, &rgb); + *gray = clip01(0.299 * rgb.r + + 0.587 * rgb.g + + 0.114 * rgb.b); +} + +void GfxLabColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double X, Y, Z; + double t1, t2; + double r, g, b; + + // convert L*a*b* to CIE 1931 XYZ color space + t1 = (color->c[0] + 16) / 116; + t2 = t1 + color->c[1] / 500; + if (t2 >= (6.0 / 29.0)) { + X = t2 * t2 * t2; + } else { + X = (108.0 / 841.0) * (t2 - (4.0 / 29.0)); + } + X *= whiteX; + if (t1 >= (6.0 / 29.0)) { + Y = t1 * t1 * t1; + } else { + Y = (108.0 / 841.0) * (t1 - (4.0 / 29.0)); + } + Y *= whiteY; + t2 = t1 - color->c[2] / 200; + if (t2 >= (6.0 / 29.0)) { + Z = t2 * t2 * t2; + } else { + Z = (108.0 / 841.0) * (t2 - (4.0 / 29.0)); + } + Z *= whiteZ; + + // convert XYZ to RGB, including gamut mapping and gamma correction + r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z; + g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z; + b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z; + rgb->r = pow(clip01(r * kr), 0.5); + rgb->g = pow(clip01(g * kg), 0.5); + rgb->b = pow(clip01(b * kb), 0.5); +} + +void GfxLabColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxRGB rgb; + double c, m, y, k; + + getRGB(color, &rgb); + c = clip01(1 - rgb.r); + m = clip01(1 - rgb.g); + y = clip01(1 - rgb.b); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +void GfxLabColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel) { + decodeLow[0] = 0; + decodeRange[0] = 100; + decodeLow[1] = aMin; + decodeRange[1] = aMax - aMin; + decodeLow[2] = bMin; + decodeRange[2] = bMax - bMin; +} + +//------------------------------------------------------------------------ +// GfxICCBasedColorSpace +//------------------------------------------------------------------------ + +GfxICCBasedColorSpace::GfxICCBasedColorSpace(int nComps, GfxColorSpace *alt, + Ref *iccProfileStream) { + this->nComps = nComps; + this->alt = alt; + this->iccProfileStream = *iccProfileStream; + rangeMin[0] = rangeMin[1] = rangeMin[2] = rangeMin[3] = 0; + rangeMax[0] = rangeMax[1] = rangeMax[2] = rangeMax[3] = 1; +} + +GfxICCBasedColorSpace::~GfxICCBasedColorSpace() { + delete alt; +} + +GfxColorSpace *GfxICCBasedColorSpace::copy() { + GfxICCBasedColorSpace *cs; + int i; + + cs = new GfxICCBasedColorSpace(nComps, alt->copy(), &iccProfileStream); + for (i = 0; i < 4; ++i) { + cs->rangeMin[i] = rangeMin[i]; + cs->rangeMax[i] = rangeMax[i]; + } + return cs; +} + +GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr) { + GfxICCBasedColorSpace *cs; + Ref iccProfileStream; + int nComps; + GfxColorSpace *alt; + Dict *dict; + Object obj1, obj2, obj3; + int i; + + arr->getNF(1, &obj1); + if (obj1.isRef()) { + iccProfileStream = obj1.getRef(); + } else { + iccProfileStream.num = 0; + iccProfileStream.gen = 0; + } + obj1.free(); + arr->get(1, &obj1); + if (!obj1.isStream()) { + error(-1, "Bad ICCBased color space (stream)"); + obj1.free(); + return NULL; + } + dict = obj1.streamGetDict(); + if (!dict->lookup("N", &obj2)->isInt()) { + error(-1, "Bad ICCBased color space (N)"); + obj2.free(); + obj1.free(); + return NULL; + } + nComps = obj2.getInt(); + obj2.free(); + if (dict->lookup("Alternate", &obj2)->isNull() || + !(alt = GfxColorSpace::parse(&obj2))) { + switch (nComps) { + case 1: + alt = new GfxDeviceGrayColorSpace(); + break; + case 3: + alt = new GfxDeviceRGBColorSpace(); + break; + case 4: + alt = new GfxDeviceCMYKColorSpace(); + break; + default: + error(-1, "Bad ICCBased color space - invalid N"); + obj2.free(); + obj1.free(); + return NULL; + } + } + obj2.free(); + cs = new GfxICCBasedColorSpace(nComps, alt, &iccProfileStream); + if (dict->lookup("Range", &obj2)->isArray() && + obj2.arrayGetLength() == 2 * nComps) { + for (i = 0; i < nComps; ++i) { + obj2.arrayGet(2*i, &obj3); + cs->rangeMin[i] = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2*i+1, &obj3); + cs->rangeMax[i] = obj3.getNum(); + obj3.free(); + } + } + obj2.free(); + obj1.free(); + return cs; +} + +void GfxICCBasedColorSpace::getGray(GfxColor *color, double *gray) { + alt->getGray(color, gray); +} + +void GfxICCBasedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + alt->getRGB(color, rgb); +} + +void GfxICCBasedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + alt->getCMYK(color, cmyk); +} + +void GfxICCBasedColorSpace::getDefaultRanges(double *decodeLow, + double *decodeRange, + int maxImgPixel) { + int i; + + for (i = 0; i < nComps; ++i) { + decodeLow[i] = rangeMin[i]; + decodeRange[i] = rangeMax[i] - rangeMin[i]; + } +} + +//------------------------------------------------------------------------ +// GfxIndexedColorSpace +//------------------------------------------------------------------------ + +GfxIndexedColorSpace::GfxIndexedColorSpace(GfxColorSpace *base, + int indexHigh) { + this->base = base; + this->indexHigh = indexHigh; + this->lookup = (Guchar *)gmalloc((indexHigh + 1) * base->getNComps() * + sizeof(Guchar)); +} + +GfxIndexedColorSpace::~GfxIndexedColorSpace() { + delete base; + gfree(lookup); +} + +GfxColorSpace *GfxIndexedColorSpace::copy() { + GfxIndexedColorSpace *cs; + + cs = new GfxIndexedColorSpace(base->copy(), indexHigh); + memcpy(cs->lookup, lookup, + (indexHigh + 1) * base->getNComps() * sizeof(Guchar)); + return cs; +} + +GfxColorSpace *GfxIndexedColorSpace::parse(Array *arr) { + GfxIndexedColorSpace *cs; + GfxColorSpace *base; + int indexHigh; + Object obj1; + int x; + char *s; + int n, i, j; + + if (arr->getLength() != 4) { + error(-1, "Bad Indexed color space"); + goto err1; + } + arr->get(1, &obj1); + if (!(base = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad Indexed color space (base color space)"); + goto err2; + } + obj1.free(); + if (!arr->get(2, &obj1)->isInt()) { + error(-1, "Bad Indexed color space (hival)"); + goto err2; + } + indexHigh = obj1.getInt(); + obj1.free(); + cs = new GfxIndexedColorSpace(base, indexHigh); + arr->get(3, &obj1); + n = base->getNComps(); + if (obj1.isStream()) { + obj1.streamReset(); + for (i = 0; i <= indexHigh; ++i) { + for (j = 0; j < n; ++j) { + if ((x = obj1.streamGetChar()) == EOF) { + error(-1, "Bad Indexed color space (lookup table stream too short)"); + goto err3; + } + cs->lookup[i*n + j] = (Guchar)x; + } + } + obj1.streamClose(); + } else if (obj1.isString()) { + if (obj1.getString()->getLength() < (indexHigh + 1) * n) { + error(-1, "Bad Indexed color space (lookup table string too short)"); + goto err3; + } + s = obj1.getString()->getCString(); + for (i = 0; i <= indexHigh; ++i) { + for (j = 0; j < n; ++j) { + cs->lookup[i*n + j] = (Guchar)*s++; + } + } + } else { + error(-1, "Bad Indexed color space (lookup table)"); + goto err3; + } + obj1.free(); + return cs; + + err3: + delete cs; + err2: + obj1.free(); + err1: + return NULL; +} + +void GfxIndexedColorSpace::getGray(GfxColor *color, double *gray) { + Guchar *p; + GfxColor color2; + int n, i; + + n = base->getNComps(); + p = &lookup[(int)(color->c[0] + 0.5) * n]; + for (i = 0; i < n; ++i) { + color2.c[i] = p[i] / 255.0; + } + base->getGray(&color2, gray); +} + +void GfxIndexedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + Guchar *p; + GfxColor color2; + int n, i; + + n = base->getNComps(); + p = &lookup[(int)(color->c[0] + 0.5) * n]; + for (i = 0; i < n; ++i) { + color2.c[i] = p[i] / 255.0; + } + base->getRGB(&color2, rgb); +} + +void GfxIndexedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + Guchar *p; + GfxColor color2; + int n, i; + + n = base->getNComps(); + p = &lookup[(int)(color->c[0] + 0.5) * n]; + for (i = 0; i < n; ++i) { + color2.c[i] = p[i] / 255.0; + } + base->getCMYK(&color2, cmyk); +} + +void GfxIndexedColorSpace::getDefaultRanges(double *decodeLow, + double *decodeRange, + int maxImgPixel) { + decodeLow[0] = 0; + decodeRange[0] = maxImgPixel; +} + +//------------------------------------------------------------------------ +// GfxSeparationColorSpace +//------------------------------------------------------------------------ + +GfxSeparationColorSpace::GfxSeparationColorSpace(GString *name, + GfxColorSpace *alt, + Function *func) { + this->name = name; + this->alt = alt; + this->func = func; +} + +GfxSeparationColorSpace::~GfxSeparationColorSpace() { + delete name; + delete alt; + delete func; +} + +GfxColorSpace *GfxSeparationColorSpace::copy() { + return new GfxSeparationColorSpace(name->copy(), alt->copy(), func->copy()); +} + +//~ handle the 'All' and 'None' colorants +GfxColorSpace *GfxSeparationColorSpace::parse(Array *arr) { + GfxSeparationColorSpace *cs; + GString *name; + GfxColorSpace *alt; + Function *func; + Object obj1; + + if (arr->getLength() != 4) { + error(-1, "Bad Separation color space"); + goto err1; + } + if (!arr->get(1, &obj1)->isName()) { + error(-1, "Bad Separation color space (name)"); + goto err2; + } + name = new GString(obj1.getName()); + obj1.free(); + arr->get(2, &obj1); + if (!(alt = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad Separation color space (alternate color space)"); + goto err3; + } + obj1.free(); + func = Function::parse(arr->get(3, &obj1)); + obj1.free(); + if (!func->isOk()) { + goto err4; + } + cs = new GfxSeparationColorSpace(name, alt, func); + return cs; + + err4: + delete func; + delete alt; + err3: + delete name; + err2: + obj1.free(); + err1: + return NULL; +} + +void GfxSeparationColorSpace::getGray(GfxColor *color, double *gray) { + GfxColor color2; + + func->transform(color->c, color2.c); + alt->getGray(&color2, gray); +} + +void GfxSeparationColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + GfxColor color2; + + func->transform(color->c, color2.c); + alt->getRGB(&color2, rgb); +} + +void GfxSeparationColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxColor color2; + + func->transform(color->c, color2.c); + alt->getCMYK(&color2, cmyk); +} + +//------------------------------------------------------------------------ +// GfxDeviceNColorSpace +//------------------------------------------------------------------------ + +GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nComps, + GfxColorSpace *alt, + Function *func) { + this->nComps = nComps; + this->alt = alt; + this->func = func; +} + +GfxDeviceNColorSpace::~GfxDeviceNColorSpace() { + int i; + + for (i = 0; i < nComps; ++i) { + delete names[i]; + } + delete alt; + delete func; +} + +GfxColorSpace *GfxDeviceNColorSpace::copy() { + GfxDeviceNColorSpace *cs; + int i; + + cs = new GfxDeviceNColorSpace(nComps, alt->copy(), func->copy()); + for (i = 0; i < nComps; ++i) { + cs->names[i] = names[i]->copy(); + } + return cs; +} + +//~ handle the 'None' colorant +GfxColorSpace *GfxDeviceNColorSpace::parse(Array *arr) { + GfxDeviceNColorSpace *cs; + int nComps; + GString *names[gfxColorMaxComps]; + GfxColorSpace *alt; + Function *func; + Object obj1, obj2; + int i; + + if (arr->getLength() != 4 && arr->getLength() != 5) { + error(-1, "Bad DeviceN color space"); + goto err1; + } + if (!arr->get(1, &obj1)->isArray()) { + error(-1, "Bad DeviceN color space (names)"); + goto err2; + } + nComps = obj1.arrayGetLength(); + for (i = 0; i < nComps; ++i) { + if (!obj1.arrayGet(i, &obj2)->isName()) { + error(-1, "Bad DeviceN color space (names)"); + obj2.free(); + goto err2; + } + names[i] = new GString(obj2.getName()); + obj2.free(); + } + obj1.free(); + arr->get(2, &obj1); + if (!(alt = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad DeviceN color space (alternate color space)"); + goto err3; + } + obj1.free(); + func = Function::parse(arr->get(3, &obj1)); + obj1.free(); + if (!func->isOk()) { + goto err4; + } + cs = new GfxDeviceNColorSpace(nComps, alt, func); + for (i = 0; i < nComps; ++i) { + cs->names[i] = names[i]; + } + return cs; + + err4: + delete func; + delete alt; + err3: + for (i = 0; i < nComps; ++i) { + delete names[i]; + } + err2: + obj1.free(); + err1: + return NULL; +} + +void GfxDeviceNColorSpace::getGray(GfxColor *color, double *gray) { + GfxColor color2; + + func->transform(color->c, color2.c); + alt->getGray(&color2, gray); +} + +void GfxDeviceNColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + GfxColor color2; + + func->transform(color->c, color2.c); + alt->getRGB(&color2, rgb); +} + +void GfxDeviceNColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxColor color2; + + func->transform(color->c, color2.c); + alt->getCMYK(&color2, cmyk); +} + +//------------------------------------------------------------------------ +// GfxPatternColorSpace +//------------------------------------------------------------------------ + +GfxPatternColorSpace::GfxPatternColorSpace(GfxColorSpace *under) { + this->under = under; +} + +GfxPatternColorSpace::~GfxPatternColorSpace() { + if (under) { + delete under; + } +} + +GfxColorSpace *GfxPatternColorSpace::copy() { + return new GfxPatternColorSpace(under ? under->copy() : + (GfxColorSpace *)NULL); +} + +GfxColorSpace *GfxPatternColorSpace::parse(Array *arr) { + GfxPatternColorSpace *cs; + GfxColorSpace *under; + Object obj1; + + if (arr->getLength() != 1 && arr->getLength() != 2) { + error(-1, "Bad Pattern color space"); + return NULL; + } + under = NULL; + if (arr->getLength() == 2) { + arr->get(1, &obj1); + if (!(under = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad Pattern color space (underlying color space)"); + obj1.free(); + return NULL; + } + obj1.free(); + } + cs = new GfxPatternColorSpace(under); + return cs; +} + +void GfxPatternColorSpace::getGray(GfxColor *color, double *gray) { + *gray = 0; +} + +void GfxPatternColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = rgb->g = rgb->b = 0; +} + +void GfxPatternColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = 1; +} + +//------------------------------------------------------------------------ +// Pattern +//------------------------------------------------------------------------ + +GfxPattern::GfxPattern(int type) { + this->type = type; +} + +GfxPattern::~GfxPattern() { +} + +GfxPattern *GfxPattern::parse(Object *obj) { + GfxPattern *pattern; + Dict *dict; + Object obj1; + + pattern = NULL; + if (obj->isStream()) { + dict = obj->streamGetDict(); + dict->lookup("PatternType", &obj1); + if (obj1.isInt() && obj1.getInt() == 1) { + pattern = new GfxTilingPattern(dict, obj); + } + obj1.free(); + } + return pattern; +} + +//------------------------------------------------------------------------ +// GfxTilingPattern +//------------------------------------------------------------------------ + +GfxTilingPattern::GfxTilingPattern(Dict *streamDict, Object *stream): + GfxPattern(1) +{ + Object obj1, obj2; + int i; + + if (streamDict->lookup("PaintType", &obj1)->isInt()) { + paintType = obj1.getInt(); + } else { + paintType = 1; + error(-1, "Invalid or missing PaintType in pattern"); + } + obj1.free(); + if (streamDict->lookup("TilingType", &obj1)->isInt()) { + tilingType = obj1.getInt(); + } else { + tilingType = 1; + error(-1, "Invalid or missing TilingType in pattern"); + } + obj1.free(); + bbox[0] = bbox[1] = 0; + bbox[2] = bbox[3] = 1; + if (streamDict->lookup("BBox", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + for (i = 0; i < 4; ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + bbox[i] = obj2.getNum(); + } + obj2.free(); + } + } else { + error(-1, "Invalid or missing BBox in pattern"); + } + obj1.free(); + if (streamDict->lookup("XStep", &obj1)->isNum()) { + xStep = obj1.getNum(); + } else { + xStep = 1; + error(-1, "Invalid or missing XStep in pattern"); + } + obj1.free(); + if (streamDict->lookup("YStep", &obj1)->isNum()) { + yStep = obj1.getNum(); + } else { + yStep = 1; + error(-1, "Invalid or missing YStep in pattern"); + } + obj1.free(); + if (!streamDict->lookup("Resources", &resDict)->isDict()) { + resDict.free(); + resDict.initNull(); + error(-1, "Invalid or missing Resources in pattern"); + } + matrix[0] = 1; matrix[1] = 0; + matrix[2] = 0; matrix[3] = 1; + matrix[4] = 0; matrix[5] = 0; + if (streamDict->lookup("Matrix", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + for (i = 0; i < 6; ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + matrix[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + stream->copy(&contentStream); +} + +GfxTilingPattern::~GfxTilingPattern() { + resDict.free(); + contentStream.free(); +} + +GfxPattern *GfxTilingPattern::copy() { + return new GfxTilingPattern(this); +} + +GfxTilingPattern::GfxTilingPattern(GfxTilingPattern *pat): + GfxPattern(1) +{ + memcpy(this, pat, sizeof(GfxTilingPattern)); + pat->resDict.copy(&resDict); + pat->contentStream.copy(&contentStream); +} + +//------------------------------------------------------------------------ +// Function +//------------------------------------------------------------------------ + +Function::Function() { +} + +Function::~Function() { +} + +Function *Function::parse(Object *funcObj) { + Function *func; + Dict *dict; + int funcType; + Object obj1; + + if (funcObj->isStream()) { + dict = funcObj->streamGetDict(); + } else if (funcObj->isDict()) { + dict = funcObj->getDict(); + } else { + error(-1, "Expected function dictionary or stream"); + return NULL; + } + + if (!dict->lookup("FunctionType", &obj1)->isInt()) { + error(-1, "Function type is missing or wrong type"); + obj1.free(); + return NULL; + } + funcType = obj1.getInt(); + obj1.free(); + + if (funcType == 0) { + func = new SampledFunction(funcObj, dict); + } else if (funcType == 2) { + func = new ExponentialFunction(funcObj, dict); + } else { + error(-1, "Unimplemented function type"); + return NULL; + } + if (!func->isOk()) { + delete func; + return NULL; + } + + return func; +} + +GBool Function::init(Dict *dict) { + Object obj1, obj2; + int i; + + //----- Domain + if (!dict->lookup("Domain", &obj1)->isArray()) { + error(-1, "Function is missing domain"); + goto err2; + } + m = obj1.arrayGetLength() / 2; + if (m > funcMaxInputs) { + error(-1, "Functions with more than %d inputs are unsupported", + funcMaxInputs); + goto err2; + } + for (i = 0; i < m; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function domain array"); + goto err1; + } + domain[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function domain array"); + goto err1; + } + domain[i][1] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + + //----- Range + hasRange = gFalse; + n = 0; + if (dict->lookup("Range", &obj1)->isArray()) { + hasRange = gTrue; + n = obj1.arrayGetLength() / 2; + if (n > funcMaxOutputs) { + error(-1, "Functions with more than %d outputs are unsupported", + funcMaxOutputs); + goto err2; + } + for (i = 0; i < n; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function range array"); + goto err1; + } + range[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function range array"); + goto err1; + } + range[i][1] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + } + + return gTrue; + + err1: + obj2.free(); + err2: + obj1.free(); + return gFalse; +} + +//------------------------------------------------------------------------ +// SampledFunction +//------------------------------------------------------------------------ + +SampledFunction::SampledFunction(Object *funcObj, Dict *dict) { + Stream *str; + int nSamples, sampleBits; + double sampleMul; + Object obj1, obj2; + Guint buf, bitMask; + int bits; + int s; + int i; + + samples = NULL; + ok = gFalse; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (!hasRange) { + error(-1, "Type 0 function is missing range"); + goto err1; + } + + //----- get the stream + if (!funcObj->isStream()) { + error(-1, "Type 0 function isn't a stream"); + goto err1; + } + str = funcObj->getStream(); + + //----- Size + if (!dict->lookup("Size", &obj1)->isArray() || + obj1.arrayGetLength() != m) { + error(-1, "Function has missing or invalid size array"); + goto err2; + } + for (i = 0; i < m; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isInt()) { + error(-1, "Illegal value in function size array"); + goto err3; + } + sampleSize[i] = obj2.getInt(); + obj2.free(); + } + obj1.free(); + + //----- BitsPerSample + if (!dict->lookup("BitsPerSample", &obj1)->isInt()) { + error(-1, "Function has missing or invalid BitsPerSample"); + goto err2; + } + sampleBits = obj1.getInt(); + sampleMul = 1.0 / (double)((1 << sampleBits) - 1); + obj1.free(); + + //----- Encode + if (dict->lookup("Encode", &obj1)->isArray() && + obj1.arrayGetLength() == 2*m) { + for (i = 0; i < m; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function encode array"); + goto err3; + } + encode[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function encode array"); + goto err3; + } + encode[i][1] = obj2.getNum(); + obj2.free(); + } + } else { + for (i = 0; i < m; ++i) { + encode[i][0] = 0; + encode[i][1] = sampleSize[i] - 1; + } + } + obj1.free(); + + //----- Decode + if (dict->lookup("Decode", &obj1)->isArray() && + obj1.arrayGetLength() == 2*n) { + for (i = 0; i < n; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function decode array"); + goto err3; + } + decode[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function decode array"); + goto err3; + } + decode[i][1] = obj2.getNum(); + obj2.free(); + } + } else { + for (i = 0; i < n; ++i) { + decode[i][0] = range[i][0]; + decode[i][1] = range[i][1]; + } + } + obj1.free(); + + //----- samples + nSamples = n; + for (i = 0; i < m; ++i) + nSamples *= sampleSize[i]; + samples = (double *)gmalloc(nSamples * sizeof(double)); + buf = 0; + bits = 0; + bitMask = (1 << sampleBits) - 1; + str->reset(); + for (i = 0; i < nSamples; ++i) { + if (sampleBits == 8) { + s = str->getChar(); + } else if (sampleBits == 16) { + s = str->getChar(); + s = (s << 8) + str->getChar(); + } else if (sampleBits == 32) { + s = str->getChar(); + s = (s << 8) + str->getChar(); + s = (s << 8) + str->getChar(); + s = (s << 8) + str->getChar(); + } else { + while (bits < sampleBits) { + buf = (buf << 8) | (str->getChar() & 0xff); + bits += 8; + } + s = (buf >> (bits - sampleBits)) & bitMask; + bits -= sampleBits; + } + samples[i] = (double)s * sampleMul; + } + str->close(); + + ok = gTrue; + return; + + err3: + obj2.free(); + err2: + obj1.free(); + err1: + return; +} + +SampledFunction::~SampledFunction() { + if (samples) { + gfree(samples); + } +} + +SampledFunction::SampledFunction(SampledFunction *func) { + int nSamples, i; + + memcpy(this, func, sizeof(SampledFunction)); + + nSamples = n; + for (i = 0; i < m; ++i) { + nSamples *= sampleSize[i]; + } + samples = (double *)gmalloc(nSamples * sizeof(double)); + memcpy(samples, func->samples, nSamples * sizeof(double)); +} + +void SampledFunction::transform(double *in, double *out) { + double e[4]; + double s; + double x0, x1; + int e0, e1; + double efrac; + int i; + + // map input values into sample array + for (i = 0; i < m; ++i) { + e[i] = ((in[i] - domain[i][0]) / (domain[i][1] - domain[i][0])) * + (encode[i][1] - encode[i][0]) + encode[i][0]; + if (e[i] < 0) { + e[i] = 0; + } else if (e[i] > sampleSize[i] - 1) { + e[i] = sampleSize[i] - 1; + } + } + + for (i = 0; i < n; ++i) { + + // m-linear interpolation + // (only m=1 is currently supported) + e0 = (int)floor(e[0]); + e1 = (int)ceil(e[0]); + efrac = e[0] - e0; + x0 = samples[e0 * n + i]; + x1 = samples[e1 * n + i]; + s = (1 - efrac) * x0 + efrac * x1; + + // map output values to range + out[i] = s * (decode[i][1] - decode[i][0]) + decode[i][0]; + if (out[i] < range[i][0]) { + out[i] = range[i][0]; + } else if (out[i] > range[i][1]) { + out[i] = range[i][1]; + } + } +} + +//------------------------------------------------------------------------ +// ExponentialFunction +//------------------------------------------------------------------------ + +ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { + Object obj1, obj2; + GBool hasN; + int i; + + ok = gFalse; + hasN = gFalse; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (m != 1) { + error(-1, "Exponential function with more than one input"); + goto err1; + } + + //----- default values + for (i = 0; i < funcMaxOutputs; ++i) { + c0[i] = 0; + c1[i] = 1; + } + + //----- C0 + if (dict->lookup("C0", &obj1)->isArray()) { + if (!hasN) { + n = obj1.arrayGetLength(); + } else if (obj1.arrayGetLength() != n) { + error(-1, "Function's C0 array is wrong length"); + goto err2; + } + for (i = 0; i < n; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function C0 array"); + goto err3; + } + c0[i] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + } + + //----- C1 + if (dict->lookup("C1", &obj1)->isArray()) { + if (!hasN) { + n = obj1.arrayGetLength(); + } else if (obj1.arrayGetLength() != n) { + error(-1, "Function's C1 array is wrong length"); + goto err2; + } + for (i = 0; i < n; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function C1 array"); + goto err3; + } + c1[i] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + } + + //----- N (exponent) + if (!dict->lookup("N", &obj1)->isNum()) { + error(-1, "Function has missing or invalid N"); + goto err2; + } + e = obj1.getNum(); + obj1.free(); + + ok = gTrue; + return; + + err3: + obj2.free(); + err2: + obj1.free(); + err1: + return; +} + +ExponentialFunction::~ExponentialFunction() { +} + +ExponentialFunction::ExponentialFunction(ExponentialFunction *func) { + memcpy(this, func, sizeof(ExponentialFunction)); +} + +void ExponentialFunction::transform(double *in, double *out) { + double x; + int i; + + if (in[0] < domain[0][0]) { + x = domain[0][0]; + } else if (in[0] > domain[0][1]) { + x = domain[0][1]; + } else { + x = in[0]; + } + for (i = 0; i < n; ++i) { + out[i] = c0[i] + pow(x, e) * (c1[i] - c0[i]); + if (hasRange) { + if (out[i] < range[i][0]) { + out[i] = range[i][0]; + } else if (out[i] > range[i][1]) { + out[i] = range[i][1]; + } + } + } + return; +} + +//------------------------------------------------------------------------ +// GfxImageColorMap +//------------------------------------------------------------------------ + +GfxImageColorMap::GfxImageColorMap(int bits, Object *decode, + GfxColorSpace *colorSpace) { + GfxIndexedColorSpace *indexedCS; + GfxSeparationColorSpace *sepCS; + int maxPixel, indexHigh; + Guchar *lookup2; + Function *sepFunc; + Object obj; + double x; + double y[gfxColorMaxComps]; + int i, j, k; + + ok = gTrue; + + // bits per component and color space + this->bits = bits; + maxPixel = (1 << bits) - 1; + this->colorSpace = colorSpace; + + // get decode map + if (decode->isNull()) { + nComps = colorSpace->getNComps(); + colorSpace->getDefaultRanges(decodeLow, decodeRange, maxPixel); + } else if (decode->isArray()) { + nComps = decode->arrayGetLength() / 2; + if (nComps != colorSpace->getNComps()) { + goto err1; + } + for (i = 0; i < nComps; ++i) { + decode->arrayGet(2*i, &obj); + if (!obj.isNum()) { + goto err2; + } + decodeLow[i] = obj.getNum(); + obj.free(); + decode->arrayGet(2*i+1, &obj); + if (!obj.isNum()) { + goto err2; + } + decodeRange[i] = obj.getNum() - decodeLow[i]; + obj.free(); + } + } else { + goto err1; + } + +#if 0 //~ + // handle the case where fewer than 2^n palette entries of an n-bit + // indexed color space are populated (this happens, e.g., in files + // optimized by Distiller) + if (colorSpace->getMode() == csIndexed) { + i = ((GfxIndexedColorSpace *)colorSpace)->getIndexHigh(); + if (i < maxPixel) { + maxPixel = i; + } + } +#endif + + // Construct a lookup table -- this stores pre-computed decoded + // values for each component, i.e., the result of applying the + // decode mapping to each possible image pixel component value. + // + // Optimization: for Indexed and Separation color spaces (which have + // only one component), we store color values in the lookup table + // rather than component values. + colorSpace2 = NULL; + nComps2 = 0; + if (colorSpace->getMode() == csIndexed) { + // Note that indexHigh may not be the same as maxPixel -- + // Distiller will remove unused palette entries, resulting in + // indexHigh < maxPixel. + indexedCS = (GfxIndexedColorSpace *)colorSpace; + colorSpace2 = indexedCS->getBase(); + indexHigh = indexedCS->getIndexHigh(); + nComps2 = colorSpace2->getNComps(); + lookup = (double *)gmalloc((indexHigh + 1) * nComps2 * sizeof(double)); + lookup2 = indexedCS->getLookup(); + for (i = 0; i <= indexHigh; ++i) { + j = (int)(decodeLow[0] +(i * decodeRange[0]) / maxPixel + 0.5); + for (k = 0; k < nComps2; ++k) { + lookup[i*nComps2 + k] = lookup2[i*nComps2 + k] / 255.0; + } + } + } else if (colorSpace->getMode() == csSeparation) { + sepCS = (GfxSeparationColorSpace *)colorSpace; + colorSpace2 = sepCS->getAlt(); + nComps2 = colorSpace2->getNComps(); + lookup = (double *)gmalloc((maxPixel + 1) * nComps2 * sizeof(double)); + sepFunc = sepCS->getFunc(); + for (i = 0; i <= maxPixel; ++i) { + x = decodeLow[0] + (i * decodeRange[0]) / maxPixel; + sepFunc->transform(&x, y); + for (k = 0; k < nComps2; ++k) { + lookup[i*nComps2 + k] = y[k]; + } + } + } else { + lookup = (double *)gmalloc((maxPixel + 1) * nComps * sizeof(double)); + for (i = 0; i <= maxPixel; ++i) { + for (k = 0; k < nComps; ++k) { + lookup[i*nComps + k] = decodeLow[k] + + (i * decodeRange[k]) / maxPixel; + } + } + } + + return; + + err2: + obj.free(); + err1: + ok = gFalse; +} + +GfxImageColorMap::~GfxImageColorMap() { + delete colorSpace; + gfree(lookup); +} + +void GfxImageColorMap::getGray(Guchar *x, double *gray) { + GfxColor color; + double *p; + int i; + + if (colorSpace2) { + p = &lookup[x[0] * nComps2]; + for (i = 0; i < nComps2; ++i) { + color.c[i] = *p++; + } + colorSpace2->getGray(&color, gray); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup[x[i] * nComps + i]; + } + colorSpace->getGray(&color, gray); + } +} + +void GfxImageColorMap::getRGB(Guchar *x, GfxRGB *rgb) { + GfxColor color; + double *p; + int i; + + if (colorSpace2) { + p = &lookup[x[0] * nComps2]; + for (i = 0; i < nComps2; ++i) { + color.c[i] = *p++; + } + colorSpace2->getRGB(&color, rgb); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup[x[i] * nComps + i]; + } + colorSpace->getRGB(&color, rgb); + } +} + +void GfxImageColorMap::getCMYK(Guchar *x, GfxCMYK *cmyk) { + GfxColor color; + double *p; + int i; + + if (colorSpace2) { + p = &lookup[x[0] * nComps2]; + for (i = 0; i < nComps2; ++i) { + color.c[i] = *p++; + } + colorSpace2->getCMYK(&color, cmyk); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup[x[i] * nComps + i]; + } + colorSpace->getCMYK(&color, cmyk); + } +} + +//------------------------------------------------------------------------ +// GfxSubpath and GfxPath +//------------------------------------------------------------------------ + +GfxSubpath::GfxSubpath(double x1, double y1) { + size = 16; + x = (double *)gmalloc(size * sizeof(double)); + y = (double *)gmalloc(size * sizeof(double)); + curve = (GBool *)gmalloc(size * sizeof(GBool)); + n = 1; + x[0] = x1; + y[0] = y1; + curve[0] = gFalse; + closed = gFalse; +} + +GfxSubpath::~GfxSubpath() { + gfree(x); + gfree(y); + gfree(curve); +} + +// Used for copy(). +GfxSubpath::GfxSubpath(GfxSubpath *subpath) { + size = subpath->size; + n = subpath->n; + x = (double *)gmalloc(size * sizeof(double)); + y = (double *)gmalloc(size * sizeof(double)); + curve = (GBool *)gmalloc(size * sizeof(GBool)); + memcpy(x, subpath->x, n * sizeof(double)); + memcpy(y, subpath->y, n * sizeof(double)); + memcpy(curve, subpath->curve, n * sizeof(GBool)); + closed = subpath->closed; +} + +void GfxSubpath::lineTo(double x1, double y1) { + if (n >= size) { + size += 16; + x = (double *)grealloc(x, size * sizeof(double)); + y = (double *)grealloc(y, size * sizeof(double)); + curve = (GBool *)grealloc(curve, size * sizeof(GBool)); + } + x[n] = x1; + y[n] = y1; + curve[n] = gFalse; + ++n; +} + +void GfxSubpath::curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) { + if (n+3 > size) { + size += 16; + x = (double *)grealloc(x, size * sizeof(double)); + y = (double *)grealloc(y, size * sizeof(double)); + curve = (GBool *)grealloc(curve, size * sizeof(GBool)); + } + x[n] = x1; + y[n] = y1; + x[n+1] = x2; + y[n+1] = y2; + x[n+2] = x3; + y[n+2] = y3; + curve[n] = curve[n+1] = gTrue; + curve[n+2] = gFalse; + n += 3; +} + +void GfxSubpath::close() { + if (x[n-1] != x[0] || y[n-1] != y[0]) { + lineTo(x[0], y[0]); + } + closed = gTrue; +} + +GfxPath::GfxPath() { + justMoved = gFalse; + size = 16; + n = 0; + firstX = firstY = 0; + subpaths = (GfxSubpath **)gmalloc(size * sizeof(GfxSubpath *)); +} + +GfxPath::~GfxPath() { + int i; + + for (i = 0; i < n; ++i) + delete subpaths[i]; + gfree(subpaths); +} + +// Used for copy(). +GfxPath::GfxPath(GBool justMoved1, double firstX1, double firstY1, + GfxSubpath **subpaths1, int n1, int size1) { + int i; + + justMoved = justMoved1; + firstX = firstX1; + firstY = firstY1; + size = size1; + n = n1; + subpaths = (GfxSubpath **)gmalloc(size * sizeof(GfxSubpath *)); + for (i = 0; i < n; ++i) + subpaths[i] = subpaths1[i]->copy(); +} + +void GfxPath::moveTo(double x, double y) { + justMoved = gTrue; + firstX = x; + firstY = y; +} + +void GfxPath::lineTo(double x, double y) { + if (justMoved) { + if (n >= size) { + size += 16; + subpaths = (GfxSubpath **) + grealloc(subpaths, size * sizeof(GfxSubpath *)); + } + subpaths[n] = new GfxSubpath(firstX, firstY); + ++n; + justMoved = gFalse; + } + subpaths[n-1]->lineTo(x, y); +} + +void GfxPath::curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) { + if (justMoved) { + if (n >= size) { + size += 16; + subpaths = (GfxSubpath **) + grealloc(subpaths, size * sizeof(GfxSubpath *)); + } + subpaths[n] = new GfxSubpath(firstX, firstY); + ++n; + justMoved = gFalse; + } + subpaths[n-1]->curveTo(x1, y1, x2, y2, x3, y3); +} + + +//------------------------------------------------------------------------ +// GfxState +//------------------------------------------------------------------------ + +GfxState::GfxState(double dpi, double px1a, double py1a, + double px2a, double py2a, int rotate, GBool upsideDown) { + double k; + + px1 = px1a; + py1 = py1a; + px2 = px2a; + py2 = py2a; + k = dpi / 72.0; + if (rotate == 90) { + ctm[0] = 0; + ctm[1] = upsideDown ? k : -k; + ctm[2] = k; + ctm[3] = 0; + ctm[4] = -k * py1; + ctm[5] = k * (upsideDown ? -px1 : px2); + pageWidth = k * (py2 - py1); + pageHeight = k * (px2 - px1); + } else if (rotate == 180) { + ctm[0] = -k; + ctm[1] = 0; + ctm[2] = 0; + ctm[3] = upsideDown ? k : -k; + ctm[4] = k * px2; + ctm[5] = k * (upsideDown ? -py1 : py2); + pageWidth = k * (px2 - px1); + pageHeight = k * (py2 - py1); + } else if (rotate == 270) { + ctm[0] = 0; + ctm[1] = upsideDown ? -k : k; + ctm[2] = -k; + ctm[3] = 0; + ctm[4] = k * py2; + ctm[5] = k * (upsideDown ? px2 : -px1); + pageWidth = k * (py2 - py1); + pageHeight = k * (px2 - px1); + } else { + ctm[0] = k; + ctm[1] = 0; + ctm[2] = 0; + ctm[3] = upsideDown ? -k : k; + ctm[4] = -k * px1; + ctm[5] = k * (upsideDown ? py2 : -py1); + pageWidth = k * (px2 - px1); + pageHeight = k * (py2 - py1); + } + + fillColorSpace = new GfxDeviceGrayColorSpace(); + strokeColorSpace = new GfxDeviceGrayColorSpace(); + fillColor.c[0] = 0; + strokeColor.c[0] = 0; + fillPattern = NULL; + strokePattern = NULL; + fillOpacity = 1; + strokeOpacity = 1; + + lineWidth = 1; + lineDash = NULL; + lineDashLength = 0; + lineDashStart = 0; + flatness = 0; + lineJoin = 0; + lineCap = 0; + miterLimit = 10; + + font = NULL; + fontSize = 0; + textMat[0] = 1; textMat[1] = 0; + textMat[2] = 0; textMat[3] = 1; + textMat[4] = 0; textMat[5] = 0; + charSpace = 0; + wordSpace = 0; + horizScaling = 1; + leading = 0; + rise = 0; + render = 0; + + path = new GfxPath(); + curX = curY = 0; + lineX = lineY = 0; + + saved = NULL; +} + +GfxState::~GfxState() { + if (fillColorSpace) { + delete fillColorSpace; + } + if (strokeColorSpace) { + delete strokeColorSpace; + } + if (fillPattern) { + delete fillPattern; + } + if (strokePattern) { + delete strokePattern; + } + gfree(lineDash); + delete path; + if (saved) { + delete saved; + } +} + +// Used for copy(); +GfxState::GfxState(GfxState *state) { + memcpy(this, state, sizeof(GfxState)); + if (fillColorSpace) { + fillColorSpace = state->fillColorSpace->copy(); + } + if (strokeColorSpace) { + strokeColorSpace = state->strokeColorSpace->copy(); + } + if (fillPattern) { + fillPattern = state->fillPattern->copy(); + } + if (strokePattern) { + strokePattern = state->strokePattern->copy(); + } + if (lineDashLength > 0) { + lineDash = (double *)gmalloc(lineDashLength * sizeof(double)); + memcpy(lineDash, state->lineDash, lineDashLength * sizeof(double)); + } + path = state->path->copy(); + saved = NULL; +} + +double GfxState::transformWidth(double w) { + double x, y; + + x = ctm[0] + ctm[2]; + y = ctm[1] + ctm[3]; + return w * sqrt(0.5 * (x * x + y * y)); +} + +double GfxState::getTransformedFontSize() { + double x1, y1, x2, y2; + + x1 = textMat[2] * fontSize; + y1 = textMat[3] * fontSize; + x2 = ctm[0] * x1 + ctm[2] * y1; + y2 = ctm[1] * x1 + ctm[3] * y1; + return sqrt(x2 * x2 + y2 * y2); +} + +void GfxState::getFontTransMat(double *m11, double *m12, + double *m21, double *m22) { + *m11 = (textMat[0] * ctm[0] + textMat[1] * ctm[2]) * fontSize; + *m12 = (textMat[0] * ctm[1] + textMat[1] * ctm[3]) * fontSize; + *m21 = (textMat[2] * ctm[0] + textMat[3] * ctm[2]) * fontSize; + *m22 = (textMat[2] * ctm[1] + textMat[3] * ctm[3]) * fontSize; +} + +void GfxState::setCTM(double a, double b, double c, + double d, double e, double f) { + ctm[0] = a; + ctm[1] = b; + ctm[2] = c; + ctm[3] = d; + ctm[4] = e; + ctm[5] = f; +} + +void GfxState::concatCTM(double a, double b, double c, + double d, double e, double f) { + double a1 = ctm[0]; + double b1 = ctm[1]; + double c1 = ctm[2]; + double d1 = ctm[3]; + + ctm[0] = a * a1 + b * c1; + ctm[1] = a * b1 + b * d1; + ctm[2] = c * a1 + d * c1; + ctm[3] = c * b1 + d * d1; + ctm[4] = e * a1 + f * c1 + ctm[4]; + ctm[5] = e * b1 + f * d1 + ctm[5]; +} + +void GfxState::setFillColorSpace(GfxColorSpace *colorSpace) { + if (fillColorSpace) { + delete fillColorSpace; + } + fillColorSpace = colorSpace; +} + +void GfxState::setStrokeColorSpace(GfxColorSpace *colorSpace) { + if (strokeColorSpace) { + delete strokeColorSpace; + } + strokeColorSpace = colorSpace; +} + +void GfxState::setFillPattern(GfxPattern *pattern) { + if (fillPattern) { + delete fillPattern; + } + fillPattern = pattern; +} + +void GfxState::setStrokePattern(GfxPattern *pattern) { + if (strokePattern) { + delete strokePattern; + } + strokePattern = pattern; +} + +void GfxState::setLineDash(double *dash, int length, double start) { + if (lineDash) + gfree(lineDash); + lineDash = dash; + lineDashLength = length; + lineDashStart = start; +} + +void GfxState::clearPath() { + delete path; + path = new GfxPath(); +} + +void GfxState::textShift(double tx) { + double dx, dy; + + textTransformDelta(tx, 0, &dx, &dy); + curX += dx; + curY += dy; +} + +void GfxState::textShift(double tx, double ty) { + double dx, dy; + + textTransformDelta(tx, ty, &dx, &dy); + curX += dx; + curY += dy; +} + +GfxState *GfxState::save() { + GfxState *newState; + + newState = copy(); + newState->saved = this; + return newState; +} + +GfxState *GfxState::restore() { + GfxState *oldState; + + if (saved) { + oldState = saved; + saved = NULL; + delete this; + } else { + oldState = this; + } + return oldState; +} diff --git a/pdf2swf/xpdf/GfxState.h b/pdf2swf/xpdf/GfxState.h new file mode 100644 index 00000000..2056c4d1 --- /dev/null +++ b/pdf2swf/xpdf/GfxState.h @@ -0,0 +1,937 @@ +//======================================================================== +// +// GfxState.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef GFXSTATE_H +#define GFXSTATE_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "gtypes.h" +#include "Object.h" + +class Array; +class Function; +class GfxFont; + +//------------------------------------------------------------------------ +// GfxColor +//------------------------------------------------------------------------ + +#define gfxColorMaxComps 8 + +struct GfxColor { + double c[gfxColorMaxComps]; +}; + +//------------------------------------------------------------------------ +// GfxRGB +//------------------------------------------------------------------------ + +struct GfxRGB { + double r, g, b; +}; + +//------------------------------------------------------------------------ +// GfxCMYK +//------------------------------------------------------------------------ + +struct GfxCMYK { + double c, m, y, k; +}; + +//------------------------------------------------------------------------ +// GfxColorSpace +//------------------------------------------------------------------------ + +enum GfxColorSpaceMode { + csDeviceGray, + csCalGray, + csDeviceRGB, + csCalRGB, + csDeviceCMYK, + csLab, + csICCBased, + csIndexed, + csSeparation, + csDeviceN, + csPattern +}; + +class GfxColorSpace { +public: + + GfxColorSpace(); + virtual ~GfxColorSpace(); + virtual GfxColorSpace *copy() = 0; + virtual GfxColorSpaceMode getMode() = 0; + + // Construct a color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Object *csObj); + + // Convert to gray, RGB, or CMYK. + virtual void getGray(GfxColor *color, double *gray) = 0; + virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0; + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0; + + // Return the number of color components. + virtual int getNComps() = 0; + + // Return the default ranges for each component, assuming an image + // with a max pixel value of . + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + +private: +}; + +//------------------------------------------------------------------------ +// GfxDeviceGrayColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceGrayColorSpace: public GfxColorSpace { +public: + + GfxDeviceGrayColorSpace(); + virtual ~GfxDeviceGrayColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceGray; } + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + +private: +}; + +//------------------------------------------------------------------------ +// GfxCalGrayColorSpace +//------------------------------------------------------------------------ + +class GfxCalGrayColorSpace: public GfxColorSpace { +public: + + GfxCalGrayColorSpace(); + virtual ~GfxCalGrayColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csCalGray; } + + // Construct a CalGray color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + + // CalGray-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getGamma() { return gamma; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double gamma; // gamma value +}; + +//------------------------------------------------------------------------ +// GfxDeviceRGBColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceRGBColorSpace: public GfxColorSpace { +public: + + GfxDeviceRGBColorSpace(); + virtual ~GfxDeviceRGBColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceRGB; } + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 3; } + +private: +}; + +//------------------------------------------------------------------------ +// GfxCalRGBColorSpace +//------------------------------------------------------------------------ + +class GfxCalRGBColorSpace: public GfxColorSpace { +public: + + GfxCalRGBColorSpace(); + virtual ~GfxCalRGBColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csCalRGB; } + + // Construct a CalRGB color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 3; } + + // CalRGB-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getGammaR() { return gammaR; } + double getGammaG() { return gammaG; } + double getGammaB() { return gammaB; } + double *getMatrix() { return m; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double gammaR, gammaG, gammaB; // gamma values + double m[9]; // ABC -> XYZ transform matrix +}; + +//------------------------------------------------------------------------ +// GfxDeviceCMYKColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceCMYKColorSpace: public GfxColorSpace { +public: + + GfxDeviceCMYKColorSpace(); + virtual ~GfxDeviceCMYKColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceCMYK; } + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 4; } + +private: +}; + +//------------------------------------------------------------------------ +// GfxLabColorSpace +//------------------------------------------------------------------------ + +class GfxLabColorSpace: public GfxColorSpace { +public: + + GfxLabColorSpace(); + virtual ~GfxLabColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csLab; } + + // Construct a Lab color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 3; } + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // Lab-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getAMin() { return aMin; } + double getAMax() { return aMax; } + double getBMin() { return bMin; } + double getBMax() { return bMax; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double aMin, aMax, bMin, bMax; // range for the a and b components + double kr, kg, kb; // gamut mapping mulitpliers +}; + +//------------------------------------------------------------------------ +// GfxICCBasedColorSpace +//------------------------------------------------------------------------ + +class GfxICCBasedColorSpace: public GfxColorSpace { +public: + + GfxICCBasedColorSpace(int nComps, GfxColorSpace *alt, + Ref *iccProfileStream); + virtual ~GfxICCBasedColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csICCBased; } + + // Construct an ICCBased color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return nComps; } + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // ICCBased-specific access. + GfxColorSpace *getAlt() { return alt; } + +private: + + int nComps; // number of color components (1, 3, or 4) + GfxColorSpace *alt; // alternate color space + double rangeMin[4]; // min values for each component + double rangeMax[4]; // max values for each component + Ref iccProfileStream; // the ICC profile +}; + +//------------------------------------------------------------------------ +// GfxIndexedColorSpace +//------------------------------------------------------------------------ + +class GfxIndexedColorSpace: public GfxColorSpace { +public: + + GfxIndexedColorSpace(GfxColorSpace *base, int indexHigh); + virtual ~GfxIndexedColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csIndexed; } + + // Construct a Lab color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // Indexed-specific access. + GfxColorSpace *getBase() { return base; } + int getIndexHigh() { return indexHigh; } + Guchar *getLookup() { return lookup; } + +private: + + GfxColorSpace *base; // base color space + int indexHigh; // max pixel value + Guchar *lookup; // lookup table +}; + +//------------------------------------------------------------------------ +// GfxSeparationColorSpace +//------------------------------------------------------------------------ + +class GfxSeparationColorSpace: public GfxColorSpace { +public: + + GfxSeparationColorSpace(GString *name, GfxColorSpace *alt, + Function *func); + virtual ~GfxSeparationColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csSeparation; } + + // Construct a Separation color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + + // Separation-specific access. + GString *getName() { return name; } + GfxColorSpace *getAlt() { return alt; } + Function *getFunc() { return func; } + +private: + + GString *name; // colorant name + GfxColorSpace *alt; // alternate color space + Function *func; // tint transform (into alternate color space) +}; + +//------------------------------------------------------------------------ +// GfxDeviceNColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceNColorSpace: public GfxColorSpace { +public: + + GfxDeviceNColorSpace(int nComps, GfxColorSpace *alt, Function *func); + virtual ~GfxDeviceNColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceN; } + + // Construct a DeviceN color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return nComps; } + + // DeviceN-specific access. + GfxColorSpace *getAlt() { return alt; } + +private: + + int nComps; // number of components + GString // colorant names + *names[gfxColorMaxComps]; + GfxColorSpace *alt; // alternate color space + Function *func; // tint transform (into alternate color space) + +}; + +//------------------------------------------------------------------------ +// GfxPatternColorSpace +//------------------------------------------------------------------------ + +class GfxPatternColorSpace: public GfxColorSpace { +public: + + GfxPatternColorSpace(GfxColorSpace *under); + virtual ~GfxPatternColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csPattern; } + + // Construct a Pattern color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, double *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 0; } + + // Pattern-specific access. + GfxColorSpace *getUnder() { return under; } + +private: + + GfxColorSpace *under; // underlying color space (for uncolored + // patterns) +}; + +//------------------------------------------------------------------------ +// GfxPattern +//------------------------------------------------------------------------ + +class GfxPattern { +public: + + GfxPattern(int type); + virtual ~GfxPattern(); + + static GfxPattern *parse(Object *obj); + + virtual GfxPattern *copy() = 0; + + int getType() { return type; } + +private: + + int type; +}; + +//------------------------------------------------------------------------ +// GfxTilingPattern +//------------------------------------------------------------------------ + +class GfxTilingPattern: public GfxPattern { +public: + + GfxTilingPattern(Dict *streamDict, Object *stream); + virtual ~GfxTilingPattern(); + + virtual GfxPattern *copy(); + + int getPaintType() { return paintType; } + int getTilingType() { return tilingType; } + double *getBBox() { return bbox; } + double getXStep() { return xStep; } + double getYStep() { return yStep; } + Dict *getResDict() + { return resDict.isDict() ? resDict.getDict() : (Dict *)NULL; } + double *getMatrix() { return matrix; } + Object *getContentStream() { return &contentStream; } + +private: + + GfxTilingPattern(GfxTilingPattern *pat); + + int paintType; + int tilingType; + double bbox[4]; + double xStep, yStep; + Object resDict; + double matrix[6]; + Object contentStream; +}; + +//------------------------------------------------------------------------ +// Function +//------------------------------------------------------------------------ + +#define funcMaxInputs 1 +#define funcMaxOutputs 8 + +class Function { +public: + + Function(); + + virtual ~Function(); + + // Construct a function. Returns NULL if unsuccessful. + static Function *parse(Object *funcObj); + + // Initialize the entries common to all function types. + GBool init(Dict *dict); + + virtual Function *copy() = 0; + + // Return size of input and output tuples. + int getInputSize() { return m; } + int getOutputSize() { return n; } + + // Transform an input tuple into an output tuple. + virtual void transform(double *in, double *out) = 0; + + virtual GBool isOk() = 0; + +protected: + + int m, n; // size of input and output tuples + double // min and max values for function domain + domain[funcMaxInputs][2]; + double // min and max values for function range + range[funcMaxOutputs][2]; + GBool hasRange; // set if range is defined +}; + +//------------------------------------------------------------------------ +// SampledFunction +//------------------------------------------------------------------------ + +class SampledFunction: public Function { +public: + + SampledFunction(Object *funcObj, Dict *dict); + virtual ~SampledFunction(); + virtual Function *copy() { return new SampledFunction(this); } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + +private: + + SampledFunction(SampledFunction *func); + + int // number of samples for each domain element + sampleSize[funcMaxInputs]; + double // min and max values for domain encoder + encode[funcMaxInputs][2]; + double // min and max values for range decoder + decode[funcMaxOutputs][2]; + double *samples; // the samples + GBool ok; +}; + +//------------------------------------------------------------------------ +// ExponentialFunction +//------------------------------------------------------------------------ + +class ExponentialFunction: public Function { +public: + + ExponentialFunction(Object *funcObj, Dict *dict); + virtual ~ExponentialFunction(); + virtual Function *copy() { return new ExponentialFunction(this); } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + +private: + + ExponentialFunction(ExponentialFunction *func); + + double c0[funcMaxOutputs]; + double c1[funcMaxOutputs]; + double e; + GBool ok; +}; + +//------------------------------------------------------------------------ +// GfxImageColorMap +//------------------------------------------------------------------------ + +class GfxImageColorMap { +public: + + // Constructor. + GfxImageColorMap(int bits, Object *decode, GfxColorSpace *colorSpace); + + // Destructor. + ~GfxImageColorMap(); + + // Is color map valid? + GBool isOk() { return ok; } + + // Get the color space. + GfxColorSpace *getColorSpace() { return colorSpace; } + + // Get stream decoding info. + int getNumPixelComps() { return nComps; } + int getBits() { return bits; } + + // Get decode table. + double getDecodeLow(int i) { return decodeLow[i]; } + double getDecodeHigh(int i) { return decodeLow[i] + decodeRange[i]; } + + // Convert an image pixel to a color. + void getGray(Guchar *x, double *gray); + void getRGB(Guchar *x, GfxRGB *rgb); + void getCMYK(Guchar *x, GfxCMYK *cmyk); + +private: + + GfxColorSpace *colorSpace; // the image color space + int bits; // bits per component + int nComps; // number of components in a pixel + GfxColorSpace *colorSpace2; // secondary color space + int nComps2; // number of components in colorSpace2 + double *lookup; // lookup table + double // minimum values for each component + decodeLow[gfxColorMaxComps]; + double // max - min value for each component + decodeRange[gfxColorMaxComps]; + GBool ok; +}; + +//------------------------------------------------------------------------ +// GfxSubpath and GfxPath +//------------------------------------------------------------------------ + +class GfxSubpath { +public: + + // Constructor. + GfxSubpath(double x1, double y1); + + // Destructor. + ~GfxSubpath(); + + // Copy. + GfxSubpath *copy() { return new GfxSubpath(this); } + + // Get points. + int getNumPoints() { return n; } + double getX(int i) { return x[i]; } + double getY(int i) { return y[i]; } + GBool getCurve(int i) { return curve[i]; } + + // Get last point. + double getLastX() { return x[n-1]; } + double getLastY() { return y[n-1]; } + + // Add a line segment. + void lineTo(double x1, double y1); + + // Add a Bezier curve. + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3); + + // Close the subpath. + void close(); + GBool isClosed() { return closed; } + +private: + + double *x, *y; // points + GBool *curve; // curve[i] => point i is a control point + // for a Bezier curve + int n; // number of points + int size; // size of x/y arrays + GBool closed; // set if path is closed + + GfxSubpath(GfxSubpath *subpath); +}; + +class GfxPath { +public: + + // Constructor. + GfxPath(); + + // Destructor. + ~GfxPath(); + + // Copy. + GfxPath *copy() + { return new GfxPath(justMoved, firstX, firstY, subpaths, n, size); } + + // Is there a current point? + GBool isCurPt() { return n > 0 || justMoved; } + + // Is the path non-empty, i.e., is there at least one segment? + GBool isPath() { return n > 0; } + + // Get subpaths. + int getNumSubpaths() { return n; } + GfxSubpath *getSubpath(int i) { return subpaths[i]; } + + // Get last point on last subpath. + double getLastX() { return subpaths[n-1]->getLastX(); } + double getLastY() { return subpaths[n-1]->getLastY(); } + + // Move the current point. + void moveTo(double x, double y); + + // Add a segment to the last subpath. + void lineTo(double x, double y); + + // Add a Bezier curve to the last subpath + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3); + + // Close the last subpath. + void close() { subpaths[n-1]->close(); } + +private: + + GBool justMoved; // set if a new subpath was just started + double firstX, firstY; // first point in new subpath + GfxSubpath **subpaths; // subpaths + int n; // number of subpaths + int size; // size of subpaths array + + GfxPath(GBool justMoved1, double firstX1, double firstY1, + GfxSubpath **subpaths1, int n1, int size1); +}; + +//------------------------------------------------------------------------ +// GfxState +//------------------------------------------------------------------------ + +class GfxState { +public: + + // Construct a default GfxState, for a device with resolution , + // page box (,)-(,), page rotation , and + // coordinate system specified by . + GfxState(double dpi, double px1a, double py1a, + double px2a, double py2a, int rotate, GBool upsideDown); + + // Destructor. + ~GfxState(); + + // Copy. + GfxState *copy() { return new GfxState(this); } + + // Accessors. + double *getCTM() { return ctm; } + double getX1() { return px1; } + double getY1() { return py1; } + double getX2() { return px2; } + double getY2() { return py2; } + double getPageWidth() { return pageWidth; } + double getPageHeight() { return pageHeight; } + GfxColor *getFillColor() { return &fillColor; } + GfxColor *getStrokeColor() { return &strokeColor; } + void getFillRGB(GfxRGB *rgb) + { fillColorSpace->getRGB(&fillColor, rgb); } + void getStrokeRGB(GfxRGB *rgb) + { strokeColorSpace->getRGB(&strokeColor, rgb); } + void getFillCMYK(GfxCMYK *cmyk) + { fillColorSpace->getCMYK(&fillColor, cmyk); } + void getStrokeCMYK(GfxCMYK *cmyk) + { strokeColorSpace->getCMYK(&strokeColor, cmyk); } + GfxColorSpace *getFillColorSpace() { return fillColorSpace; } + GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace; } + GfxPattern *getFillPattern() { return fillPattern; } + GfxPattern *getStrokePattern() { return strokePattern; } + double getFillOpacity() { return fillOpacity; } + double getStrokeOpacity() { return strokeOpacity; } + double getLineWidth() { return lineWidth; } + void getLineDash(double **dash, int *length, double *start) + { *dash = lineDash; *length = lineDashLength; *start = lineDashStart; } + int getFlatness() { return flatness; } + int getLineJoin() { return lineJoin; } + int getLineCap() { return lineCap; } + double getMiterLimit() { return miterLimit; } + GfxFont *getFont() { return font; } + double getFontSize() { return fontSize; } + double *getTextMat() { return textMat; } + double getCharSpace() { return charSpace; } + double getWordSpace() { return wordSpace; } + double getHorizScaling() { return horizScaling; } + double getLeading() { return leading; } + double getRise() { return rise; } + int getRender() { return render; } + GfxPath *getPath() { return path; } + double getCurX() { return curX; } + double getCurY() { return curY; } + double getLineX() { return lineX; } + double getLineY() { return lineY; } + + // Is there a current point/path? + GBool isCurPt() { return path->isCurPt(); } + GBool isPath() { return path->isPath(); } + + // Transforms. + void transform(double x1, double y1, double *x2, double *y2) + { *x2 = ctm[0] * x1 + ctm[2] * y1 + ctm[4]; + *y2 = ctm[1] * x1 + ctm[3] * y1 + ctm[5]; } + void transformDelta(double x1, double y1, double *x2, double *y2) + { *x2 = ctm[0] * x1 + ctm[2] * y1; + *y2 = ctm[1] * x1 + ctm[3] * y1; } + void textTransform(double x1, double y1, double *x2, double *y2) + { *x2 = textMat[0] * x1 + textMat[2] * y1 + textMat[4]; + *y2 = textMat[1] * x1 + textMat[3] * y1 + textMat[5]; } + void textTransformDelta(double x1, double y1, double *x2, double *y2) + { *x2 = textMat[0] * x1 + textMat[2] * y1; + *y2 = textMat[1] * x1 + textMat[3] * y1; } + double transformWidth(double w); + double getTransformedLineWidth() + { return transformWidth(lineWidth); } + double getTransformedFontSize(); + void getFontTransMat(double *m11, double *m12, double *m21, double *m22); + + // Change state parameters. + void setCTM(double a, double b, double c, + double d, double e, double f); + void concatCTM(double a, double b, double c, + double d, double e, double f); + void setFillColorSpace(GfxColorSpace *colorSpace); + void setStrokeColorSpace(GfxColorSpace *colorSpace); + void setFillColor(GfxColor *color) { fillColor = *color; } + void setStrokeColor(GfxColor *color) { strokeColor = *color; } + void setFillPattern(GfxPattern *pattern); + void setStrokePattern(GfxPattern *pattern); + void setFillOpacity(double opac) { fillOpacity = opac; } + void setStrokeOpacity(double opac) { strokeOpacity = opac; } + void setLineWidth(double width) { lineWidth = width; } + void setLineDash(double *dash, int length, double start); + void setFlatness(int flatness1) { flatness = flatness1; } + void setLineJoin(int lineJoin1) { lineJoin = lineJoin1; } + void setLineCap(int lineCap1) { lineCap = lineCap1; } + void setMiterLimit(double miterLimit1) { miterLimit = miterLimit1; } + void setFont(GfxFont *font1, double fontSize1) + { font = font1; fontSize = fontSize1; } + void setTextMat(double a, double b, double c, + double d, double e, double f) + { textMat[0] = a; textMat[1] = b; textMat[2] = c; + textMat[3] = d; textMat[4] = e; textMat[5] = f; } + void setCharSpace(double space) + { charSpace = space; } + void setWordSpace(double space) + { wordSpace = space; } + void setHorizScaling(double scale) + { horizScaling = 0.01 * scale; } + void setLeading(double leading1) + { leading = leading1; } + void setRise(double rise1) + { rise = rise1; } + void setRender(int render1) + { render = render1; } + + // Add to path. + void moveTo(double x, double y) + { path->moveTo(curX = x, curY = y); } + void lineTo(double x, double y) + { path->lineTo(curX = x, curY = y); } + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) + { path->curveTo(x1, y1, x2, y2, curX = x3, curY = y3); } + void closePath() + { path->close(); curX = path->getLastX(); curY = path->getLastY(); } + void clearPath(); + + // Text position. + void textMoveTo(double tx, double ty) + { lineX = tx; lineY = ty; textTransform(tx, ty, &curX, &curY); } + void textShift(double tx); + void textShift(double tx, double ty); + + // Push/pop GfxState on/off stack. + GfxState *save(); + GfxState *restore(); + GBool hasSaves() { return saved != NULL; } + +private: + + double ctm[6]; // coord transform matrix + double px1, py1, px2, py2; // page corners (user coords) + double pageWidth, pageHeight; // page size (pixels) + + GfxColorSpace *fillColorSpace; // fill color space + GfxColorSpace *strokeColorSpace; // stroke color space + GfxColor fillColor; // fill color + GfxColor strokeColor; // stroke color + GfxPattern *fillPattern; // fill pattern + GfxPattern *strokePattern; // stroke pattern + double fillOpacity; // fill opacity + double strokeOpacity; // stroke opacity + + double lineWidth; // line width + double *lineDash; // line dash + int lineDashLength; + double lineDashStart; + int flatness; // curve flatness + int lineJoin; // line join style + int lineCap; // line cap style + double miterLimit; // line miter limit + + GfxFont *font; // font + double fontSize; // font size + double textMat[6]; // text matrix + double charSpace; // character spacing + double wordSpace; // word spacing + double horizScaling; // horizontal scaling + double leading; // text leading + double rise; // text rise + int render; // text rendering mode + + GfxPath *path; // array of path elements + double curX, curY; // current point (user coords) + double lineX, lineY; // start of current text line (text coords) + + GfxState *saved; // next GfxState on stack + + GfxState(GfxState *state); +}; + +#endif diff --git a/pdf2swf/xpdf/Lexer.cc b/pdf2swf/xpdf/Lexer.cc new file mode 100644 index 00000000..4ca8cfe9 --- /dev/null +++ b/pdf2swf/xpdf/Lexer.cc @@ -0,0 +1,468 @@ +//======================================================================== +// +// Lexer.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include +#include "Lexer.h" +#include "Error.h" + +//------------------------------------------------------------------------ + +// A '1' in this array means the character is white space. A '1' or +// '2' means the character ends a name or command. +static char specialChars[256] = { + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x + 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx +}; + +//------------------------------------------------------------------------ +// Lexer +//------------------------------------------------------------------------ + +Lexer::Lexer(Stream *str) { + Object obj; + + curStr.initStream(str); + streams = new Array(); + streams->add(curStr.copy(&obj)); + strPtr = 0; + freeArray = gTrue; + curStr.streamReset(); +} + +Lexer::Lexer(Object *obj) { + Object obj2; + + if (obj->isStream()) { + streams = new Array(); + freeArray = gTrue; + streams->add(obj->copy(&obj2)); + } else { + streams = obj->getArray(); + freeArray = gFalse; + } + strPtr = 0; + if (streams->getLength() > 0) { + streams->get(strPtr, &curStr); + curStr.streamReset(); + } +} + +Lexer::~Lexer() { + if (!curStr.isNone()) { + curStr.streamClose(); + curStr.free(); + } + if (freeArray) { + delete streams; + } +} + +int Lexer::getChar() { + int c; + + c = EOF; + while (!curStr.isNone() && (c = curStr.streamGetChar()) == EOF) { + curStr.streamClose(); + curStr.free(); + ++strPtr; + if (strPtr < streams->getLength()) { + streams->get(strPtr, &curStr); + curStr.streamReset(); + } + } + return c; +} + +int Lexer::lookChar() { + if (curStr.isNone()) { + return EOF; + } + return curStr.streamLookChar(); +} + +Object *Lexer::getObj(Object *obj) { + char *p; + int c, c2; + GBool comment, neg, done; + int numParen; + int xi; + double xf, scale; + GString *s; + int n, m; + + // skip whitespace and comments + comment = gFalse; + while (1) { + if ((c = getChar()) == EOF) { + return obj->initEOF(); + } + if (comment) { + if (c == '\r' || c == '\n') + comment = gFalse; + } else if (c == '%') { + comment = gTrue; + } else if (specialChars[c] != 1) { + break; + } + } + + // start reading token + switch (c) { + + // number + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '-': case '.': + neg = gFalse; + xi = 0; + if (c == '-') { + neg = gTrue; + } else if (c == '.') { + goto doReal; + } else { + xi = c - '0'; + } + while (1) { + c = lookChar(); + if (isdigit(c)) { + getChar(); + xi = xi * 10 + (c - '0'); + } else if (c == '.') { + getChar(); + goto doReal; + } else { + break; + } + } + if (neg) + xi = -xi; + obj->initInt(xi); + break; + doReal: + xf = xi; + scale = 0.1; + while (1) { + c = lookChar(); + if (!isdigit(c)) { + break; + } + getChar(); + xf = xf + scale * (c - '0'); + scale *= 0.1; + } + if (neg) + xf = -xf; + obj->initReal(xf); + break; + + // string + case '(': + p = tokBuf; + n = 0; + numParen = 1; + done = gFalse; + s = NULL; + do { + c2 = EOF; + switch (c = getChar()) { + + case EOF: +#if 0 + // This breaks some PDF files, e.g., ones from Photoshop. + case '\r': + case '\n': +#endif + error(getPos(), "Unterminated string"); + done = gTrue; + break; + + case '(': + ++numParen; + break; + + case ')': + if (--numParen == 0) + done = gTrue; + break; + + case '\\': + switch (c = getChar()) { + case 'n': + c2 = '\n'; + break; + case 'r': + c2 = '\r'; + break; + case 't': + c2 = '\t'; + break; + case 'b': + c2 = '\b'; + break; + case 'f': + c2 = '\f'; + break; + case '\\': + case '(': + case ')': + c2 = c; + break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + c2 = c - '0'; + c = lookChar(); + if (c >= '0' && c <= '7') { + getChar(); + c2 = (c2 << 3) + (c - '0'); + c = lookChar(); + if (c >= '0' && c <= '7') { + getChar(); + c2 = (c2 << 3) + (c - '0'); + } + } + break; + case '\r': + c = lookChar(); + if (c == '\n') { + getChar(); + } + break; + case '\n': + break; + case EOF: + error(getPos(), "Unterminated string"); + done = gTrue; + break; + default: + c2 = c; + break; + } + break; + + default: + c2 = c; + break; + } + + if (c2 != EOF) { + if (n == tokBufSize) { + if (!s) + s = new GString(tokBuf, tokBufSize); + else + s->append(tokBuf, tokBufSize); + p = tokBuf; + n = 0; + } + *p++ = (char)c2; + ++n; + } + } while (!done); + if (!s) + s = new GString(tokBuf, n); + else + s->append(tokBuf, n); + obj->initString(s); + break; + + // name + case '/': + p = tokBuf; + n = 0; + while ((c = lookChar()) != EOF && !specialChars[c]) { + getChar(); + if (c == '#') { + c2 = lookChar(); + if (c2 >= '0' && c2 <= '9') { + c = c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + c = c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + c = c2 - 'a' + 10; + } else { + goto notEscChar; + } + getChar(); + c <<= 4; + c2 = getChar(); + if (c2 >= '0' && c2 <= '9') { + c += c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + c += c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + c += c2 - 'a' + 10; + } else { + error(getPos(), "Illegal digit in hex char in name"); + } + } + notEscChar: + if (++n == tokBufSize) { + error(getPos(), "Name token too long"); + break; + } + *p++ = c; + } + *p = '\0'; + obj->initName(tokBuf); + break; + + // array punctuation + case '[': + case ']': + tokBuf[0] = c; + tokBuf[1] = '\0'; + obj->initCmd(tokBuf); + break; + + // hex string or dict punctuation + case '<': + c = lookChar(); + + // dict punctuation + if (c == '<') { + getChar(); + tokBuf[0] = tokBuf[1] = '<'; + tokBuf[2] = '\0'; + obj->initCmd(tokBuf); + + // hex string + } else { + p = tokBuf; + m = n = 0; + c2 = 0; + s = NULL; + while (1) { + c = getChar(); + if (c == '>') { + break; + } else if (c == EOF) { + error(getPos(), "Unterminated hex string"); + break; + } else if (specialChars[c] != 1) { + c2 = c2 << 4; + if (c >= '0' && c <= '9') + c2 += c - '0'; + else if (c >= 'A' && c <= 'F') + c2 += c - 'A' + 10; + else if (c >= 'a' && c <= 'f') + c2 += c - 'a' + 10; + else + error(getPos(), "Illegal character <%02x> in hex string", c); + if (++m == 2) { + if (n == tokBufSize) { + if (!s) + s = new GString(tokBuf, tokBufSize); + else + s->append(tokBuf, tokBufSize); + p = tokBuf; + n = 0; + } + *p++ = (char)c2; + ++n; + c2 = 0; + m = 0; + } + } + } + if (!s) + s = new GString(tokBuf, n); + else + s->append(tokBuf, n); + if (m == 1) + s->append((char)(c2 << 4)); + obj->initString(s); + } + break; + + // dict punctuation + case '>': + c = lookChar(); + if (c == '>') { + getChar(); + tokBuf[0] = tokBuf[1] = '>'; + tokBuf[2] = '\0'; + obj->initCmd(tokBuf); + } else { + error(getPos(), "Illegal character '>'"); + obj->initError(); + } + break; + + // error + case ')': + case '{': + case '}': + error(getPos(), "Illegal character '%c'", c); + obj->initError(); + break; + + // command + default: + p = tokBuf; + *p++ = c; + n = 1; + while ((c = lookChar()) != EOF && !specialChars[c]) { + getChar(); + if (++n == tokBufSize) { + error(getPos(), "Command token too long"); + break; + } + *p++ = c; + } + *p = '\0'; + if (tokBuf[0] == 't' && !strcmp(tokBuf, "true")) { + obj->initBool(gTrue); + } else if (tokBuf[0] == 'f' && !strcmp(tokBuf, "false")) { + obj->initBool(gFalse); + } else if (tokBuf[0] == 'n' && !strcmp(tokBuf, "null")) { + obj->initNull(); + } else { + obj->initCmd(tokBuf); + } + break; + } + + return obj; +} + +void Lexer::skipToNextLine() { + int c; + + while (1) { + c = getChar(); + if (c == EOF || c == '\n') { + return; + } + if (c == '\r') { + if ((c = lookChar()) == '\n') { + getChar(); + } + return; + } + } +} diff --git a/pdf2swf/xpdf/Lexer.h b/pdf2swf/xpdf/Lexer.h new file mode 100644 index 00000000..70144b86 --- /dev/null +++ b/pdf2swf/xpdf/Lexer.h @@ -0,0 +1,72 @@ +//======================================================================== +// +// Lexer.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef LEXER_H +#define LEXER_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "Object.h" +#include "Stream.h" + +#define tokBufSize 128 // size of token buffer + +//------------------------------------------------------------------------ +// Lexer +//------------------------------------------------------------------------ + +class Lexer { +public: + + // Construct a lexer for a single stream. Deletes the stream when + // lexer is deleted. + Lexer(Stream *str); + + // Construct a lexer for a stream or array of streams (assumes obj + // is either a stream or array of streams). + Lexer(Object *obj); + + // Destructor. + ~Lexer(); + + // Get the next object from the input stream. + Object *getObj(Object *obj); + + // Skip to the beginning of the next line in the input stream. + void skipToNextLine(); + + // Skip over one character. + void skipChar() { getChar(); } + + // Get stream. + Stream *getStream() + { return curStr.isNone() ? (Stream *)NULL : curStr.getStream(); } + + // Get current position in file. + int getPos() + { return curStr.isNone() ? -1 : curStr.streamGetPos(); } + + // Set position in file. + void setPos(int pos) + { if (!curStr.isNone()) curStr.streamSetPos(pos); } + +private: + + int getChar(); + int lookChar(); + + Array *streams; // array of input streams + int strPtr; // index of current stream + Object curStr; // current stream + GBool freeArray; // should lexer free the streams array? + char tokBuf[tokBufSize]; // temporary token buffer +}; + +#endif diff --git a/pdf2swf/xpdf/Link.cc b/pdf2swf/xpdf/Link.cc new file mode 100644 index 00000000..adb8c97f --- /dev/null +++ b/pdf2swf/xpdf/Link.cc @@ -0,0 +1,630 @@ +//======================================================================== +// +// Link.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "GString.h" +#include "Error.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Link.h" + +//------------------------------------------------------------------------ + +static GString *getFileSpecName(Object *fileSpecObj); + +//------------------------------------------------------------------------ +// LinkDest +//------------------------------------------------------------------------ + +LinkDest::LinkDest(Array *a, GBool pageIsRef1) { + Object obj1, obj2; + + // initialize fields + pageIsRef = pageIsRef1; + left = bottom = right = top = zoom = 0; + ok = gFalse; + + // get page + if (pageIsRef) { + if (!a->getNF(0, &obj1)->isRef()) { + error(-1, "Bad annotation destination"); + goto err2; + } + pageRef.num = obj1.getRefNum(); + pageRef.gen = obj1.getRefGen(); + obj1.free(); + } else { + if (!a->get(0, &obj1)->isInt()) { + error(-1, "Bad annotation destination"); + goto err2; + } + pageNum = obj1.getInt() + 1; + obj1.free(); + } + + // get destination type + a->get(1, &obj1); + + // XYZ link + if (obj1.isName("XYZ")) { + kind = destXYZ; + a->get(2, &obj2); + if (obj2.isNull()) { + changeLeft = gFalse; + } else if (obj2.isNum()) { + changeLeft = gTrue; + left = obj2.getNum(); + } else { + error(-1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + a->get(3, &obj2); + if (obj2.isNull()) { + changeTop = gFalse; + } else if (obj2.isNum()) { + changeTop = gTrue; + top = obj2.getNum(); + } else { + error(-1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + a->get(4, &obj2); + if (obj2.isNull()) { + changeZoom = gFalse; + } else if (obj2.isNum()) { + changeZoom = gTrue; + zoom = obj2.getNum(); + } else { + error(-1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + + // Fit link + } else if (obj1.isName("Fit")) { + kind = destFit; + + // FitH link + } else if (obj1.isName("FitH")) { + kind = destFitH; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + goto err1; + } + top = obj2.getNum(); + obj2.free(); + + // FitV link + } else if (obj1.isName("FitV")) { + kind = destFitV; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + goto err1; + } + left = obj2.getNum(); + obj2.free(); + + // FitR link + } else if (obj1.isName("FitR")) { + kind = destFitR; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + goto err1; + } + left = obj2.getNum(); + obj2.free(); + if (!a->get(3, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + goto err1; + } + bottom = obj2.getNum(); + obj2.free(); + if (!a->get(4, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + goto err1; + } + right = obj2.getNum(); + obj2.free(); + if (!a->get(5, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + goto err1; + } + top = obj2.getNum(); + obj2.free(); + + // FitB link + } else if (obj1.isName("FitB")) { + kind = destFitB; + + // FitBH link + } else if (obj1.isName("FitBH")) { + kind = destFitBH; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + goto err1; + } + top = obj2.getNum(); + obj2.free(); + + // FitBV link + } else if (obj1.isName("FitBV")) { + kind = destFitBV; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + goto err1; + } + left = obj2.getNum(); + obj2.free(); + + // unknown link kind + } else { + error(-1, "Unknown annotation destination type"); + goto err2; + } + + obj1.free(); + ok = gTrue; + return; + + err1: + obj2.free(); + err2: + obj1.free(); +} + +LinkDest::LinkDest(LinkDest *dest) { + kind = dest->kind; + pageIsRef = dest->pageIsRef; + if (pageIsRef) + pageRef = dest->pageRef; + else + pageNum = dest->pageNum; + left = dest->left; + bottom = dest->bottom; + right = dest->right; + top = dest->top; + zoom = dest->zoom; + changeLeft = dest->changeLeft; + changeTop = dest->changeTop; + changeZoom = dest->changeZoom; + ok = gTrue; +} + +//------------------------------------------------------------------------ +// LinkGoTo +//------------------------------------------------------------------------ + +LinkGoTo::LinkGoTo(Object *destObj) { + dest = NULL; + namedDest = NULL; + + // named destination + if (destObj->isName()) { + namedDest = new GString(destObj->getName()); + } else if (destObj->isString()) { + namedDest = destObj->getString()->copy(); + + // destination dictionary + } else if (destObj->isArray()) { + dest = new LinkDest(destObj->getArray(), gTrue); + if (!dest->isOk()) { + delete dest; + dest = NULL; + } + + // error + } else { + error(-1, "Illegal annotation destination"); + } +} + +LinkGoTo::~LinkGoTo() { + if (dest) + delete dest; + if (namedDest) + delete namedDest; +} + +//------------------------------------------------------------------------ +// LinkGoToR +//------------------------------------------------------------------------ + +LinkGoToR::LinkGoToR(Object *fileSpecObj, Object *destObj) { + dest = NULL; + namedDest = NULL; + + // get file name + fileName = getFileSpecName(fileSpecObj); + + // named destination + if (destObj->isName()) { + namedDest = new GString(destObj->getName()); + } else if (destObj->isString()) { + namedDest = destObj->getString()->copy(); + + // destination dictionary + } else if (destObj->isArray()) { + dest = new LinkDest(destObj->getArray(), gFalse); + if (!dest->isOk()) { + delete dest; + dest = NULL; + } + + // error + } else { + error(-1, "Illegal annotation destination"); + } +} + +LinkGoToR::~LinkGoToR() { + if (fileName) + delete fileName; + if (dest) + delete dest; + if (namedDest) + delete namedDest; +} + + +//------------------------------------------------------------------------ +// LinkLaunch +//------------------------------------------------------------------------ + +LinkLaunch::LinkLaunch(Object *actionObj) { + Object obj1, obj2; + + fileName = NULL; + params = NULL; + + if (actionObj->isDict()) { + if (!actionObj->dictLookup("F", &obj1)->isNull()) { + fileName = getFileSpecName(&obj1); + } else { + obj1.free(); + //~ This hasn't been defined by Adobe yet, so assume it looks + //~ just like the Win dictionary until they say otherwise. + if (actionObj->dictLookup("Unix", &obj1)->isDict()) { + obj1.dictLookup("F", &obj2); + fileName = getFileSpecName(&obj2); + obj2.free(); + if (obj1.dictLookup("P", &obj2)->isString()) + params = obj2.getString()->copy(); + obj2.free(); + } else { + error(-1, "Bad launch-type link action"); + } + } + obj1.free(); + } +} + +LinkLaunch::~LinkLaunch() { + if (fileName) + delete fileName; + if (params) + delete params; +} + +//------------------------------------------------------------------------ +// LinkURI +//------------------------------------------------------------------------ + +LinkURI::LinkURI(Object *uriObj, GString *baseURI) { + GString *uri2; + int n; + char c; + + uri = NULL; + if (uriObj->isString()) { + uri2 = uriObj->getString()->copy(); + if (baseURI) { + n = strcspn(uri2->getCString(), "/:"); + if (n == uri2->getLength() || uri2->getChar(n) == '/') { + uri = baseURI->copy(); + c = uri->getChar(uri->getLength() - 1); + if (c == '/' || c == '?') { + if (uri2->getChar(0) == '/') { + uri2->del(0); + } + } else { + if (uri2->getChar(0) != '/') { + uri->append('/'); + } + } + uri->append(uri2); + delete uri2; + } else { + uri = uri2; + } + } else { + uri = uri2; + } + } else { + error(-1, "Illegal URI-type link"); + } +} + +LinkURI::~LinkURI() { + if (uri) + delete uri; +} + +//------------------------------------------------------------------------ +// LinkNamed +//------------------------------------------------------------------------ + +LinkNamed::LinkNamed(Object *nameObj) { + name = NULL; + if (nameObj->isName()) { + name = new GString(nameObj->getName()); + } +} + +LinkNamed::~LinkNamed() { + if (name) { + delete name; + } +} + +//------------------------------------------------------------------------ +// LinkUnknown +//------------------------------------------------------------------------ + +LinkUnknown::LinkUnknown(char *action1) { + action = new GString(action1); +} + +LinkUnknown::~LinkUnknown() { + delete action; +} + +//------------------------------------------------------------------------ +// Link +//------------------------------------------------------------------------ + +Link::Link(Dict *dict, GString *baseURI) { + Object obj1, obj2, obj3, obj4; + double t; + + action = NULL; + ok = gFalse; + + // get rectangle + if (!dict->lookup("Rect", &obj1)->isArray()) { + error(-1, "Annotation rectangle is wrong type"); + goto err2; + } + if (!obj1.arrayGet(0, &obj2)->isNum()) { + error(-1, "Bad annotation rectangle"); + goto err1; + } + x1 = obj2.getNum(); + obj2.free(); + if (!obj1.arrayGet(1, &obj2)->isNum()) { + error(-1, "Bad annotation rectangle"); + goto err1; + } + y1 = obj2.getNum(); + obj2.free(); + if (!obj1.arrayGet(2, &obj2)->isNum()) { + error(-1, "Bad annotation rectangle"); + goto err1; + } + x2 = obj2.getNum(); + obj2.free(); + if (!obj1.arrayGet(3, &obj2)->isNum()) { + error(-1, "Bad annotation rectangle"); + goto err1; + } + y2 = obj2.getNum(); + obj2.free(); + obj1.free(); + if (x1 > x2) { + t = x1; + x1 = x2; + x2 = t; + } + if (y1 > y2) { + t = y1; + y1 = y2; + y2 = t; + } + + // get border + borderW = 0; + if (!dict->lookup("Border", &obj1)->isNull()) { + if (obj1.isArray() && obj1.arrayGet(2, &obj2)->isNum()) + borderW = obj2.getNum(); + else + error(-1, "Bad annotation border"); + obj2.free(); + } + obj1.free(); + + // look for destination + if (!dict->lookup("Dest", &obj1)->isNull()) { + action = new LinkGoTo(&obj1); + + // look for action + } else { + obj1.free(); + if (dict->lookup("A", &obj1)->isDict()) { + obj1.dictLookup("S", &obj2); + + // GoTo action + if (obj2.isName("GoTo")) { + obj1.dictLookup("D", &obj3); + action = new LinkGoTo(&obj3); + obj3.free(); + + // GoToR action + } else if (obj2.isName("GoToR")) { + obj1.dictLookup("F", &obj3); + obj1.dictLookup("D", &obj4); + action = new LinkGoToR(&obj3, &obj4); + obj3.free(); + obj4.free(); + + // Launch action + } else if (obj2.isName("Launch")) { + action = new LinkLaunch(&obj1); + + // URI action + } else if (obj2.isName("URI")) { + obj1.dictLookup("URI", &obj3); + action = new LinkURI(&obj3, baseURI); + obj3.free(); + + // Named action + } else if (obj2.isName("Named")) { + obj1.dictLookup("N", &obj3); + action = new LinkNamed(&obj3); + obj3.free(); + + // unknown action + } else if (obj2.isName()) { + action = new LinkUnknown(obj2.getName()); + + // action is missing or wrong type + } else { + error(-1, "Bad annotation action"); + action = NULL; + } + + obj2.free(); + + } else { + error(-1, "Missing annotation destination/action"); + action = NULL; + } + } + obj1.free(); + + // check for bad action + if (action && action->isOk()) + ok = gTrue; + + return; + + err1: + obj2.free(); + err2: + obj1.free(); +} + +Link::~Link() { + if (action) + delete action; +} + +//------------------------------------------------------------------------ +// Links +//------------------------------------------------------------------------ + +Links::Links(Object *annots, GString *baseURI) { + Link *link; + Object obj1, obj2; + int size; + int i; + + links = NULL; + size = 0; + numLinks = 0; + + if (annots->isArray()) { + for (i = 0; i < annots->arrayGetLength(); ++i) { + if (annots->arrayGet(i, &obj1)->isDict()) { + if (obj1.dictLookup("Subtype", &obj2)->isName("Link")) { + link = new Link(obj1.getDict(), baseURI); + if (link->isOk()) { + if (numLinks >= size) { + size += 16; + links = (Link **)grealloc(links, size * sizeof(Link *)); + } + links[numLinks++] = link; + } else { + delete link; + } + } + obj2.free(); + } + obj1.free(); + } + } +} + +Links::~Links() { + int i; + + for (i = 0; i < numLinks; ++i) + delete links[i]; + gfree(links); +} + +LinkAction *Links::find(double x, double y) { + int i; + + for (i = 0; i < numLinks; ++i) { + if (links[i]->inRect(x, y)) { + return links[i]->getAction(); + } + } + return NULL; +} + +GBool Links::onLink(double x, double y) { + int i; + + for (i = 0; i < numLinks; ++i) { + if (links[i]->inRect(x, y)) + return gTrue; + } + return gFalse; +} + +//------------------------------------------------------------------------ + +// Extract a file name from a file specification (string or dictionary). +static GString *getFileSpecName(Object *fileSpecObj) { + GString *name; + Object obj1; + + name = NULL; + + // string + if (fileSpecObj->isString()) { + name = fileSpecObj->getString()->copy(); + + // dictionary + } else if (fileSpecObj->isDict()) { + if (!fileSpecObj->dictLookup("Unix", &obj1)->isString()) { + obj1.free(); + fileSpecObj->dictLookup("F", &obj1); + } + if (obj1.isString()) + name = obj1.getString()->copy(); + else + error(-1, "Illegal file spec in link"); + obj1.free(); + + // error + } else { + error(-1, "Illegal file spec in link"); + } + + return name; +} diff --git a/pdf2swf/xpdf/Link.h b/pdf2swf/xpdf/Link.h new file mode 100644 index 00000000..7e00510c --- /dev/null +++ b/pdf2swf/xpdf/Link.h @@ -0,0 +1,336 @@ +//======================================================================== +// +// Link.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef LINK_H +#define LINK_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "Object.h" + +class GString; +class Array; +class Dict; + +//------------------------------------------------------------------------ +// LinkAction +//------------------------------------------------------------------------ + +enum LinkActionKind { + actionGoTo, // go to destination + actionGoToR, // go to destination in new file + actionLaunch, // launch app (or open document) + actionURI, // URI + actionNamed, // named action + actionUnknown // anything else +}; + +class LinkAction { +public: + + // Destructor. + virtual ~LinkAction() {} + + // Was the LinkAction created successfully? + virtual GBool isOk() = 0; + + // Check link action type. + virtual LinkActionKind getKind() = 0; +}; + +//------------------------------------------------------------------------ +// LinkDest +//------------------------------------------------------------------------ + +enum LinkDestKind { + destXYZ, + destFit, + destFitH, + destFitV, + destFitR, + destFitB, + destFitBH, + destFitBV +}; + +class LinkDest { +public: + + // Build a LinkDest from the array. If is true, the + // page is specified by an object reference; otherwise the page is + // specified by a (zero-relative) page number. + LinkDest(Array *a, GBool pageIsRef1); + + // Copy a LinkDest. + LinkDest *copy() { return new LinkDest(this); } + + // Was the LinkDest created successfully? + GBool isOk() { return ok; } + + // Accessors. + LinkDestKind getKind() { return kind; } + GBool isPageRef() { return pageIsRef; } + int getPageNum() { return pageNum; } + Ref getPageRef() { return pageRef; } + double getLeft() { return left; } + double getBottom() { return bottom; } + double getRight() { return right; } + double getTop() { return top; } + double getZoom() { return zoom; } + GBool getChangeLeft() { return changeLeft; } + GBool getChangeTop() { return changeTop; } + GBool getChangeZoom() { return changeZoom; } + +private: + + LinkDestKind kind; // destination type + GBool pageIsRef; // is the page a reference or number? + union { + Ref pageRef; // reference to page + int pageNum; // one-relative page number + }; + double left, bottom; // position + double right, top; + double zoom; // zoom factor + GBool changeLeft, changeTop; // for destXYZ links, which position + GBool changeZoom; // components to change + GBool ok; // set if created successfully + + LinkDest(LinkDest *dest); +}; + +//------------------------------------------------------------------------ +// LinkGoTo +//------------------------------------------------------------------------ + +class LinkGoTo: public LinkAction { +public: + + // Build a LinkGoTo from a destination (dictionary, name, or string). + LinkGoTo(Object *destObj); + + // Destructor. + virtual ~LinkGoTo(); + + // Was the LinkGoTo created successfully? + virtual GBool isOk() { return dest || namedDest; } + + // Accessors. + virtual LinkActionKind getKind() { return actionGoTo; } + LinkDest *getDest() { return dest; } + GString *getNamedDest() { return namedDest; } + +private: + + LinkDest *dest; // regular destination (NULL for remote + // link with bad destination) + GString *namedDest; // named destination (only one of dest and + // and namedDest may be non-NULL) +}; + +//------------------------------------------------------------------------ +// LinkGoToR +//------------------------------------------------------------------------ + +class LinkGoToR: public LinkAction { +public: + + // Build a LinkGoToR from a file spec (dictionary) and destination + // (dictionary, name, or string). + LinkGoToR(Object *fileSpecObj, Object *destObj); + + // Destructor. + virtual ~LinkGoToR(); + + // Was the LinkGoToR created successfully? + virtual GBool isOk() { return fileName && (dest || namedDest); } + + // Accessors. + virtual LinkActionKind getKind() { return actionGoToR; } + GString *getFileName() { return fileName; } + LinkDest *getDest() { return dest; } + GString *getNamedDest() { return namedDest; } + +private: + + GString *fileName; // file name + LinkDest *dest; // regular destination (NULL for remote + // link with bad destination) + GString *namedDest; // named destination (only one of dest and + // and namedDest may be non-NULL) +}; + +//------------------------------------------------------------------------ +// LinkLaunch +//------------------------------------------------------------------------ + +class LinkLaunch: public LinkAction { +public: + + // Build a LinkLaunch from an action dictionary. + LinkLaunch(Object *actionObj); + + // Destructor. + virtual ~LinkLaunch(); + + // Was the LinkLaunch created successfully? + virtual GBool isOk() { return fileName != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionLaunch; } + GString *getFileName() { return fileName; } + GString *getParams() { return params; } + +private: + + GString *fileName; // file name + GString *params; // parameters +}; + +//------------------------------------------------------------------------ +// LinkURI +//------------------------------------------------------------------------ + +class LinkURI: public LinkAction { +public: + + // Build a LinkURI given the URI (string) and base URI. + LinkURI(Object *uriObj, GString *baseURI); + + // Destructor. + virtual ~LinkURI(); + + // Was the LinkURI created successfully? + virtual GBool isOk() { return uri != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionURI; } + GString *getURI() { return uri; } + +private: + + GString *uri; // the URI +}; + +//------------------------------------------------------------------------ +// LinkNamed +//------------------------------------------------------------------------ + +class LinkNamed: public LinkAction { +public: + + // Build a LinkNamed given the action name. + LinkNamed(Object *nameObj); + + virtual ~LinkNamed(); + + virtual GBool isOk() { return name != NULL; } + + virtual LinkActionKind getKind() { return actionNamed; } + GString *getName() { return name; } + +private: + + GString *name; +}; + +//------------------------------------------------------------------------ +// LinkUnknown +//------------------------------------------------------------------------ + +class LinkUnknown: public LinkAction { +public: + + // Build a LinkUnknown with the specified action type. + LinkUnknown(char *action1); + + // Destructor. + virtual ~LinkUnknown(); + + // Was the LinkUnknown create successfully? + virtual GBool isOk() { return action != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionUnknown; } + GString *getAction() { return action; } + +private: + + GString *action; // action subtype +}; + +//------------------------------------------------------------------------ +// Link +//------------------------------------------------------------------------ + +class Link { +public: + + // Construct a link, given its dictionary. + Link(Dict *dict, GString *baseURI); + + // Destructor. + ~Link(); + + // Was the link created successfully? + GBool isOk() { return ok; } + + // Check if point is inside the link rectangle. + GBool inRect(double x, double y) + { return x1 <= x && x <= x2 && y1 <= y && y <= y2; } + + // Get action. + LinkAction *getAction() { return action; } + + // Get border corners and width. + void getBorder(double *xa1, double *ya1, double *xa2, double *ya2, + double *wa) + { *xa1 = x1; *ya1 = y1; *xa2 = x2; *ya2 = y2; *wa = borderW; } + +private: + + double x1, y1; // lower left corner + double x2, y2; // upper right corner + double borderW; // border width + LinkAction *action; // action + GBool ok; // is link valid? +}; + +//------------------------------------------------------------------------ +// Links +//------------------------------------------------------------------------ + +class Links { +public: + + // Extract links from array of annotations. + Links(Object *annots, GString *baseURI); + + // Destructor. + ~Links(); + + // Iterate through list of links. + int getNumLinks() { return numLinks; } + Link *getLink(int i) { return links[i]; } + + // If point , is in a link, return the associated action; + // else return NULL. + LinkAction *find(double x, double y); + + // Return true if , is in a link. + GBool onLink(double x, double y); + +private: + + Link **links; + int numLinks; +}; + +#endif diff --git a/pdf2swf/xpdf/Makefile.am b/pdf2swf/xpdf/Makefile.am new file mode 100644 index 00000000..eca0ce45 --- /dev/null +++ b/pdf2swf/xpdf/Makefile.am @@ -0,0 +1,11 @@ +## Process this file with automake to produce Makefile.in + +noinst_LIBRARIES = libpdf.a +libpdf_a_SOURCES = Array.cc Catalog.cc \ +Decrypt.cc Dict.cc Error.cc FontEncoding.cc FontFile.cc \ +FormWidget.cc GString.cc Gfx.cc GfxFont.cc GfxState.cc Lexer.cc \ +Link.cc Object.cc OutputDev.cc PDFDoc.cc Page.cc Params.cc \ +Parser.cc Stream.cc XRef.cc gfile.cc gmem.cc ##parseargs.cc +## this is a workaround. automake always tries to use $(COMPILE) +## for .c sources, which is not defined +COMPILE = $(CC) diff --git a/pdf2swf/xpdf/Makefile.in b/pdf2swf/xpdf/Makefile.in new file mode 100644 index 00000000..a9f18b3f --- /dev/null +++ b/pdf2swf/xpdf/Makefile.in @@ -0,0 +1,330 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 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. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = ../.. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +AWK = @AWK@ +CC = @CC@ +CPP = @CPP@ +CXX = @CXX@ +EXEEXT = @EXEEXT@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +LN_S = @LN_S@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ + +noinst_LIBRARIES = libpdf.a +libpdf_a_SOURCES = Array.cc Catalog.cc Decrypt.cc Dict.cc Error.cc FontEncoding.cc FontFile.cc FormWidget.cc GString.cc Gfx.cc GfxFont.cc GfxState.cc Lexer.cc Link.cc Object.cc OutputDev.cc PDFDoc.cc Page.cc Params.cc Parser.cc Stream.cc XRef.cc gfile.cc gmem.cc ##parseargs.cc + +COMPILE = $(CC) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../../config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I../.. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +libpdf_a_LIBADD = +libpdf_a_OBJECTS = Array.o Catalog.o Decrypt.o Dict.o Error.o \ +FontEncoding.o FontFile.o FormWidget.o GString.o Gfx.o GfxFont.o \ +GfxState.o Lexer.o Link.o Object.o OutputDev.o PDFDoc.o Page.o Params.o \ +Parser.o Stream.o XRef.o gfile.o gmem.o +AR = ar +CXXFLAGS = @CXXFLAGS@ +CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +DEP_FILES = .deps/Array.P .deps/Catalog.P .deps/Decrypt.P .deps/Dict.P \ +.deps/Error.P .deps/FontEncoding.P .deps/FontFile.P .deps/FormWidget.P \ +.deps/GString.P .deps/Gfx.P .deps/GfxFont.P .deps/GfxState.P \ +.deps/Lexer.P .deps/Link.P .deps/Object.P .deps/OutputDev.P \ +.deps/PDFDoc.P .deps/Page.P .deps/Params.P .deps/Parser.P \ +.deps/Stream.P .deps/XRef.P .deps/gfile.P .deps/gmem.P +SOURCES = $(libpdf_a_SOURCES) +OBJECTS = $(libpdf_a_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .cc .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu pdf2swf/xpdf/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-noinstLIBRARIES: + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +distclean-noinstLIBRARIES: + +maintainer-clean-noinstLIBRARIES: + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +libpdf.a: $(libpdf_a_OBJECTS) $(libpdf_a_DEPENDENCIES) + -rm -f libpdf.a + $(AR) cru libpdf.a $(libpdf_a_OBJECTS) $(libpdf_a_LIBADD) + $(RANLIB) libpdf.a +.cc.o: + $(CXXCOMPILE) -c $< + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = pdf2swf/xpdf + +distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu pdf2swf/xpdf/Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + +DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) + +-include $(DEP_FILES) + +mostlyclean-depend: + +clean-depend: + +distclean-depend: + -rm -rf .deps + +maintainer-clean-depend: + +%.o: %.c + @echo '$(COMPILE) -c $<'; \ + $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.c + @echo '$(LTCOMPILE) -c $<'; \ + $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp + +%.o: %.cc + @echo '$(CXXCOMPILE) -c $<'; \ + $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.cc + @echo '$(LTCXXCOMPILE) -c $<'; \ + $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile $(LIBRARIES) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ + mostlyclean-tags mostlyclean-depend mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-depend \ + clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-noinstLIBRARIES distclean-compile \ + distclean-tags distclean-depend distclean-generic \ + clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-depend maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ +clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir mostlyclean-depend \ +distclean-depend clean-depend maintainer-clean-depend info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-redirect all-am all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# 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/pdf2swf/xpdf/Object.cc b/pdf2swf/xpdf/Object.cc new file mode 100644 index 00000000..f9c10674 --- /dev/null +++ b/pdf2swf/xpdf/Object.cc @@ -0,0 +1,220 @@ +//======================================================================== +// +// Object.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Error.h" +#include "Stream.h" +#include "XRef.h" + +//------------------------------------------------------------------------ +// Object +//------------------------------------------------------------------------ + +char *objTypeNames[numObjTypes] = { + "boolean", + "integer", + "real", + "string", + "name", + "null", + "array", + "dictionary", + "stream", + "ref", + "cmd", + "error", + "eof", + "none" +}; + +#ifdef DEBUG_MEM +int Object::numAlloc[numObjTypes] = + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif + +Object *Object::initArray() { + initObj(objArray); + array = new Array(); + return this; +} + +Object *Object::initDict() { + initObj(objDict); + dict = new Dict(); + return this; +} + +Object *Object::initStream(Stream *stream1) { + initObj(objStream); + stream = stream1; + return this; +} + +Object *Object::copy(Object *obj) { + *obj = *this; + switch (type) { + case objString: + obj->string = string->copy(); + break; + case objName: + obj->name = copyString(name); + break; + case objArray: + array->incRef(); + break; + case objDict: + dict->incRef(); + break; + case objStream: + stream->incRef(); + break; + case objCmd: + obj->cmd = copyString(cmd); + break; + default: + break; + } +#ifdef DEBUG_MEM + ++numAlloc[type]; +#endif + return obj; +} + +Object *Object::fetch(Object *obj) { + return (type == objRef && xref) ? + xref->fetch(ref.num, ref.gen, obj) : copy(obj); +} + +void Object::free() { + switch (type) { + case objString: + delete string; + break; + case objName: + gfree(name); + break; + case objArray: + if (!array->decRef()) { + delete array; + } + break; + case objDict: + if (!dict->decRef()) { + delete dict; + } + break; + case objStream: + if (!stream->decRef()) { + delete stream; + } + break; + case objCmd: + gfree(cmd); + break; + default: + break; + } +#ifdef DEBUG_MEM + --numAlloc[type]; +#endif + type = objNone; +} + +char *Object::getTypeName() { + return objTypeNames[type]; +} + +void Object::print(FILE *f) { + Object obj; + int i; + + switch (type) { + case objBool: + fprintf(f, "%s", booln ? "true" : "false"); + break; + case objInt: + fprintf(f, "%d", intg); + break; + case objReal: + fprintf(f, "%g", real); + break; + case objString: + fprintf(f, "(%s)", string->getCString()); + break; + case objName: + fprintf(f, "/%s", name); + break; + case objNull: + fprintf(f, "null"); + break; + case objArray: + fprintf(f, "["); + for (i = 0; i < arrayGetLength(); ++i) { + if (i > 0) + fprintf(f, " "); + arrayGetNF(i, &obj); + obj.print(f); + obj.free(); + } + fprintf(f, "]"); + break; + case objDict: + fprintf(f, "<<"); + for (i = 0; i < dictGetLength(); ++i) { + fprintf(f, " /%s ", dictGetKey(i)); + dictGetValNF(i, &obj); + obj.print(f); + obj.free(); + } + fprintf(f, " >>"); + break; + case objStream: + fprintf(f, ""); + break; + case objRef: + fprintf(f, "%d %d R", ref.num, ref.gen); + break; + case objCmd: + fprintf(f, "%s", cmd); + break; + case objError: + fprintf(f, ""); + break; + case objEOF: + fprintf(f, ""); + break; + case objNone: + fprintf(f, ""); + break; + } +} + +void Object::memCheck(FILE *f) { +#ifdef DEBUG_MEM + int i; + int t; + + t = 0; + for (i = 0; i < numObjTypes; ++i) + t += numAlloc[i]; + if (t > 0) { + fprintf(f, "Allocated objects:\n"); + for (i = 0; i < numObjTypes; ++i) { + if (numAlloc[i] > 0) + fprintf(f, " %-20s: %6d\n", objTypeNames[i], numAlloc[i]); + } + } +#endif +} diff --git a/pdf2swf/xpdf/Object.h b/pdf2swf/xpdf/Object.h new file mode 100644 index 00000000..fa4f740b --- /dev/null +++ b/pdf2swf/xpdf/Object.h @@ -0,0 +1,300 @@ +//======================================================================== +// +// Object.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef OBJECT_H +#define OBJECT_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include +#include +#include "gtypes.h" +#include "gmem.h" +#include "GString.h" + +class Array; +class Dict; +class Stream; + +//------------------------------------------------------------------------ +// Ref +//------------------------------------------------------------------------ + +struct Ref { + int num; // object number + int gen; // generation number +}; + +//------------------------------------------------------------------------ +// object types +//------------------------------------------------------------------------ + +enum ObjType { + // simple objects + objBool, // boolean + objInt, // integer + objReal, // real + objString, // string + objName, // name + objNull, // null + + // complex objects + objArray, // array + objDict, // dictionary + objStream, // stream + objRef, // indirect reference + + // special objects + objCmd, // command name + objError, // error return from Lexer + objEOF, // end of file return from Lexer + objNone // uninitialized object +}; + +#define numObjTypes 14 // total number of object types + +//------------------------------------------------------------------------ +// Object +//------------------------------------------------------------------------ + +#ifdef DEBUG_MEM +#define initObj(t) ++numAlloc[type = t] +#else +#define initObj(t) type = t +#endif + +class Object { +public: + + // Default constructor. + Object(): + type(objNone) {} + + // Initialize an object. + Object *initBool(GBool booln1) + { initObj(objBool); booln = booln1; return this; } + Object *initInt(int intg1) + { initObj(objInt); intg = intg1; return this; } + Object *initReal(double real1) + { initObj(objReal); real = real1; return this; } + Object *initString(GString *string1) + { initObj(objString); string = string1; return this; } + Object *initName(char *name1) + { initObj(objName); name = copyString(name1); return this; } + Object *initNull() + { initObj(objNull); return this; } + Object *initArray(); + Object *initDict(); + Object *initDict(Dict *dict1) + { initObj(objDict); dict = dict1; return this; } + Object *initStream(Stream *stream1); + Object *initRef(int num1, int gen1) + { initObj(objRef); ref.num = num1; ref.gen = gen1; return this; } + Object *initCmd(char *cmd1) + { initObj(objCmd); cmd = copyString(cmd1); return this; } + Object *initError() + { initObj(objError); return this; } + Object *initEOF() + { initObj(objEOF); return this; } + + // Copy an object. + Object *copy(Object *obj); + + // If object is a Ref, fetch and return the referenced object. + // Otherwise, return a copy of the object. + Object *fetch(Object *obj); + + // Free object contents. + void free(); + + // Type checking. + ObjType getType() { return type; } + GBool isBool() { return type == objBool; } + GBool isInt() { return type == objInt; } + GBool isReal() { return type == objReal; } + GBool isNum() { return type == objInt || type == objReal; } + GBool isString() { return type == objString; } + GBool isName() { return type == objName; } + GBool isNull() { return type == objNull; } + GBool isArray() { return type == objArray; } + GBool isDict() { return type == objDict; } + GBool isStream() { return type == objStream; } + GBool isRef() { return type == objRef; } + GBool isCmd() { return type == objCmd; } + GBool isError() { return type == objError; } + GBool isEOF() { return type == objEOF; } + GBool isNone() { return type == objNone; } + + // Special type checking. + GBool isName(char *name1) + { return type == objName && !strcmp(name, name1); } + GBool isDict(char *dictType); + GBool isStream(char *dictType); + GBool isCmd(char *cmd1) + { return type == objCmd && !strcmp(cmd, cmd1); } + + // Accessors. NB: these assume object is of correct type. + GBool getBool() { return booln; } + int getInt() { return intg; } + double getReal() { return real; } + double getNum() { return type == objInt ? (double)intg : real; } + GString *getString() { return string; } + char *getName() { return name; } + Array *getArray() { return array; } + Dict *getDict() { return dict; } + Stream *getStream() { return stream; } + Ref getRef() { return ref; } + int getRefNum() { return ref.num; } + int getRefGen() { return ref.gen; } + + // Array accessors. + int arrayGetLength(); + void arrayAdd(Object *elem); + Object *arrayGet(int i, Object *obj); + Object *arrayGetNF(int i, Object *obj); + + // Dict accessors. + int dictGetLength(); + void dictAdd(char *key, Object *val); + GBool dictIs(char *dictType); + Object *dictLookup(char *key, Object *obj); + Object *dictLookupNF(char *key, Object *obj); + char *dictGetKey(int i); + Object *dictGetVal(int i, Object *obj); + Object *dictGetValNF(int i, Object *obj); + + // Stream accessors. + GBool streamIs(char *dictType); + void streamReset(); + void streamClose(); + int streamGetChar(); + int streamLookChar(); + char *streamGetLine(char *buf, int size); + int streamGetPos(); + void streamSetPos(int pos); + Dict *streamGetDict(); + + // Output. + char *getTypeName(); + void print(FILE *f = stdout); + + // Memory testing. + static void memCheck(FILE *f); + +private: + + ObjType type; // object type + union { // value for each type: + GBool booln; // boolean + int intg; // integer + double real; // real + GString *string; // string + char *name; // name + Array *array; // array + Dict *dict; // dictionary + Stream *stream; // stream + Ref ref; // indirect reference + char *cmd; // command + }; + +#ifdef DEBUG_MEM + static int // number of each type of object + numAlloc[numObjTypes]; // currently allocated +#endif +}; + +//------------------------------------------------------------------------ +// Array accessors. +//------------------------------------------------------------------------ + +#include "Array.h" + +inline int Object::arrayGetLength() + { return array->getLength(); } + +inline void Object::arrayAdd(Object *elem) + { array->add(elem); } + +inline Object *Object::arrayGet(int i, Object *obj) + { return array->get(i, obj); } + +inline Object *Object::arrayGetNF(int i, Object *obj) + { return array->getNF(i, obj); } + +//------------------------------------------------------------------------ +// Dict accessors. +//------------------------------------------------------------------------ + +#include "Dict.h" + +inline int Object::dictGetLength() + { return dict->getLength(); } + +inline void Object::dictAdd(char *key, Object *val) + { dict->add(key, val); } + +inline GBool Object::dictIs(char *dictType) + { return dict->is(dictType); } + +inline GBool Object::isDict(char *dictType) + { return type == objDict && dictIs(dictType); } + +inline Object *Object::dictLookup(char *key, Object *obj) + { return dict->lookup(key, obj); } + +inline Object *Object::dictLookupNF(char *key, Object *obj) + { return dict->lookupNF(key, obj); } + +inline char *Object::dictGetKey(int i) + { return dict->getKey(i); } + +inline Object *Object::dictGetVal(int i, Object *obj) + { return dict->getVal(i, obj); } + +inline Object *Object::dictGetValNF(int i, Object *obj) + { return dict->getValNF(i, obj); } + +//------------------------------------------------------------------------ +// Stream accessors. +//------------------------------------------------------------------------ + +#include "Stream.h" + +inline GBool Object::streamIs(char *dictType) + { return stream->getDict()->is(dictType); } + +inline GBool Object::isStream(char *dictType) + { return type == objStream && streamIs(dictType); } + +inline void Object::streamReset() + { stream->reset(); } + +inline void Object::streamClose() + { stream->close(); } + +inline int Object::streamGetChar() + { return stream->getChar(); } + +inline int Object::streamLookChar() + { return stream->lookChar(); } + +inline char *Object::streamGetLine(char *buf, int size) + { return stream->getLine(buf, size); } + +inline int Object::streamGetPos() + { return stream->getPos(); } + +inline void Object::streamSetPos(int pos) + { stream->setPos(pos); } + +inline Dict *Object::streamGetDict() + { return stream->getDict(); } + +#endif diff --git a/pdf2swf/xpdf/OutputDev.cc b/pdf2swf/xpdf/OutputDev.cc new file mode 100644 index 00000000..eebf4605 --- /dev/null +++ b/pdf2swf/xpdf/OutputDev.cc @@ -0,0 +1,93 @@ +//======================================================================== +// +// OutputDev.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Stream.h" +#include "GfxState.h" +#include "OutputDev.h" + +//------------------------------------------------------------------------ +// OutputDev +//------------------------------------------------------------------------ + +void OutputDev::setDefaultCTM(double *ctm1) { + int i; + double det; + + for (i = 0; i < 6; ++i) + ctm[i] = ctm1[i]; + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; +} + +void OutputDev::cvtDevToUser(int dx, int dy, double *ux, double *uy) { + *ux = ictm[0] * dx + ictm[2] * dy + ictm[4]; + *uy = ictm[1] * dx + ictm[3] * dy + ictm[5]; +} + +void OutputDev::cvtUserToDev(double ux, double uy, int *dx, int *dy) { + *dx = (int)(ctm[0] * ux + ctm[2] * uy + ctm[4] + 0.5); + *dy = (int)(ctm[1] * ux + ctm[3] * uy + ctm[5] + 0.5); +} + +void OutputDev::updateAll(GfxState *state) { + updateLineDash(state); + updateFlatness(state); + updateLineJoin(state); + updateLineCap(state); + updateMiterLimit(state); + updateLineWidth(state); + updateFillColor(state); + updateStrokeColor(state); + updateFont(state); +} + +void OutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg) { + int i, j; + + if (inlineImg) { + str->reset(); + j = height * ((width + 7) / 8); + for (i = 0; i < j; ++i) + str->getChar(); + } +} + +void OutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool inlineImg) { + int i, j; + + if (inlineImg) { + str->reset(); + j = height * ((width * colorMap->getNumPixelComps() * + colorMap->getBits() + 7) / 8); + for (i = 0; i < j; ++i) + str->getChar(); + } +} + +#if OPI_SUPPORT +void OutputDev::opiBegin(GfxState *state, Dict *opiDict) { +} + +void OutputDev::opiEnd(GfxState *state, Dict *opiDict) { +} +#endif diff --git a/pdf2swf/xpdf/OutputDev.h b/pdf2swf/xpdf/OutputDev.h new file mode 100644 index 00000000..d7de97ab --- /dev/null +++ b/pdf2swf/xpdf/OutputDev.h @@ -0,0 +1,140 @@ +//======================================================================== +// +// OutputDev.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef OUTPUTDEV_H +#define OUTPUTDEV_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "gtypes.h" + +class GString; +class GfxState; +class GfxColorSpace; +class GfxImageColorMap; +class Stream; +class Link; +class Catalog; + +//------------------------------------------------------------------------ +// OutputDev +//------------------------------------------------------------------------ + +class OutputDev { +public: + + // Constructor. + OutputDev() {} + + // Destructor. + virtual ~OutputDev() {} + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() = 0; + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() = 0; + + //----- initialization and control + + // Set default transform matrix. + virtual void setDefaultCTM(double *ctm1); + + // Start a page. + virtual void startPage(int pageNum, GfxState *state) {} + + // End a page. + virtual void endPage() {} + + // Dump page contents to display. + virtual void dump() {} + + //----- coordinate conversion + + // Convert between device and user coordinates. + virtual void cvtDevToUser(int dx, int dy, double *ux, double *uy); + virtual void cvtUserToDev(double ux, double uy, int *dx, int *dy); + + //----- link borders + virtual void drawLink(Link *link, Catalog *catalog) {} + + //----- save/restore graphics state + virtual void saveState(GfxState *state) {} + virtual void restoreState(GfxState *state) {} + + //----- update graphics state + virtual void updateAll(GfxState *state); + virtual void updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32) {} + virtual void updateLineDash(GfxState *state) {} + virtual void updateFlatness(GfxState *state) {} + virtual void updateLineJoin(GfxState *state) {} + virtual void updateLineCap(GfxState *state) {} + virtual void updateMiterLimit(GfxState *state) {} + virtual void updateLineWidth(GfxState *state) {} + virtual void updateFillColor(GfxState *state) {} + virtual void updateStrokeColor(GfxState *state) {} + virtual void updateFillOpacity(GfxState *state) {} + virtual void updateStrokeOpacity(GfxState *state) {} + + //----- update text state + virtual void updateFont(GfxState *state) {} + virtual void updateTextMat(GfxState *state) {} + virtual void updateCharSpace(GfxState *state) {} + virtual void updateRender(GfxState *state) {} + virtual void updateRise(GfxState *state) {} + virtual void updateWordSpace(GfxState *state) {} + virtual void updateHorizScaling(GfxState *state) {} + virtual void updateTextPos(GfxState *state) {} + virtual void updateTextShift(GfxState *state, double shift) {} + + //----- path painting + virtual void stroke(GfxState *state) {} + virtual void fill(GfxState *state) {} + virtual void eoFill(GfxState *state) {} + + //----- path clipping + virtual void clip(GfxState *state) {} + virtual void eoClip(GfxState *state) {} + + //----- text drawing + virtual void beginString(GfxState *state, GString *s) {} + virtual void endString(GfxState *state) {} + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, Guchar c) {} + virtual void drawChar16(GfxState *state, double x, double y, + double dx, double dy, int c) {} + virtual void drawString(GfxState *state, GString *s) {} + virtual void drawString16(GfxState *state, GString *s) {} + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool inlineImg); + +#if OPI_SUPPORT + //----- OPI functions + virtual void opiBegin(GfxState *state, Dict *opiDict); + virtual void opiEnd(GfxState *state, Dict *opiDict); +#endif + +private: + + double ctm[6]; // coordinate transform matrix + double ictm[6]; // inverse CTM +}; + +#endif diff --git a/pdf2swf/xpdf/PDFDoc.cc b/pdf2swf/xpdf/PDFDoc.cc new file mode 100644 index 00000000..ae55d231 --- /dev/null +++ b/pdf2swf/xpdf/PDFDoc.cc @@ -0,0 +1,251 @@ +//======================================================================== +// +// PDFDoc.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include +#include "GString.h" +#include "config.h" +#include "Page.h" +#include "Catalog.h" +#include "Stream.h" +#include "XRef.h" +#include "Link.h" +#include "OutputDev.h" +#include "Params.h" +#include "Error.h" +#include "Lexer.h" +#include "Parser.h" +#include "PDFDoc.h" + +//------------------------------------------------------------------------ + +#define headerSearchSize 1024 // read this many bytes at beginning of + // file to look for '%PDF' + +//------------------------------------------------------------------------ +// PDFDoc +//------------------------------------------------------------------------ + +PDFDoc::PDFDoc(GString *fileName1, GString *userPassword) { + Object obj; + GString *fileName2; + + ok = gFalse; + + file = NULL; + str = NULL; + xref = NULL; + catalog = NULL; + links = NULL; + + // try to open file + fileName = fileName1; + fileName2 = NULL; +#ifdef VMS + if (!(file = fopen(fileName->getCString(), "rb", "ctx=stm"))) { + error(-1, "Couldn't open file '%s'", fileName->getCString()); + return; + } +#else + if (!(file = fopen(fileName->getCString(), "rb"))) { + fileName2 = fileName->copy(); + fileName2->lowerCase(); + if (!(file = fopen(fileName2->getCString(), "rb"))) { + fileName2->upperCase(); + if (!(file = fopen(fileName2->getCString(), "rb"))) { + error(-1, "Couldn't open file '%s'", fileName->getCString()); + delete fileName2; + return; + } + } + delete fileName2; + } +#endif + + // create stream + obj.initNull(); + str = new FileStream(file, 0, -1, &obj); + + ok = setup(userPassword); +} + +PDFDoc::PDFDoc(BaseStream *str, GString *userPassword) { + ok = gFalse; + fileName = NULL; + file = NULL; + this->str = str; + xref = NULL; + catalog = NULL; + links = NULL; + ok = setup(userPassword); +} + +GBool PDFDoc::setup(GString *userPassword) { + Object catObj; + + // check header + checkHeader(); + + // read xref table + xref = new XRef(str, userPassword); + if (!xref->isOk()) { + error(-1, "Couldn't read xref table"); + return gFalse; + } + + // read catalog + catalog = new Catalog(xref->getCatalog(&catObj)); + catObj.free(); + if (!catalog->isOk()) { + error(-1, "Couldn't read page catalog"); + return gFalse; + } + + // done + return gTrue; +} + +PDFDoc::~PDFDoc() { + if (catalog) { + delete catalog; + } + if (xref) { + delete xref; + } + if (str) { + delete str; + } + if (file) { + fclose(file); + } + if (fileName) { + delete fileName; + } + if (links) { + delete links; + } +} + +// Check for a PDF header on this stream. Skip past some garbage +// if necessary. +void PDFDoc::checkHeader() { + char hdrBuf[headerSearchSize+1]; + char *p; + int i; + + pdfVersion = 0; + for (i = 0; i < headerSearchSize; ++i) { + hdrBuf[i] = str->getChar(); + } + hdrBuf[headerSearchSize] = '\0'; + for (i = 0; i < headerSearchSize - 5; ++i) { + if (!strncmp(&hdrBuf[i], "%PDF-", 5)) { + break; + } + } + if (i >= headerSearchSize - 5) { + error(-1, "May not be a PDF file (continuing anyway)"); + return; + } + str->moveStart(i); + p = strtok(&hdrBuf[i+5], " \t\n\r"); + pdfVersion = atof(p); + if (!(hdrBuf[i+5] >= '0' && hdrBuf[i+5] <= '9') || + pdfVersion > supportedPDFVersionNum + 0.0001) { + error(-1, "PDF version %s -- xpdf supports version %s" + " (continuing anyway)", p, supportedPDFVersionStr); + } +} + +void PDFDoc::displayPage(OutputDev *out, int page, double zoom, + int rotate, GBool doLinks) { + Page *p; + + if (printCommands) { + printf("***** page %d *****\n", page); + } + p = catalog->getPage(page); + if (doLinks) { + if (links) { + delete links; + } + getLinks(p); + p->display(out, zoom, rotate, links, catalog); + } else { + p->display(out, zoom, rotate, NULL, catalog); + } +} + +void PDFDoc::displayPages(OutputDev *out, int firstPage, int lastPage, + int zoom, int rotate, GBool doLinks) { + int page; + + for (page = firstPage; page <= lastPage; ++page) { + displayPage(out, page, zoom, rotate, doLinks); + } +} + +GBool PDFDoc::isLinearized() { + Parser *parser; + Object obj1, obj2, obj3, obj4, obj5; + GBool lin; + + lin = gFalse; + obj1.initNull(); + parser = new Parser(new Lexer(str->makeSubStream(str->getStart(), + -1, &obj1))); + parser->getObj(&obj1); + parser->getObj(&obj2); + parser->getObj(&obj3); + parser->getObj(&obj4); + if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") && + obj4.isDict()) { + obj4.dictLookup("Linearized", &obj5); + if (obj5.isNum() && obj5.getNum() > 0) { + lin = gTrue; + } + obj5.free(); + } + obj4.free(); + obj3.free(); + obj2.free(); + obj1.free(); + delete parser; + return lin; +} + +GBool PDFDoc::saveAs(GString *name) { + FILE *f; + int c; + + if (!(f = fopen(name->getCString(), "wb"))) { + error(-1, "Couldn't open file '%s'", name->getCString()); + return gFalse; + } + str->reset(); + while ((c = str->getChar()) != EOF) { + fputc(c, f); + } + str->close(); + fclose(f); + return gTrue; +} + +void PDFDoc::getLinks(Page *page) { + Object obj; + + links = new Links(page->getAnnots(&obj), catalog->getBaseURI()); + obj.free(); +} + diff --git a/pdf2swf/xpdf/PDFDoc.h b/pdf2swf/xpdf/PDFDoc.h new file mode 100644 index 00000000..e679db97 --- /dev/null +++ b/pdf2swf/xpdf/PDFDoc.h @@ -0,0 +1,125 @@ +//======================================================================== +// +// PDFDoc.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef PDFDOC_H +#define PDFDOC_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include +#include "Link.h" +#include "Catalog.h" +#include "Page.h" + +class GString; +class BaseStream; +class XRef; +class OutputDev; +class Links; +class LinkAction; +class LinkDest; + +//------------------------------------------------------------------------ +// PDFDoc +//------------------------------------------------------------------------ + +class PDFDoc { +public: + + PDFDoc(GString *fileName1, GString *userPassword = NULL); + PDFDoc(BaseStream *str, GString *userPassword = NULL); + ~PDFDoc(); + + // Was PDF document successfully opened? + GBool isOk() { return ok; } + + // Get file name. + GString *getFileName() { return fileName; } + + // Get catalog. + Catalog *getCatalog() { return catalog; } + + // Get base stream. + BaseStream *getBaseStream() { return str; } + + // Get page parameters. + double getPageWidth(int page) + { return catalog->getPage(page)->getWidth(); } + double getPageHeight(int page) + { return catalog->getPage(page)->getHeight(); } + int getPageRotate(int page) + { return catalog->getPage(page)->getRotate(); } + + // Get number of pages. + int getNumPages() { return catalog->getNumPages(); } + + // Display a page. + void displayPage(OutputDev *out, int page, double zoom, + int rotate, GBool doLinks); + + // Display a range of pages. + void displayPages(OutputDev *out, int firstPage, int lastPage, + int zoom, int rotate, GBool doLinks); + + // Find a page, given its object ID. Returns page number, or 0 if + // not found. + int findPage(int num, int gen) { return catalog->findPage(num, gen); } + + // If point , is in a link, return the associated action; + // else return NULL. + LinkAction *findLink(double x, double y) { return links->find(x, y); } + + // Return true if , is in a link. + GBool onLink(double x, double y) { return links->onLink(x, y); } + + // Find a named destination. Returns the link destination, or + // NULL if is not a destination. + LinkDest *findDest(GString *name) + { return catalog->findDest(name); } + + // Is the file encrypted? + GBool isEncrypted() { return xref->isEncrypted(); } + + // Check various permissions. + GBool okToPrint() { return xref->okToPrint(); } + GBool okToChange() { return xref->okToChange(); } + GBool okToCopy() { return xref->okToCopy(); } + GBool okToAddNotes() { return xref->okToAddNotes(); } + + // Is this document linearized? + GBool isLinearized(); + + // Return the document's Info dictionary (if any). + Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); } + + // Return the PDF version specified by the file. + double getPDFVersion() { return pdfVersion; } + + // Save this file with another name. + GBool saveAs(GString *name); + +private: + + GBool setup(GString *userPassword); + void checkHeader(); + void getLinks(Page *page); + + GString *fileName; + FILE *file; + BaseStream *str; + double pdfVersion; + XRef *xref; + Catalog *catalog; + Links *links; + + GBool ok; +}; + +#endif diff --git a/pdf2swf/xpdf/Page.cc b/pdf2swf/xpdf/Page.cc new file mode 100644 index 00000000..c2ac6b19 --- /dev/null +++ b/pdf2swf/xpdf/Page.cc @@ -0,0 +1,245 @@ +//======================================================================== +// +// Page.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Link.h" +#include "OutputDev.h" +#ifndef PDF_PARSER_ONLY +#include "Gfx.h" +#include "FormWidget.h" +#endif +#include "Error.h" + +#include "Params.h" +#include "Page.h" + +//------------------------------------------------------------------------ +// PageAttrs +//------------------------------------------------------------------------ + +PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) { + Object obj1, obj2; + double w, h; + + // get old/default values + if (attrs) { + x1 = attrs->x1; + y1 = attrs->y1; + x2 = attrs->x2; + y2 = attrs->y2; + cropX1 = attrs->cropX1; + cropY1 = attrs->cropY1; + cropX2 = attrs->cropX2; + cropY2 = attrs->cropY2; + rotate = attrs->rotate; + attrs->resources.copy(&resources); + } else { + // set default MediaBox to 8.5" x 11" -- this shouldn't be necessary + // but some (non-compliant) PDF files don't specify a MediaBox + x1 = 0; + y1 = 0; + x2 = 612; + y2 = 792; + cropX1 = cropY1 = cropX2 = cropY2 = 0; + rotate = 0; + resources.initNull(); + } + + // media box + dict->lookup("MediaBox", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 4) { + obj1.arrayGet(0, &obj2); + if (obj2.isNum()) + x1 = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + if (obj2.isNum()) + y1 = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2, &obj2); + if (obj2.isNum()) + x2 = obj2.getNum(); + obj2.free(); + obj1.arrayGet(3, &obj2); + if (obj2.isNum()) + y2 = obj2.getNum(); + obj2.free(); + } + obj1.free(); + + // crop box + dict->lookup("CropBox", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 4) { + obj1.arrayGet(0, &obj2); + if (obj2.isNum()) + cropX1 = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + if (obj2.isNum()) + cropY1 = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2, &obj2); + if (obj2.isNum()) + cropX2 = obj2.getNum(); + obj2.free(); + obj1.arrayGet(3, &obj2); + if (obj2.isNum()) + cropY2 = obj2.getNum(); + obj2.free(); + } + obj1.free(); + + // if the MediaBox is excessively larger than the CropBox, + // just use the CropBox + limitToCropBox = gFalse; + w = 0.25 * (cropX2 - cropX1); + h = 0.25 * (cropY2 - cropY1); + if (cropX2 > cropX1 && + ((cropX1 - x1) + (x2 - cropX2) > w || + (cropY1 - y1) + (y2 - cropY2) > h)) { + limitToCropBox = gTrue; + } + + // rotate + dict->lookup("Rotate", &obj1); + if (obj1.isInt()) + rotate = obj1.getInt(); + obj1.free(); + while (rotate < 0) + rotate += 360; + while (rotate >= 360) + rotate -= 360; + + // resource dictionary + dict->lookup("Resources", &obj1); + if (obj1.isDict()) { + resources.free(); + obj1.copy(&resources); + } + obj1.free(); +} + +PageAttrs::~PageAttrs() { + resources.free(); +} + +//------------------------------------------------------------------------ +// Page +//------------------------------------------------------------------------ + +Page::Page(int num1, Dict *pageDict, PageAttrs *attrs1) { + + ok = gTrue; + num = num1; + + // get attributes + attrs = attrs1; + + // annotations + pageDict->lookupNF("Annots", &annots); + if (!(annots.isRef() || annots.isArray() || annots.isNull())) { + error(-1, "Page annotations object (page %d) is wrong type (%s)", + num, annots.getTypeName()); + annots.free(); + goto err2; + } + + // contents + pageDict->lookupNF("Contents", &contents); + if (!(contents.isRef() || contents.isArray() || + contents.isNull())) { + error(-1, "Page contents object (page %d) is wrong type (%s)", + num, contents.getTypeName()); + contents.free(); + goto err1; + } + + return; + + err2: + annots.initNull(); + err1: + contents.initNull(); + ok = gFalse; +} + +Page::~Page() { + delete attrs; + annots.free(); + contents.free(); +} + +void Page::display(OutputDev *out, double dpi, int rotate, + Links *links, Catalog *catalog) { +#ifndef PDF_PARSER_ONLY + Gfx *gfx; + Object obj; + Link *link; + int i; + FormWidgets *formWidgets; + + if (printCommands) { + printf("***** MediaBox = ll:%g,%g ur:%g,%g\n", + getX1(), getY1(), getX2(), getY2()); + if (isCropped()) { + printf("***** CropBox = ll:%g,%g ur:%g,%g\n", + getCropX1(), getCropY1(), getCropX2(), getCropY2()); + } + printf("***** Rotate = %d\n", attrs->getRotate()); + } + + rotate += getRotate(); + if (rotate >= 360) { + rotate -= 360; + } else if (rotate < 0) { + rotate += 360; + } + gfx = new Gfx(out, num, attrs->getResourceDict(), + dpi, getX1(), getY1(), getX2(), getY2(), isCropped(), + getCropX1(), getCropY1(), getCropX2(), getCropY2(), rotate); + contents.fetch(&obj); + if (!obj.isNull()) { + gfx->display(&obj); + } + obj.free(); + + // draw links + if (links) { + for (i = 0; i < links->getNumLinks(); ++i) { + link = links->getLink(i); + out->drawLink(link, catalog); + } + out->dump(); + } + + // draw AcroForm widgets + //~ need to reset CTM ??? + formWidgets = new FormWidgets(annots.fetch(&obj)); + obj.free(); + if (printCommands && formWidgets->getNumWidgets() > 0) { + printf("***** AcroForm widgets\n"); + } + for (i = 0; i < formWidgets->getNumWidgets(); ++i) { + formWidgets->getWidget(i)->draw(gfx); + } + if (formWidgets->getNumWidgets() > 0) { + out->dump(); + } + delete formWidgets; + + delete gfx; +#endif +} diff --git a/pdf2swf/xpdf/Page.h b/pdf2swf/xpdf/Page.h new file mode 100644 index 00000000..a144d2cf --- /dev/null +++ b/pdf2swf/xpdf/Page.h @@ -0,0 +1,114 @@ +//======================================================================== +// +// Page.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef PAGE_H +#define PAGE_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "Object.h" + +class Dict; +class XRef; +class OutputDev; +class Links; +class Catalog; + +//------------------------------------------------------------------------ +// PageAttrs +//------------------------------------------------------------------------ + +class PageAttrs { +public: + + // Construct a new PageAttrs object by merging a dictionary + // (of type Pages or Page) into another PageAttrs object. If + // is NULL, uses defaults. + PageAttrs(PageAttrs *attrs, Dict *dict); + + // Destructor. + ~PageAttrs(); + + // Accessors. + double getX1() { return limitToCropBox ? cropX1 : x1; } + double getY1() { return limitToCropBox ? cropY1 : y1; } + double getX2() { return limitToCropBox ? cropX2 : x2; } + double getY2() { return limitToCropBox ? cropY2 : y2; } + GBool isCropped() { return cropX2 > cropX1; } + double getCropX1() { return cropX1; } + double getCropY1() { return cropY1; } + double getCropX2() { return cropX2; } + double getCropY2() { return cropY2; } + int getRotate() { return rotate; } + Dict *getResourceDict() + { return resources.isDict() ? resources.getDict() : (Dict *)NULL; } + +private: + + double x1, y1, x2, y2; + double cropX1, cropY1, cropX2, cropY2; + GBool limitToCropBox; + int rotate; + Object resources; +}; + +//------------------------------------------------------------------------ +// Page +//------------------------------------------------------------------------ + +class Page { +public: + + // Constructor. + Page(int num1, Dict *pageDict, PageAttrs *attrs1); + + // Destructor. + ~Page(); + + // Is page valid? + GBool isOk() { return ok; } + + // Get page parameters. + double getX1() { return attrs->getX1(); } + double getY1() { return attrs->getY1(); } + double getX2() { return attrs->getX2(); } + double getY2() { return attrs->getY2(); } + GBool isCropped() { return attrs->isCropped(); } + double getCropX1() { return attrs->getCropX1(); } + double getCropY1() { return attrs->getCropY1(); } + double getCropX2() { return attrs->getCropX2(); } + double getCropY2() { return attrs->getCropY2(); } + double getWidth() { return attrs->getX2() - attrs->getX1(); } + double getHeight() { return attrs->getY2() - attrs->getY1(); } + int getRotate() { return attrs->getRotate(); } + + // Get resource dictionary. + Dict *getResourceDict() { return attrs->getResourceDict(); } + + // Get annotations array. + Object *getAnnots(Object *obj) { return annots.fetch(obj); } + + // Get contents. + Object *getContents(Object *obj) { return contents.fetch(obj); } + + // Display a page. + void display(OutputDev *out, double dpi, int rotate, + Links *links, Catalog *catalog); + +private: + + int num; // page number + PageAttrs *attrs; // page attributes + Object annots; // annotations array + Object contents; // page contents + GBool ok; // true if page is valid +}; + +#endif diff --git a/pdf2swf/xpdf/Params.cc b/pdf2swf/xpdf/Params.cc new file mode 100644 index 00000000..35adfdfe --- /dev/null +++ b/pdf2swf/xpdf/Params.cc @@ -0,0 +1,87 @@ +//======================================================================== +// +// Params.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#include +#include +#include +#include +#include "gtypes.h" +#include "gmem.h" +#include "GString.h" +#include "gfile.h" +#include "Params.h" + +char **fontPath = NULL; +static int fontPathLen, fontPathSize; + +DevFontMapEntry *devFontMap = NULL; +static int devFontMapLen, devFontMapSize; + +void initParams(char *configFile) { + GString *fileName; + FILE *f; + char buf[256]; + char *p, *q; + + // initialize font path and font map + fontPath = (char **)gmalloc((fontPathSize = 8) * sizeof(char *)); + fontPath[fontPathLen = 0] = NULL; + devFontMap = (DevFontMapEntry *)gmalloc((devFontMapSize = 8) * + sizeof(DevFontMapEntry)); + devFontMap[devFontMapLen = 0].pdfFont = NULL; + + // read config file + fileName = appendToPath(getHomeDir(), configFile); + if ((f = fopen(fileName->getCString(), "r"))) { + while (fgets(buf, sizeof(buf)-1, f)) { + buf[sizeof(buf)-1] = '\0'; + p = strtok(buf, " \t\n\r"); + if (p && !strcmp(p, "fontpath")) { + if (fontPathLen+1 >= fontPathSize) + fontPath = (char **) + grealloc(fontPath, (fontPathSize += 8) * sizeof(char *)); + p = strtok(NULL, " \t\n\r"); + fontPath[fontPathLen++] = copyString(p); + } else if (p && !strcmp(p, "fontmap")) { + if (devFontMapLen+1 >= devFontMapSize) + devFontMap = (DevFontMapEntry *) + grealloc(devFontMap, + (devFontMapSize += 8) * sizeof(DevFontMapEntry)); + p = strtok(NULL, " \t\n\r"); + devFontMap[devFontMapLen].pdfFont = copyString(p); + p = strtok(NULL, "\t\n\r"); + while (*p == ' ') + ++p; + for (q = p + strlen(p) - 1; q >= p && *q == ' '; --q) ; + q[1] = '\0'; + devFontMap[devFontMapLen++].devFont = copyString(p); + } + } + fclose(f); + fontPath[fontPathLen] = NULL; + devFontMap[devFontMapLen].pdfFont = NULL; + } + delete fileName; +} + +void freeParams() { + int i; + + if (fontPath) { + for (i = 0; i < fontPathLen; ++i) + gfree(fontPath[i]); + gfree(fontPath); + } + if (devFontMap) { + for (i = 0; i < devFontMapLen; ++i) { + gfree(devFontMap[i].pdfFont); + gfree(devFontMap[i].devFont); + } + gfree(devFontMap); + } +} diff --git a/pdf2swf/xpdf/Params.h b/pdf2swf/xpdf/Params.h new file mode 100644 index 00000000..ea8536fa --- /dev/null +++ b/pdf2swf/xpdf/Params.h @@ -0,0 +1,37 @@ +//======================================================================== +// +// Params.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef PARAMS_H +#define PARAMS_H + +// Print commands as they're executed. +extern GBool printCommands; + +// If this is set, error messages will be silently discarded. +extern GBool errQuiet; + +// Font search path. +extern char **fontPath; + +// Mapping from PDF font name to device font name. +struct DevFontMapEntry { + char *pdfFont; + char *devFont; +}; +extern DevFontMapEntry *devFontMap; + +//------------------------------------------------------------------------ + +// Initialize font path and font map, and read configuration file, +// if present. +extern void initParams(char *configFile); + +// Free memory used for font path and font map. +extern void freeParams(); + +#endif diff --git a/pdf2swf/xpdf/Parser.cc b/pdf2swf/xpdf/Parser.cc new file mode 100644 index 00000000..6ad0c5a7 --- /dev/null +++ b/pdf2swf/xpdf/Parser.cc @@ -0,0 +1,209 @@ +//======================================================================== +// +// Parser.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Parser.h" +#include "XRef.h" +#include "Error.h" +#ifndef NO_DECRYPTION +#include "Decrypt.h" +#endif + +Parser::Parser(Lexer *lexer1) { + lexer = lexer1; + inlineImg = 0; + lexer->getObj(&buf1); + lexer->getObj(&buf2); +} + +Parser::~Parser() { + buf1.free(); + buf2.free(); + delete lexer; +} + +#ifndef NO_DECRYPTION +Object *Parser::getObj(Object *obj, + Guchar *fileKey, int objNum, int objGen) { +#else +Object *Parser::getObj(Object *obj) { +#endif + char *key; + Stream *str; + Object obj2; + int num; +#ifndef NO_DECRYPTION + Decrypt *decrypt; + GString *s; + char *p; + int i; +#endif + + // refill buffer after inline image data + if (inlineImg == 2) { + buf1.free(); + buf2.free(); + lexer->getObj(&buf1); + lexer->getObj(&buf2); + inlineImg = 0; + } + + // array + if (buf1.isCmd("[")) { + shift(); + obj->initArray(); + while (!buf1.isCmd("]") && !buf1.isEOF()) +#ifndef NO_DECRYPTION + obj->arrayAdd(getObj(&obj2, fileKey, objNum, objGen)); +#else + obj->arrayAdd(getObj(&obj2)); +#endif + if (buf1.isEOF()) + error(getPos(), "End of file inside array"); + shift(); + + // dictionary or stream + } else if (buf1.isCmd("<<")) { + shift(); + obj->initDict(); + while (!buf1.isCmd(">>") && !buf1.isEOF()) { + if (!buf1.isName()) { + error(getPos(), "Dictionary key must be a name object"); + shift(); + } else { + key = copyString(buf1.getName()); + shift(); + if (buf1.isEOF() || buf1.isError()) + break; +#ifndef NO_DECRYPTION + obj->dictAdd(key, getObj(&obj2, fileKey, objNum, objGen)); +#else + obj->dictAdd(key, getObj(&obj2)); +#endif + } + } + if (buf1.isEOF()) + error(getPos(), "End of file inside dictionary"); + if (buf2.isCmd("stream")) { + if ((str = makeStream(obj))) { + obj->initStream(str); +#ifndef NO_DECRYPTION + if (fileKey) { + str->getBaseStream()->doDecryption(fileKey, objNum, objGen); + } +#endif + } else { + obj->free(); + obj->initError(); + } + } else { + shift(); + } + + // indirect reference or integer + } else if (buf1.isInt()) { + num = buf1.getInt(); + shift(); + if (buf1.isInt() && buf2.isCmd("R")) { + obj->initRef(num, buf1.getInt()); + shift(); + shift(); + } else { + obj->initInt(num); + } + +#ifndef NO_DECRYPTION + // string + } else if (buf1.isString() && fileKey) { + buf1.copy(obj); + s = obj->getString(); + decrypt = new Decrypt(fileKey, objNum, objGen); + for (i = 0, p = obj->getString()->getCString(); + i < s->getLength(); + ++i, ++p) { + *p = decrypt->decryptByte(*p); + } + delete decrypt; + shift(); +#endif + + // simple object + } else { + buf1.copy(obj); + shift(); + } + + return obj; +} + +Stream *Parser::makeStream(Object *dict) { + Object obj; + Stream *str; + int pos, endPos, length; + + // get stream start position + lexer->skipToNextLine(); + pos = lexer->getPos(); + + // get length + dict->dictLookup("Length", &obj); + if (obj.isInt()) { + length = obj.getInt(); + obj.free(); + } else { + error(getPos(), "Bad 'Length' attribute in stream"); + obj.free(); + return NULL; + } + + // check for length in damaged file + if ((endPos = xref->getStreamEnd(pos)) >= 0) { + length = endPos - pos; + } + + // make base stream + str = lexer->getStream()->getBaseStream()->makeSubStream(pos, length, dict); + + // get filters + str = str->addFilters(dict); + + // skip over stream data + lexer->setPos(pos + length); + + // refill token buffers and check for 'endstream' + shift(); // kill '>>' + shift(); // kill 'stream' + if (buf1.isCmd("endstream")) + shift(); + else + error(getPos(), "Missing 'endstream'"); + + return str; +} + +void Parser::shift() { + if (inlineImg > 0) { + ++inlineImg; + } else if (buf2.isCmd("ID")) { + lexer->skipChar(); // skip char after 'ID' command + inlineImg = 1; + } + buf1.free(); + buf1 = buf2; + if (inlineImg > 0) // don't buffer inline image data + buf2.initNull(); + else + lexer->getObj(&buf2); +} diff --git a/pdf2swf/xpdf/Parser.h b/pdf2swf/xpdf/Parser.h new file mode 100644 index 00000000..6e618449 --- /dev/null +++ b/pdf2swf/xpdf/Parser.h @@ -0,0 +1,56 @@ +//======================================================================== +// +// Parser.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef PARSER_H +#define PARSER_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "Lexer.h" + +//------------------------------------------------------------------------ +// Parser +//------------------------------------------------------------------------ + +class Parser { +public: + + // Constructor. + Parser(Lexer *lexer1); + + // Destructor. + ~Parser(); + + // Get the next object from the input stream. +#ifndef NO_DECRYPTION + Object *getObj(Object *obj, + Guchar *fileKey = NULL, int objNum = 0, int objGen = 0); +#else + Object *getObj(Object *obj); +#endif + + // Get stream. + Stream *getStream() { return lexer->getStream(); } + + // Get current position in file. + int getPos() { return lexer->getPos(); } + +private: + + Lexer *lexer; // input stream + Object buf1, buf2; // next two tokens + int inlineImg; // set when inline image data is encountered + + Stream *makeStream(Object *dict); + void shift(); +}; + +#endif + diff --git a/pdf2swf/xpdf/StdFontInfo.h b/pdf2swf/xpdf/StdFontInfo.h new file mode 100644 index 00000000..0db033f6 --- /dev/null +++ b/pdf2swf/xpdf/StdFontInfo.h @@ -0,0 +1,546 @@ +//======================================================================== +// +// StdFontInfo.h +// +// This file was automatically generated by makeFontInfo. +// +// Copyright 1999 Derek B. Noonburg +// +//======================================================================== + +#ifndef STDFONTINFO_H +#define STDFONTINFO_H + +//------------------------------------------------------------------------ +// type1StdEncoding -- Adobe Type 1 StandardEncoding +//------------------------------------------------------------------------ + +#define type1StdEncodingSize 256 +static char *type1StdEncodingNames[type1StdEncodingSize] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "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", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + NULL, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + NULL, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + NULL, + "questiondown", + NULL, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + NULL, + "ring", + "cedilla", + NULL, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "AE", + NULL, + "ordfeminine", + NULL, + NULL, + NULL, + NULL, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + NULL, + NULL, + NULL, + NULL, + NULL, + "ae", + NULL, + NULL, + NULL, + "dotlessi", + NULL, + NULL, + "lslash", + "oslash", + "oe", + "germandbls", + NULL, + NULL, + NULL, + NULL +}; +static FontEncoding type1StdEncoding(type1StdEncodingNames, + type1StdEncodingSize); + +//------------------------------------------------------------------------ +// type1ExpertEncoding -- Adobe Type 1 ExpertEncoding +//------------------------------------------------------------------------ + +#define type1ExpertEncodingSize 256 +static char *type1ExpertEncodingNames[type1ExpertEncodingSize] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + NULL, + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + NULL, + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + NULL, + NULL, + NULL, + "isuperior", + NULL, + NULL, + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + NULL, + NULL, + "rsuperior", + "ssuperior", + "tsuperior", + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "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", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + NULL, + NULL, + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + NULL, + "Dotaccentsmall", + NULL, + NULL, + "Macronsmall", + NULL, + NULL, + "figuredash", + "hypheninferior", + NULL, + NULL, + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + NULL, + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + "zerosuperior", + "onesuperior", + "twosuperior", + "threesuperior", + "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" +}; +static FontEncoding type1ExpertEncoding(type1ExpertEncodingNames, + type1ExpertEncodingSize); + +#endif diff --git a/pdf2swf/xpdf/Stream-CCITT.h b/pdf2swf/xpdf/Stream-CCITT.h new file mode 100644 index 00000000..1af87422 --- /dev/null +++ b/pdf2swf/xpdf/Stream-CCITT.h @@ -0,0 +1,459 @@ +//======================================================================== +// +// Stream-CCITT.h +// +// Tables for CCITT Fax decoding. +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +struct CCITTCode { + short bits; + short n; +}; + +#define ccittEOL -2 + +//------------------------------------------------------------------------ +// 2D codes +//------------------------------------------------------------------------ + +#define twoDimPass 0 +#define twoDimHoriz 1 +#define twoDimVert0 2 +#define twoDimVertR1 3 +#define twoDimVertL1 4 +#define twoDimVertR2 5 +#define twoDimVertL2 6 +#define twoDimVertR3 7 +#define twoDimVertL3 8 + +// 1-7 bit codes +static CCITTCode twoDimTab1[128] = { + {-1, -1}, {-1, -1}, // 000000x + {7, twoDimVertL3}, // 0000010 + {7, twoDimVertR3}, // 0000011 + {6, twoDimVertL2}, {6, twoDimVertL2}, // 000010x + {6, twoDimVertR2}, {6, twoDimVertR2}, // 000011x + {4, twoDimPass}, {4, twoDimPass}, // 0001xxx + {4, twoDimPass}, {4, twoDimPass}, + {4, twoDimPass}, {4, twoDimPass}, + {4, twoDimPass}, {4, twoDimPass}, + {3, twoDimHoriz}, {3, twoDimHoriz}, // 001xxxx + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimVertL1}, {3, twoDimVertL1}, // 010xxxx + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, // 011xxxx + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {1, twoDimVert0}, {1, twoDimVert0}, // 1xxxxxx + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0} +}; + +//------------------------------------------------------------------------ +// white run lengths +//------------------------------------------------------------------------ + +// 11-12 bit codes (upper 7 bits are 0) +static CCITTCode whiteTab1[32] = { + {-1, -1}, // 00000 + {12, ccittEOL}, // 00001 + {-1, -1}, {-1, -1}, // 0001x + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 001xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 010xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 011xx + {11, 1792}, {11, 1792}, // 1000x + {12, 1984}, // 10010 + {12, 2048}, // 10011 + {12, 2112}, // 10100 + {12, 2176}, // 10101 + {12, 2240}, // 10110 + {12, 2304}, // 10111 + {11, 1856}, {11, 1856}, // 1100x + {11, 1920}, {11, 1920}, // 1101x + {12, 2368}, // 11100 + {12, 2432}, // 11101 + {12, 2496}, // 11110 + {12, 2560} // 11111 +}; + +// 1-9 bit codes +static CCITTCode whiteTab2[512] = { + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000000xx + {8, 29}, {8, 29}, // 00000010x + {8, 30}, {8, 30}, // 00000011x + {8, 45}, {8, 45}, // 00000100x + {8, 46}, {8, 46}, // 00000101x + {7, 22}, {7, 22}, {7, 22}, {7, 22}, // 0000011xx + {7, 23}, {7, 23}, {7, 23}, {7, 23}, // 0000100xx + {8, 47}, {8, 47}, // 00001010x + {8, 48}, {8, 48}, // 00001011x + {6, 13}, {6, 13}, {6, 13}, {6, 13}, // 000011xxx + {6, 13}, {6, 13}, {6, 13}, {6, 13}, + {7, 20}, {7, 20}, {7, 20}, {7, 20}, // 0001000xx + {8, 33}, {8, 33}, // 00010010x + {8, 34}, {8, 34}, // 00010011x + {8, 35}, {8, 35}, // 00010100x + {8, 36}, {8, 36}, // 00010101x + {8, 37}, {8, 37}, // 00010110x + {8, 38}, {8, 38}, // 00010111x + {7, 19}, {7, 19}, {7, 19}, {7, 19}, // 0001100xx + {8, 31}, {8, 31}, // 00011010x + {8, 32}, {8, 32}, // 00011011x + {6, 1}, {6, 1}, {6, 1}, {6, 1}, // 000111xxx + {6, 1}, {6, 1}, {6, 1}, {6, 1}, + {6, 12}, {6, 12}, {6, 12}, {6, 12}, // 001000xxx + {6, 12}, {6, 12}, {6, 12}, {6, 12}, + {8, 53}, {8, 53}, // 00100100x + {8, 54}, {8, 54}, // 00100101x + {7, 26}, {7, 26}, {7, 26}, {7, 26}, // 0010011xx + {8, 39}, {8, 39}, // 00101000x + {8, 40}, {8, 40}, // 00101001x + {8, 41}, {8, 41}, // 00101010x + {8, 42}, {8, 42}, // 00101011x + {8, 43}, {8, 43}, // 00101100x + {8, 44}, {8, 44}, // 00101101x + {7, 21}, {7, 21}, {7, 21}, {7, 21}, // 0010111xx + {7, 28}, {7, 28}, {7, 28}, {7, 28}, // 0011000xx + {8, 61}, {8, 61}, // 00110010x + {8, 62}, {8, 62}, // 00110011x + {8, 63}, {8, 63}, // 00110100x + {8, 0}, {8, 0}, // 00110101x + {8, 320}, {8, 320}, // 00110110x + {8, 384}, {8, 384}, // 00110111x + {5, 10}, {5, 10}, {5, 10}, {5, 10}, // 00111xxxx + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, // 01000xxxx + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {7, 27}, {7, 27}, {7, 27}, {7, 27}, // 0100100xx + {8, 59}, {8, 59}, // 01001010x + {8, 60}, {8, 60}, // 01001011x + {9, 1472}, // 010011000 + {9, 1536}, // 010011001 + {9, 1600}, // 010011010 + {9, 1728}, // 010011011 + {7, 18}, {7, 18}, {7, 18}, {7, 18}, // 0100111xx + {7, 24}, {7, 24}, {7, 24}, {7, 24}, // 0101000xx + {8, 49}, {8, 49}, // 01010010x + {8, 50}, {8, 50}, // 01010011x + {8, 51}, {8, 51}, // 01010100x + {8, 52}, {8, 52}, // 01010101x + {7, 25}, {7, 25}, {7, 25}, {7, 25}, // 0101011xx + {8, 55}, {8, 55}, // 01011000x + {8, 56}, {8, 56}, // 01011001x + {8, 57}, {8, 57}, // 01011010x + {8, 58}, {8, 58}, // 01011011x + {6, 192}, {6, 192}, {6, 192}, {6, 192}, // 010111xxx + {6, 192}, {6, 192}, {6, 192}, {6, 192}, + {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, // 011000xxx + {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, + {8, 448}, {8, 448}, // 01100100x + {8, 512}, {8, 512}, // 01100101x + {9, 704}, // 011001100 + {9, 768}, // 011001101 + {8, 640}, {8, 640}, // 01100111x + {8, 576}, {8, 576}, // 01101000x + {9, 832}, // 011010010 + {9, 896}, // 011010011 + {9, 960}, // 011010100 + {9, 1024}, // 011010101 + {9, 1088}, // 011010110 + {9, 1152}, // 011010111 + {9, 1216}, // 011011000 + {9, 1280}, // 011011001 + {9, 1344}, // 011011010 + {9, 1408}, // 011011011 + {7, 256}, {7, 256}, {7, 256}, {7, 256}, // 0110111xx + {4, 2}, {4, 2}, {4, 2}, {4, 2}, // 0111xxxxx + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, // 1000xxxxx + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, // 10010xxxx + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, // 10011xxxx + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, // 10100xxxx + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {6, 16}, {6, 16}, {6, 16}, {6, 16}, // 101010xxx + {6, 16}, {6, 16}, {6, 16}, {6, 16}, + {6, 17}, {6, 17}, {6, 17}, {6, 17}, // 101011xxx + {6, 17}, {6, 17}, {6, 17}, {6, 17}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, // 1011xxxxx + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 1100xxxxx + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {6, 14}, {6, 14}, {6, 14}, {6, 14}, // 110100xxx + {6, 14}, {6, 14}, {6, 14}, {6, 14}, + {6, 15}, {6, 15}, {6, 15}, {6, 15}, // 110101xxx + {6, 15}, {6, 15}, {6, 15}, {6, 15}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, // 11011xxxx + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 1110xxxxx + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, // 1111xxxxx + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7} +}; + +//------------------------------------------------------------------------ +// black run lengths +//------------------------------------------------------------------------ + +// 10-13 bit codes (upper 6 bits are 0) +static CCITTCode blackTab1[128] = { + {-1, -1}, {-1, -1}, // 000000000000x + {12, ccittEOL}, {12, ccittEOL}, // 000000000001x + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000001xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000010xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000011xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000100xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000101xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000110xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000111xx + {11, 1792}, {11, 1792}, {11, 1792}, {11, 1792}, // 00000001000xx + {12, 1984}, {12, 1984}, // 000000010010x + {12, 2048}, {12, 2048}, // 000000010011x + {12, 2112}, {12, 2112}, // 000000010100x + {12, 2176}, {12, 2176}, // 000000010101x + {12, 2240}, {12, 2240}, // 000000010110x + {12, 2304}, {12, 2304}, // 000000010111x + {11, 1856}, {11, 1856}, {11, 1856}, {11, 1856}, // 00000001100xx + {11, 1920}, {11, 1920}, {11, 1920}, {11, 1920}, // 00000001101xx + {12, 2368}, {12, 2368}, // 000000011100x + {12, 2432}, {12, 2432}, // 000000011101x + {12, 2496}, {12, 2496}, // 000000011110x + {12, 2560}, {12, 2560}, // 000000011111x + {10, 18}, {10, 18}, {10, 18}, {10, 18}, // 0000001000xxx + {10, 18}, {10, 18}, {10, 18}, {10, 18}, + {12, 52}, {12, 52}, // 000000100100x + {13, 640}, // 0000001001010 + {13, 704}, // 0000001001011 + {13, 768}, // 0000001001100 + {13, 832}, // 0000001001101 + {12, 55}, {12, 55}, // 000000100111x + {12, 56}, {12, 56}, // 000000101000x + {13, 1280}, // 0000001010010 + {13, 1344}, // 0000001010011 + {13, 1408}, // 0000001010100 + {13, 1472}, // 0000001010101 + {12, 59}, {12, 59}, // 000000101011x + {12, 60}, {12, 60}, // 000000101100x + {13, 1536}, // 0000001011010 + {13, 1600}, // 0000001011011 + {11, 24}, {11, 24}, {11, 24}, {11, 24}, // 00000010111xx + {11, 25}, {11, 25}, {11, 25}, {11, 25}, // 00000011000xx + {13, 1664}, // 0000001100100 + {13, 1728}, // 0000001100101 + {12, 320}, {12, 320}, // 000000110011x + {12, 384}, {12, 384}, // 000000110100x + {12, 448}, {12, 448}, // 000000110101x + {13, 512}, // 0000001101100 + {13, 576}, // 0000001101101 + {12, 53}, {12, 53}, // 000000110111x + {12, 54}, {12, 54}, // 000000111000x + {13, 896}, // 0000001110010 + {13, 960}, // 0000001110011 + {13, 1024}, // 0000001110100 + {13, 1088}, // 0000001110101 + {13, 1152}, // 0000001110110 + {13, 1216}, // 0000001110111 + {10, 64}, {10, 64}, {10, 64}, {10, 64}, // 0000001111xxx + {10, 64}, {10, 64}, {10, 64}, {10, 64} +}; + +// 7-12 bit codes (upper 4 bits are 0) +static CCITTCode blackTab2[192] = { + {8, 13}, {8, 13}, {8, 13}, {8, 13}, // 00000100xxxx + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {11, 23}, {11, 23}, // 00000101000x + {12, 50}, // 000001010010 + {12, 51}, // 000001010011 + {12, 44}, // 000001010100 + {12, 45}, // 000001010101 + {12, 46}, // 000001010110 + {12, 47}, // 000001010111 + {12, 57}, // 000001011000 + {12, 58}, // 000001011001 + {12, 61}, // 000001011010 + {12, 256}, // 000001011011 + {10, 16}, {10, 16}, {10, 16}, {10, 16}, // 0000010111xx + {10, 17}, {10, 17}, {10, 17}, {10, 17}, // 0000011000xx + {12, 48}, // 000001100100 + {12, 49}, // 000001100101 + {12, 62}, // 000001100110 + {12, 63}, // 000001100111 + {12, 30}, // 000001101000 + {12, 31}, // 000001101001 + {12, 32}, // 000001101010 + {12, 33}, // 000001101011 + {12, 40}, // 000001101100 + {12, 41}, // 000001101101 + {11, 22}, {11, 22}, // 00000110111x + {8, 14}, {8, 14}, {8, 14}, {8, 14}, // 00000111xxxx + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, // 0000100xxxxx + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, // 0000101xxxxx + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {9, 15}, {9, 15}, {9, 15}, {9, 15}, // 000011000xxx + {9, 15}, {9, 15}, {9, 15}, {9, 15}, + {12, 128}, // 000011001000 + {12, 192}, // 000011001001 + {12, 26}, // 000011001010 + {12, 27}, // 000011001011 + {12, 28}, // 000011001100 + {12, 29}, // 000011001101 + {11, 19}, {11, 19}, // 00001100111x + {11, 20}, {11, 20}, // 00001101000x + {12, 34}, // 000011010010 + {12, 35}, // 000011010011 + {12, 36}, // 000011010100 + {12, 37}, // 000011010101 + {12, 38}, // 000011010110 + {12, 39}, // 000011010111 + {11, 21}, {11, 21}, // 00001101100x + {12, 42}, // 000011011010 + {12, 43}, // 000011011011 + {10, 0}, {10, 0}, {10, 0}, {10, 0}, // 0000110111xx + {7, 12}, {7, 12}, {7, 12}, {7, 12}, // 0000111xxxxx + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12} +}; + +// 2-6 bit codes +static CCITTCode blackTab3[64] = { + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000xx + {6, 9}, // 000100 + {6, 8}, // 000101 + {5, 7}, {5, 7}, // 00011x + {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 0010xx + {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 0011xx + {3, 1}, {3, 1}, {3, 1}, {3, 1}, // 010xxx + {3, 1}, {3, 1}, {3, 1}, {3, 1}, + {3, 4}, {3, 4}, {3, 4}, {3, 4}, // 011xxx + {3, 4}, {3, 4}, {3, 4}, {3, 4}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, // 10xxxx + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 2}, {2, 2}, {2, 2}, {2, 2}, // 11xxxx + {2, 2}, {2, 2}, {2, 2}, {2, 2}, + {2, 2}, {2, 2}, {2, 2}, {2, 2}, + {2, 2}, {2, 2}, {2, 2}, {2, 2} +}; diff --git a/pdf2swf/xpdf/Stream.cc b/pdf2swf/xpdf/Stream.cc new file mode 100644 index 00000000..0afcc94a --- /dev/null +++ b/pdf2swf/xpdf/Stream.cc @@ -0,0 +1,3449 @@ +//======================================================================== +// +// Stream.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include +#include +#include "gmem.h" +#include "gfile.h" +#include "config.h" +#include "Error.h" +#include "Object.h" +#ifndef NO_DECRYPTION +#include "Decrypt.h" +#endif +#include "Stream.h" +#include "Stream-CCITT.h" + +#ifdef __DJGPP__ +static GBool setDJSYSFLAGS = gFalse; +#endif + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#ifdef __GNUC__ +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif +#endif + +#ifdef MACOS +#include "StuffItEngineLib.h" +#endif + +//------------------------------------------------------------------------ +// Stream (base class) +//------------------------------------------------------------------------ + +Stream::Stream() { + ref = 1; +} + +Stream::~Stream() { +} + +void Stream::close() { +} + +int Stream::getRawChar() { + error(-1, "Internal: called getRawChar() on non-predictor stream"); + return EOF; +} + +char *Stream::getLine(char *buf, int size) { + int i; + int c; + + if (lookChar() == EOF) + return NULL; + for (i = 0; i < size - 1; ++i) { + c = getChar(); + if (c == EOF || c == '\n') + break; + if (c == '\r') { + if ((c = lookChar()) == '\n') + getChar(); + break; + } + buf[i] = c; + } + buf[i] = '\0'; + return buf; +} + +GString *Stream::getPSFilter(char *indent) { + return new GString(); +} + +Stream *Stream::addFilters(Object *dict) { + Object obj, obj2; + Object params, params2; + Stream *str; + int i; + + str = this; + dict->dictLookup("Filter", &obj); + if (obj.isNull()) { + obj.free(); + dict->dictLookup("F", &obj); + } + dict->dictLookup("DecodeParms", ¶ms); + if (params.isNull()) { + params.free(); + dict->dictLookup("DP", ¶ms); + } + if (obj.isName()) { + str = makeFilter(obj.getName(), str, ¶ms); + } else if (obj.isArray()) { + for (i = 0; i < obj.arrayGetLength(); ++i) { + obj.arrayGet(i, &obj2); + if (params.isArray()) + params.arrayGet(i, ¶ms2); + else + params2.initNull(); + if (obj2.isName()) { + str = makeFilter(obj2.getName(), str, ¶ms2); + } else { + error(getPos(), "Bad filter name"); + str = new EOFStream(str); + } + obj2.free(); + params2.free(); + } + } else if (!obj.isNull()) { + error(getPos(), "Bad 'Filter' attribute in stream"); + } + obj.free(); + params.free(); + + return str; +} + +Stream *Stream::makeFilter(char *name, Stream *str, Object *params) { + int pred; // parameters + int colors; + int bits; + int early; + int encoding; + GBool endOfLine, byteAlign, endOfBlock, black; + int columns, rows; + Object obj; + + if (!strcmp(name, "ASCIIHexDecode") || !strcmp(name, "AHx")) { + str = new ASCIIHexStream(str); + } else if (!strcmp(name, "ASCII85Decode") || !strcmp(name, "A85")) { + str = new ASCII85Stream(str); + } else if (!strcmp(name, "LZWDecode") || !strcmp(name, "LZW")) { + pred = 1; + columns = 1; + colors = 1; + bits = 8; + early = 1; + if (params->isDict()) { + params->dictLookup("Predictor", &obj); + if (obj.isInt()) + pred = obj.getInt(); + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) + columns = obj.getInt(); + obj.free(); + params->dictLookup("Colors", &obj); + if (obj.isInt()) + colors = obj.getInt(); + obj.free(); + params->dictLookup("BitsPerComponent", &obj); + if (obj.isInt()) + bits = obj.getInt(); + obj.free(); + params->dictLookup("EarlyChange", &obj); + if (obj.isInt()) + early = obj.getInt(); + obj.free(); + } + str = new LZWStream(str, pred, columns, colors, bits, early); + } else if (!strcmp(name, "RunLengthDecode") || !strcmp(name, "RL")) { + str = new RunLengthStream(str); + } else if (!strcmp(name, "CCITTFaxDecode") || !strcmp(name, "CCF")) { + encoding = 0; + endOfLine = gFalse; + byteAlign = gFalse; + columns = 1728; + rows = 0; + endOfBlock = gTrue; + black = gFalse; + if (params->isDict()) { + params->dictLookup("K", &obj); + if (obj.isInt()) { + encoding = obj.getInt(); + } + obj.free(); + params->dictLookup("EndOfLine", &obj); + if (obj.isBool()) { + endOfLine = obj.getBool(); + } + obj.free(); + params->dictLookup("EncodedByteAlign", &obj); + if (obj.isBool()) { + byteAlign = obj.getBool(); + } + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) { + columns = obj.getInt(); + } + obj.free(); + params->dictLookup("Rows", &obj); + if (obj.isInt()) { + rows = obj.getInt(); + } + obj.free(); + params->dictLookup("EndOfBlock", &obj); + if (obj.isBool()) { + endOfBlock = obj.getBool(); + } + obj.free(); + params->dictLookup("BlackIs1", &obj); + if (obj.isBool()) { + black = obj.getBool(); + } + obj.free(); + } + str = new CCITTFaxStream(str, encoding, endOfLine, byteAlign, + columns, rows, endOfBlock, black); + } else if (!strcmp(name, "DCTDecode") || !strcmp(name, "DCT")) { + str = new DCTStream(str); + } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) { + pred = 1; + columns = 1; + colors = 1; + bits = 8; + if (params->isDict()) { + params->dictLookup("Predictor", &obj); + if (obj.isInt()) + pred = obj.getInt(); + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) + columns = obj.getInt(); + obj.free(); + params->dictLookup("Colors", &obj); + if (obj.isInt()) + colors = obj.getInt(); + obj.free(); + params->dictLookup("BitsPerComponent", &obj); + if (obj.isInt()) + bits = obj.getInt(); + obj.free(); + } + str = new FlateStream(str, pred, columns, colors, bits); + } else { + error(getPos(), "Unknown filter '%s'", name); + str = new EOFStream(str); + } + return str; +} + +//------------------------------------------------------------------------ +// BaseStream +//------------------------------------------------------------------------ + +BaseStream::BaseStream(Object *dict) { + this->dict = *dict; +#ifndef NO_DECRYPTION + decrypt = NULL; +#endif +} + +BaseStream::~BaseStream() { + dict.free(); +#ifndef NO_DECRYPTION + if (decrypt) + delete decrypt; +#endif +} + +#ifndef NO_DECRYPTION +void BaseStream::doDecryption(Guchar *fileKey, int objNum, int objGen) { + decrypt = new Decrypt(fileKey, objNum, objGen); +} +#endif + +//------------------------------------------------------------------------ +// FilterStream +//------------------------------------------------------------------------ + +FilterStream::FilterStream(Stream *str) { + this->str = str; +} + +FilterStream::~FilterStream() { +} + +void FilterStream::close() { + str->close(); +} + +void FilterStream::setPos(int pos) { + error(-1, "Internal: called setPos() on FilterStream"); +} + +//------------------------------------------------------------------------ +// ImageStream +//------------------------------------------------------------------------ + +ImageStream::ImageStream(Stream *str, int width, int nComps, int nBits) { + int imgLineSize; + + this->str = str; + this->width = width; + this->nComps = nComps; + this->nBits = nBits; + + nVals = width * nComps; + if (nBits == 1) { + imgLineSize = (nVals + 7) & ~7; + } else { + imgLineSize = nVals; + } + imgLine = (Guchar *)gmalloc(imgLineSize * sizeof(Guchar)); + imgIdx = nVals; +} + +ImageStream::~ImageStream() { + gfree(imgLine); +} + +void ImageStream::reset() { + str->reset(); +} + +GBool ImageStream::getPixel(Guchar *pix) { + Gulong buf, bitMask; + int bits; + int c; + int i; + + if (imgIdx >= nVals) { + + // read one line of image pixels + if (nBits == 1) { + for (i = 0; i < nVals; i += 8) { + c = str->getChar(); + imgLine[i+0] = (Guchar)((c >> 7) & 1); + imgLine[i+1] = (Guchar)((c >> 6) & 1); + imgLine[i+2] = (Guchar)((c >> 5) & 1); + imgLine[i+3] = (Guchar)((c >> 4) & 1); + imgLine[i+4] = (Guchar)((c >> 3) & 1); + imgLine[i+5] = (Guchar)((c >> 2) & 1); + imgLine[i+6] = (Guchar)((c >> 1) & 1); + imgLine[i+7] = (Guchar)(c & 1); + } + } else if (nBits == 8) { + for (i = 0; i < nVals; ++i) { + imgLine[i] = str->getChar(); + } + } else { + bitMask = (1 << nBits) - 1; + buf = 0; + bits = 0; + for (i = 0; i < nVals; ++i) { + if (bits < nBits) { + buf = (buf << 8) | (str->getChar() & 0xff); + bits += 8; + } + imgLine[i] = (Guchar)((buf >> (bits - nBits)) & bitMask); + bits -= nBits; + } + } + + // reset to start of line + imgIdx = 0; + } + + for (i = 0; i < nComps; ++i) + pix[i] = imgLine[imgIdx++]; + return gTrue; +} + +void ImageStream::skipLine() { + int n, i; + + n = (nVals * nBits + 7) >> 3; + for (i = 0; i < n; ++i) { + str->getChar(); + } +} + +//------------------------------------------------------------------------ +// StreamPredictor +//------------------------------------------------------------------------ + +StreamPredictor::StreamPredictor(Stream *str, int predictor, + int width, int nComps, int nBits) { + this->str = str; + this->predictor = predictor; + this->width = width; + this->nComps = nComps; + this->nBits = nBits; + + nVals = width * nComps; + pixBytes = (nComps * nBits + 7) >> 3; + rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes; + predLine = (Guchar *)gmalloc(rowBytes); + memset(predLine, 0, rowBytes); + predIdx = rowBytes; +} + +StreamPredictor::~StreamPredictor() { + gfree(predLine); +} + +int StreamPredictor::lookChar() { + if (predIdx >= rowBytes) { + if (!getNextLine()) { + return EOF; + } + } + return predLine[predIdx]; +} + +int StreamPredictor::getChar() { + if (predIdx >= rowBytes) { + if (!getNextLine()) { + return EOF; + } + } + return predLine[predIdx++]; +} + +GBool StreamPredictor::getNextLine() { + int curPred; + Guchar upLeftBuf[4]; + int left, up, upLeft, p, pa, pb, pc; + int c; + Gulong inBuf, outBuf, bitMask; + int inBits, outBits; + int i, j, k; + + // get PNG optimum predictor number + if (predictor == 15) { + if ((curPred = str->getRawChar()) == EOF) { + return gFalse; + } + curPred += 10; + } else { + curPred = predictor; + } + + // read the raw line, apply PNG (byte) predictor + upLeftBuf[0] = upLeftBuf[1] = upLeftBuf[2] = upLeftBuf[3] = 0; + for (i = pixBytes; i < rowBytes; ++i) { + upLeftBuf[3] = upLeftBuf[2]; + upLeftBuf[2] = upLeftBuf[1]; + upLeftBuf[1] = upLeftBuf[0]; + upLeftBuf[0] = predLine[i]; + if ((c = str->getRawChar()) == EOF) { + break; + } + switch (curPred) { + case 11: // PNG sub + predLine[i] = predLine[i - pixBytes] + (Guchar)c; + break; + case 12: // PNG up + predLine[i] = predLine[i] + (Guchar)c; + break; + case 13: // PNG average + predLine[i] = ((predLine[i - pixBytes] + predLine[i]) >> 1) + + (Guchar)c; + break; + case 14: // PNG Paeth + left = predLine[i - pixBytes]; + up = predLine[i]; + upLeft = upLeftBuf[pixBytes]; + p = left + up - upLeft; + if ((pa = p - left) < 0) + pa = -pa; + if ((pb = p - up) < 0) + pb = -pb; + if ((pc = p - upLeft) < 0) + pc = -pc; + if (pa <= pb && pa <= pc) + predLine[i] = pa + (Guchar)c; + else if (pb <= pc) + predLine[i] = pb + (Guchar)c; + else + predLine[i] = pc + (Guchar)c; + break; + case 10: // PNG none + default: // no predictor or TIFF predictor + predLine[i] = (Guchar)c; + break; + } + } + + // apply TIFF (component) predictor + //~ this is completely untested + if (predictor == 2) { + if (nBits == 1) { + inBuf = predLine[pixBytes - 1]; + for (i = pixBytes; i < rowBytes; i += 8) { + // 1-bit add is just xor + inBuf = (inBuf << 8) | predLine[i]; + predLine[i] ^= inBuf >> nComps; + } + } else if (nBits == 8) { + for (i = pixBytes; i < rowBytes; ++i) { + predLine[i] += predLine[i - nComps]; + } + } else { + upLeftBuf[0] = upLeftBuf[1] = upLeftBuf[2] = upLeftBuf[3] = 0; + bitMask = (1 << nBits) - 1; + inBuf = outBuf = 0; + inBits = outBits = 0; + j = k = pixBytes; + for (i = 0; i < nVals; ++i) { + if (inBits < nBits) { + inBuf = (inBuf << 8) | (predLine[j++] & 0xff); + inBits += 8; + } + upLeftBuf[3] = upLeftBuf[2]; + upLeftBuf[2] = upLeftBuf[1]; + upLeftBuf[1] = upLeftBuf[0]; + upLeftBuf[0] = (upLeftBuf[nComps] + + (inBuf >> (inBits - nBits))) & bitMask; + outBuf = (outBuf << nBits) | upLeftBuf[0]; + inBits -= nBits; + outBits += nBits; + if (outBits > 8) { + predLine[k++] = (Guchar)(outBuf >> (outBits - 8)); + } + } + if (outBits > 0) { + predLine[k++] = (Guchar)(outBuf << (8 - outBits)); + } + } + } + + // reset to start of line + predIdx = pixBytes; + + return gTrue; +} + +//------------------------------------------------------------------------ +// FileStream +//------------------------------------------------------------------------ + +FileStream::FileStream(FILE *f, int start, int length, Object *dict): + BaseStream(dict) { + this->f = f; + this->start = start; + this->length = length; + bufPtr = bufEnd = buf; + bufPos = start; + savePos = -1; +} + +FileStream::~FileStream() { + close(); +} + +Stream *FileStream::makeSubStream(int start, int length, Object *dict) { + return new FileStream(f, start, length, dict); +} + +void FileStream::reset() { + savePos = (int)ftell(f); + fseek(f, start, SEEK_SET); + bufPtr = bufEnd = buf; + bufPos = start; +#ifndef NO_DECRYPTION + if (decrypt) + decrypt->reset(); +#endif +} + +void FileStream::close() { + if (savePos >= 0) { + fseek(f, savePos, SEEK_SET); + savePos = -1; + } +} + +GBool FileStream::fillBuf() { + int n; +#ifndef NO_DECRYPTION + char *p; +#endif + + bufPos += bufEnd - buf; + bufPtr = bufEnd = buf; + if (length >= 0 && bufPos >= start + length) { + return gFalse; + } + if (length >= 0 && bufPos + fileStreamBufSize > start + length) { + n = start + length - bufPos; + } else { + n = fileStreamBufSize; + } + n = fread(buf, 1, n, f); + bufEnd = buf + n; + if (bufPtr >= bufEnd) { + return gFalse; + } +#ifndef NO_DECRYPTION + if (decrypt) { + for (p = buf; p < bufEnd; ++p) { + *p = (char)decrypt->decryptByte((Guchar)*p); + } + } +#endif + return gTrue; +} + +void FileStream::setPos(int pos1) { + long size; + + if (pos1 >= 0) { + fseek(f, pos1, SEEK_SET); + bufPos = pos1; + } else { + fseek(f, 0, SEEK_END); + size = ftell(f); + if (pos1 < -size) + pos1 = (int)(-size); + fseek(f, pos1, SEEK_END); + bufPos = (int)ftell(f); + } + bufPtr = bufEnd = buf; +} + +void FileStream::moveStart(int delta) { + this->start += delta; + bufPtr = bufEnd = buf; + bufPos = start; +} + +//------------------------------------------------------------------------ +// EmbedStream +//------------------------------------------------------------------------ + +EmbedStream::EmbedStream(Stream *str, Object *dict): + BaseStream(dict) { + this->str = str; +} + +EmbedStream::~EmbedStream() { +} + +Stream *EmbedStream::makeSubStream(int start, int length, Object *dict) { + error(-1, "Internal: called makeSubStream() on EmbedStream"); + return NULL; +} + +void EmbedStream::setPos(int pos) { + error(-1, "Internal: called setPos() on EmbedStream"); +} + +int EmbedStream::getStart() { + error(-1, "Internal: called getStart() on EmbedStream"); + return 0; +} + +void EmbedStream::moveStart(int start) { + error(-1, "Internal: called moveStart() on EmbedStream"); +} + +//------------------------------------------------------------------------ +// ASCIIHexStream +//------------------------------------------------------------------------ + +ASCIIHexStream::ASCIIHexStream(Stream *str): + FilterStream(str) { + buf = EOF; + eof = gFalse; +} + +ASCIIHexStream::~ASCIIHexStream() { + delete str; +} + +void ASCIIHexStream::reset() { + str->reset(); + buf = EOF; + eof = gFalse; +} + +int ASCIIHexStream::lookChar() { + int c1, c2, x; + + if (buf != EOF) + return buf; + if (eof) { + buf = EOF; + return EOF; + } + do { + c1 = str->getChar(); + } while (isspace(c1)); + if (c1 == '>') { + eof = gTrue; + buf = EOF; + return buf; + } + do { + c2 = str->getChar(); + } while (isspace(c2)); + if (c2 == '>') { + eof = gTrue; + c2 = '0'; + } + if (c1 >= '0' && c1 <= '9') { + x = (c1 - '0') << 4; + } else if (c1 >= 'A' && c1 <= 'F') { + x = (c1 - 'A' + 10) << 4; + } else if (c1 >= 'a' && c1 <= 'f') { + x = (c1 - 'a' + 10) << 4; + } else if (c1 == EOF) { + eof = gTrue; + x = 0; + } else { + error(getPos(), "Illegal character <%02x> in ASCIIHex stream", c1); + x = 0; + } + if (c2 >= '0' && c2 <= '9') { + x += c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + x += c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + x += c2 - 'a' + 10; + } else if (c2 == EOF) { + eof = gTrue; + x = 0; + } else { + error(getPos(), "Illegal character <%02x> in ASCIIHex stream", c2); + } + buf = x & 0xff; + return buf; +} + +GString *ASCIIHexStream::getPSFilter(char *indent) { + GString *s; + + s = str->getPSFilter(indent); + s->append(indent)->append("/ASCIIHexDecode filter\n"); + return s; +} + +GBool ASCIIHexStream::isBinary(GBool last) { + return str->isBinary(gFalse); +} + +//------------------------------------------------------------------------ +// ASCII85Stream +//------------------------------------------------------------------------ + +ASCII85Stream::ASCII85Stream(Stream *str): + FilterStream(str) { + index = n = 0; + eof = gFalse; +} + +ASCII85Stream::~ASCII85Stream() { + delete str; +} + +void ASCII85Stream::reset() { + str->reset(); + index = n = 0; + eof = gFalse; +} + +int ASCII85Stream::lookChar() { + int k; + Gulong t; + + if (index >= n) { + if (eof) + return EOF; + index = 0; + do { + c[0] = str->getChar(); + } while (c[0] == '\n' || c[0] == '\r'); + if (c[0] == '~' || c[0] == EOF) { + eof = gTrue; + n = 0; + return EOF; + } else if (c[0] == 'z') { + b[0] = b[1] = b[2] = b[3] = 0; + n = 4; + } else { + for (k = 1; k < 5; ++k) { + do { + c[k] = str->getChar(); + } while (c[k] == '\n' || c[k] == '\r'); + if (c[k] == '~' || c[k] == EOF) + break; + } + n = k - 1; + if (k < 5 && (c[k] == '~' || c[k] == EOF)) { + for (++k; k < 5; ++k) + c[k] = 0x21 + 84; + eof = gTrue; + } + t = 0; + for (k = 0; k < 5; ++k) + t = t * 85 + (c[k] - 0x21); + for (k = 3; k >= 0; --k) { + b[k] = (int)(t & 0xff); + t >>= 8; + } + } + } + return b[index]; +} + +GString *ASCII85Stream::getPSFilter(char *indent) { + GString *s; + + s = str->getPSFilter(indent); + s->append(indent)->append("/ASCII85Decode filter\n"); + return s; +} + +GBool ASCII85Stream::isBinary(GBool last) { + return str->isBinary(gFalse); +} + +//------------------------------------------------------------------------ +// LZWStream +//------------------------------------------------------------------------ + +LZWStream::LZWStream(Stream *str, int predictor1, int columns1, int colors1, + int bits1, int early1): + FilterStream(str) { + if (predictor1 != 1) { + pred = new StreamPredictor(this, predictor1, columns1, colors1, bits1); + } else { + pred = NULL; + } + early = early1; + zPipe = NULL; + bufPtr = bufEnd = buf; +} + +LZWStream::~LZWStream() { + if (zPipe) { +#ifdef HAVE_POPEN + pclose(zPipe); +#else + fclose(zPipe); +#endif + zPipe = NULL; + unlink(zName->getCString()); + delete zName; + } + if (pred) { + delete pred; + } + delete str; +} + +int LZWStream::getChar() { + if (pred) { + return pred->getChar(); + } + return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); +} + +int LZWStream::lookChar() { + if (pred) { + return pred->lookChar(); + } + return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); +} + +int LZWStream::getRawChar() { + return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); +} + +void LZWStream::reset() { + FILE *f; + GString *zCmd; + + //----- close old LZW stream + if (zPipe) { +#ifdef HAVE_POPEN + pclose(zPipe); +#else + fclose(zPipe); +#endif + zPipe = NULL; + unlink(zName->getCString()); + delete zName; + } + + //----- tell Delorie runtime to spawn a new instance of COMMAND.COM + // to run gzip +#if __DJGPP__ + if (!setDJSYSFLAGS) { + setenv("DJSYSFLAGS", "0x0002", 0); + setDJSYSFLAGS = gTrue; + } +#endif + + //----- create the .Z file + if (!openTempFile(&zName, &f, "wb", ".Z")) { + error(getPos(), "Couldn't create temporary file for LZW stream"); + return; + } + dumpFile(f); + fclose(f); + + //----- execute uncompress / gzip + zCmd = new GString(uncompressCmd); + zCmd->append(' '); + zCmd->append(zName); +#if defined(MACOS) + long magicCookie; + // first we open the engine up + OSErr err = OpenSITEngine(kUseExternalEngine, &magicCookie); + // if we found it - let's use it! + if (!err && magicCookie) { + // make sure we have the correct version of the Engine + if (GetSITEngineVersion(magicCookie) >= kFirstSupportedEngine) { + FSSpec myFSS; + Str255 pName; + strcpy((char *)pName, zName->getCString()); + c2pstr((char *)pName); + FSMakeFSSpec(0, 0, pName, &myFSS); + short ftype = DetermineFileType(magicCookie, &myFSS); + OSErr expandErr = ExpandFSSpec(magicCookie, ftype, &myFSS, + NULL, NULL, kCreateFolderNever, + kDeleteOriginal, kTextConvertSmart); + } + } +#elif defined(HAVE_POPEN) + if (!(zPipe = popen(zCmd->getCString(), POPEN_READ_MODE))) { + error(getPos(), "Couldn't popen '%s'", zCmd->getCString()); + unlink(zName->getCString()); + delete zName; + return; + } +#else // HAVE_POPEN +#ifdef VMS + if (!system(zCmd->getCString())) { +#else + if (system(zCmd->getCString())) { +#endif + error(getPos(), "Couldn't execute '%s'", zCmd->getCString()); + unlink(zName->getCString()); + delete zName; + return; + } + zName->del(zName->getLength() - 2, 2); + if (!(zPipe = fopen(zName->getCString(), "rb"))) { + error(getPos(), "Couldn't open uncompress file '%s'", zName->getCString()); + unlink(zName->getCString()); + delete zName; + return; + } +#endif // HAVE_POPEN + + //----- clean up + delete zCmd; + + //----- initialize buffer + bufPtr = bufEnd = buf; +} + +void LZWStream::dumpFile(FILE *f) { + int outCodeBits; // size of output code + int outBits; // max output code + int outBuf[8]; // output buffer + int outData; // temporary output buffer + int inCode, outCode; // input and output codes + int nextCode; // next code index + GBool eof; // set when EOF is reached + GBool clear; // set if table needs to be cleared + GBool first; // indicates first code word after clear + int i, j; + + str->reset(); + + // magic number + fputc(0x1f, f); + fputc(0x9d, f); + + // max code length, block mode flag + fputc(0x8c, f); + + // init input side + inCodeBits = 9; + inputBuf = 0; + inputBits = 0; + eof = gFalse; + + // init output side + outCodeBits = 9; + + // clear table + first = gTrue; + nextCode = 258; + + clear = gFalse; + do { + for (i = 0; i < 8; ++i) { + // check for table overflow + if (nextCode + early > 0x1001) { + inCode = 256; + + // read input code + } else { + do { + inCode = getCode(); + if (inCode == EOF) { + eof = gTrue; + inCode = 0; + } + } while (first && inCode == 256); + } + + // compute output code + if (inCode < 256) { + outCode = inCode; + } else if (inCode == 256) { + outCode = 256; + clear = gTrue; + } else if (inCode == 257) { + outCode = 0; + eof = gTrue; + } else { + outCode = inCode - 1; + } + outBuf[i] = outCode; + + // next code index + if (first) + first = gFalse; + else + ++nextCode; + + // check input code size + if (nextCode + early == 0x200) + inCodeBits = 10; + else if (nextCode + early == 0x400) { + inCodeBits = 11; + } else if (nextCode + early == 0x800) { + inCodeBits = 12; + } + + // check for eof/clear + if (eof) + break; + if (clear) { + i = 8; + break; + } + } + + // write output block + outData = 0; + outBits = 0; + j = 0; + while (j < i || outBits > 0) { + if (outBits < 8 && j < i) { + outData = outData | (outBuf[j++] << outBits); + outBits += outCodeBits; + } + fputc(outData & 0xff, f); + outData >>= 8; + outBits -= 8; + } + + // check output code size + if (nextCode - 1 == 512 || + nextCode - 1 == 1024 || + nextCode - 1 == 2048 || + nextCode - 1 == 4096) { + outCodeBits = inCodeBits; + } + + // clear table if necessary + if (clear) { + inCodeBits = 9; + outCodeBits = 9; + first = gTrue; + nextCode = 258; + clear = gFalse; + } + } while (!eof); +} + +int LZWStream::getCode() { + int c; + int code; + + while (inputBits < inCodeBits) { + if ((c = str->getChar()) == EOF) + return EOF; + inputBuf = (inputBuf << 8) | (c & 0xff); + inputBits += 8; + } + code = (inputBuf >> (inputBits - inCodeBits)) & ((1 << inCodeBits) - 1); + inputBits -= inCodeBits; + return code; +} + +GBool LZWStream::fillBuf() { + int n; + + if (!zPipe) + return gFalse; + if ((n = fread(buf, 1, 256, zPipe)) < 256) { +#ifdef HAVE_POPEN + pclose(zPipe); +#else + fclose(zPipe); +#endif + zPipe = NULL; + unlink(zName->getCString()); + delete zName; + } + bufPtr = buf; + bufEnd = buf + n; + return n > 0; +} + +GString *LZWStream::getPSFilter(char *indent) { + GString *s; + + if (pred) { + return NULL; + } + s = str->getPSFilter(indent); + s->append(indent)->append("/LZWDecode filter\n"); + return s; +} + +GBool LZWStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// RunLengthStream +//------------------------------------------------------------------------ + +RunLengthStream::RunLengthStream(Stream *str): + FilterStream(str) { + bufPtr = bufEnd = buf; + eof = gFalse; +} + +RunLengthStream::~RunLengthStream() { + delete str; +} + +void RunLengthStream::reset() { + str->reset(); + bufPtr = bufEnd = buf; + eof = gFalse; +} + +GString *RunLengthStream::getPSFilter(char *indent) { + GString *s; + + s = str->getPSFilter(indent); + s->append(indent)->append("/RunLengthDecode filter\n"); + return s; +} + +GBool RunLengthStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +GBool RunLengthStream::fillBuf() { + int c; + int n, i; + + if (eof) + return gFalse; + c = str->getChar(); + if (c == 0x80 || c == EOF) { + eof = gTrue; + return gFalse; + } + if (c < 0x80) { + n = c + 1; + for (i = 0; i < n; ++i) + buf[i] = (char)str->getChar(); + } else { + n = 0x101 - c; + c = str->getChar(); + for (i = 0; i < n; ++i) + buf[i] = (char)c; + } + bufPtr = buf; + bufEnd = buf + n; + return gTrue; +} + +//------------------------------------------------------------------------ +// CCITTFaxStream +//------------------------------------------------------------------------ + +CCITTFaxStream::CCITTFaxStream(Stream *str, int encoding, GBool endOfLine, + GBool byteAlign, int columns, int rows, + GBool endOfBlock, GBool black): + FilterStream(str) { + this->encoding = encoding; + this->endOfLine = endOfLine; + this->byteAlign = byteAlign; + this->columns = columns; + this->rows = rows; + this->endOfBlock = endOfBlock; + this->black = black; + refLine = (short *)gmalloc((columns + 3) * sizeof(short)); + codingLine = (short *)gmalloc((columns + 2) * sizeof(short)); + + eof = gFalse; + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; + codingLine[0] = 0; + codingLine[1] = refLine[2] = columns; + a0 = 1; + + buf = EOF; +} + +CCITTFaxStream::~CCITTFaxStream() { + delete str; + gfree(refLine); + gfree(codingLine); +} + +void CCITTFaxStream::reset() { + int n; + + str->reset(); + eof = gFalse; + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; + codingLine[0] = 0; + codingLine[1] = refLine[2] = columns; + a0 = 1; + buf = EOF; + + // get initial end-of-line marker and 2D encoding tag + if (endOfBlock) { + if (lookBits(12) == 0x001) { + eatBits(12); + } + } else { + for (n = 0; n < 11 && lookBits(n) == 0; ++n) ; + if (n == 11 && lookBits(12) == 0x001) { + eatBits(12); + } + } + if (encoding > 0) { + nextLine2D = !lookBits(1); + eatBits(1); + } +} + +int CCITTFaxStream::lookChar() { + short code1, code2, code3; + int a0New; +#if 0 //~ + GBool err; +#endif + GBool gotEOL; + int ret; + int bits, i; + + // if at eof just return EOF + if (eof && codingLine[a0] >= columns) { + return EOF; + } + + // read the next row +#if 0 //~ + err = gFalse; +#endif + if (codingLine[a0] >= columns) { + + // 2-D encoding + if (nextLine2D) { + for (i = 0; codingLine[i] < columns; ++i) + refLine[i] = codingLine[i]; + refLine[i] = refLine[i + 1] = columns; + b1 = 1; + a0New = codingLine[a0 = 0] = 0; + do { + code1 = getTwoDimCode(); + switch (code1) { + case twoDimPass: + if (refLine[b1] < columns) { + a0New = refLine[b1 + 1]; + b1 += 2; + } + break; + case twoDimHoriz: + if ((a0 & 1) == 0) { + code1 = code2 = 0; + do { + code1 += code3 = getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = getBlackCode(); + } while (code3 >= 64); + } else { + code1 = code2 = 0; + do { + code1 += code3 = getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = getWhiteCode(); + } while (code3 >= 64); + } + codingLine[a0 + 1] = a0New + code1; + ++a0; + a0New = codingLine[a0 + 1] = codingLine[a0] + code2; + ++a0; + while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns) + b1 += 2; + break; + case twoDimVert0: + a0New = codingLine[++a0] = refLine[b1]; + if (refLine[b1] < columns) { + ++b1; + while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns) + b1 += 2; + } + break; + case twoDimVertR1: + a0New = codingLine[++a0] = refLine[b1] + 1; + if (refLine[b1] < columns) { + ++b1; + while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns) + b1 += 2; + } + break; + case twoDimVertL1: + a0New = codingLine[++a0] = refLine[b1] - 1; + --b1; + while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns) + b1 += 2; + break; + case twoDimVertR2: + a0New = codingLine[++a0] = refLine[b1] + 2; + if (refLine[b1] < columns) { + ++b1; + while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns) + b1 += 2; + } + break; + case twoDimVertL2: + a0New = codingLine[++a0] = refLine[b1] - 2; + --b1; + while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns) + b1 += 2; + break; + case twoDimVertR3: + a0New = codingLine[++a0] = refLine[b1] + 3; + if (refLine[b1] < columns) { + ++b1; + while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns) + b1 += 2; + } + break; + case twoDimVertL3: + a0New = codingLine[++a0] = refLine[b1] - 3; + --b1; + while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns) + b1 += 2; + break; + case EOF: + eof = gTrue; + codingLine[a0 = 0] = columns; + return EOF; + default: + error(getPos(), "Bad 2D code %04x in CCITTFax stream", code1); +#if 0 //~ + err = gTrue; + break; +#else + eof = gTrue; + return EOF; +#endif + } + } while (codingLine[a0] < columns); + + // 1-D encoding + } else { + codingLine[a0 = 0] = 0; + while (1) { + code1 = 0; + do { + code1 += code3 = getWhiteCode(); + } while (code3 >= 64); + codingLine[a0+1] = codingLine[a0] + code1; + ++a0; + if (codingLine[a0] >= columns) + break; + code2 = 0; + do { + code2 += code3 = getBlackCode(); + } while (code3 >= 64); + codingLine[a0+1] = codingLine[a0] + code2; + ++a0; + if (codingLine[a0] >= columns) + break; + } + } + + if (codingLine[a0] != columns) { + error(getPos(), "CCITTFax row is wrong length (%d)", codingLine[a0]); +#if 0 //~ + err = gTrue; +#endif + } + + // byte-align the row + if (byteAlign) { + inputBits &= ~7; + } + + // check for end-of-line marker, skipping over any extra zero bits + gotEOL = gFalse; + if (!endOfBlock && row == rows - 1) { + eof = gTrue; + } else { + code1 = lookBits(12); + while (code1 == 0) { + eatBits(1); + code1 = lookBits(12); + } + if (code1 == 0x001) { + eatBits(12); + gotEOL = gTrue; + } else if (code1 == EOF) { + eof = gTrue; + } + } + + // get 2D encoding tag + if (!eof && encoding > 0) { + nextLine2D = !lookBits(1); + eatBits(1); + } + + // check for end-of-block marker + if (endOfBlock && gotEOL) { + code1 = lookBits(12); + if (code1 == 0x001) { + eatBits(12); + if (encoding > 0) { + lookBits(1); + eatBits(1); + } + if (encoding >= 0) { + for (i = 0; i < 4; ++i) { + code1 = lookBits(12); + if (code1 != 0x001) { + error(getPos(), "Bad RTC code in CCITTFax stream"); + } + eatBits(12); + if (encoding > 0) { + lookBits(1); + eatBits(1); + } + } + } + eof = gTrue; + } + } + +#if 0 //~ + // This looks for an end-of-line marker after an error, however + // some (most?) CCITT streams in PDF files don't use end-of-line + // markers, and the just-plow-on technique works better in those + // cases. + else if (err) { + do { + if (code1 == EOF) { + eof = gTrue; + return EOF; + } + eatBits(1); + code1 = look13Bits(); + } while ((code1 >> 1) != 0x001); + eatBits(12); + codingLine[++a0] = columns; + if (encoding > 0) { + eatBits(1); + nextLine2D = !(code1 & 1); + } + } +#endif + + a0 = 0; + outputBits = codingLine[1] - codingLine[0]; + if (outputBits == 0) { + a0 = 1; + outputBits = codingLine[2] - codingLine[1]; + } + + ++row; + } + + // get a byte + if (outputBits >= 8) { + ret = ((a0 & 1) == 0) ? 0xff : 0x00; + if ((outputBits -= 8) == 0) { + ++a0; + if (codingLine[a0] < columns) { + outputBits = codingLine[a0 + 1] - codingLine[a0]; + } + } + } else { + bits = 8; + ret = 0; + do { + if (outputBits > bits) { + i = bits; + bits = 0; + if ((a0 & 1) == 0) { + ret |= 0xff >> (8 - i); + } + outputBits -= i; + } else { + i = outputBits; + bits -= outputBits; + if ((a0 & 1) == 0) { + ret |= (0xff >> (8 - i)) << bits; + } + outputBits = 0; + ++a0; + if (codingLine[a0] < columns) { + outputBits = codingLine[a0 + 1] - codingLine[a0]; + } + } + } while (bits > 0 && codingLine[a0] < columns); + } + buf = black ? (ret ^ 0xff) : ret; + return buf; +} + +short CCITTFaxStream::getTwoDimCode() { + short code; + CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(7); + p = &twoDimTab1[code]; + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } else { + for (n = 1; n <= 7; ++n) { + code = lookBits(n); + if (n < 7) { + code <<= 7 - n; + } + p = &twoDimTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(getPos(), "Bad two dim code (%04x) in CCITTFax stream", code); + return EOF; +} + +short CCITTFaxStream::getWhiteCode() { + short code; + CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(12); + if ((code >> 5) == 0) { + p = &whiteTab1[code]; + } else { + p = &whiteTab2[code >> 3]; + } + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } else { + for (n = 1; n <= 9; ++n) { + code = lookBits(n); + if (n < 9) { + code <<= 9 - n; + } + p = &whiteTab2[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + for (n = 11; n <= 12; ++n) { + code = lookBits(n); + if (n < 12) { + code <<= 12 - n; + } + p = &whiteTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(getPos(), "Bad white code (%04x) in CCITTFax stream", code); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + eatBits(1); + return 1; +} + +short CCITTFaxStream::getBlackCode() { + short code; + CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(13); + if ((code >> 7) == 0) { + p = &blackTab1[code]; + } else if ((code >> 9) == 0) { + p = &blackTab2[(code >> 1) - 64]; + } else { + p = &blackTab3[code >> 7]; + } + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } else { + for (n = 2; n <= 6; ++n) { + code = lookBits(n); + if (n < 6) { + code <<= 6 - n; + } + p = &blackTab3[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + for (n = 7; n <= 12; ++n) { + code = lookBits(n); + if (n < 12) { + code <<= 12 - n; + } + if (code >= 64) { + p = &blackTab2[code - 64]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + for (n = 10; n <= 13; ++n) { + code = lookBits(n); + if (n < 13) { + code <<= 13 - n; + } + p = &blackTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(getPos(), "Bad black code (%04x) in CCITTFax stream", code); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + eatBits(1); + return 1; +} + +short CCITTFaxStream::lookBits(int n) { + int c; + + while (inputBits < n) { + if ((c = str->getChar()) == EOF) { + if (inputBits == 0) { + return EOF; + } + // near the end of the stream, the caller may ask for more bits + // than are available, but there may still be a valid code in + // however many bits are available -- we need to return correct + // data in this case + return (inputBuf << (n - inputBits)) & (0xffff >> (16 - n)); + } + inputBuf = (inputBuf << 8) + c; + inputBits += 8; + } + return (inputBuf >> (inputBits - n)) & (0xffff >> (16 - n)); +} + +GString *CCITTFaxStream::getPSFilter(char *indent) { + GString *s; + char s1[50]; + + s = str->getPSFilter(indent); + s->append(indent)->append("<< "); + if (encoding != 0) { + sprintf(s1, "/K %d ", encoding); + s->append(s1); + } + if (endOfLine) { + s->append("/EndOfLine true "); + } + if (byteAlign) { + s->append("/EncodedByteAlign true "); + } + sprintf(s1, "/Columns %d ", columns); + s->append(s1); + if (rows != 0) { + sprintf(s1, "/Rows %d ", rows); + s->append(s1); + } + if (!endOfBlock) { + s->append("/EndOfBlock false "); + } + if (black) { + s->append("/BlackIs1 true "); + } + s->append(">> /CCITTFaxDecode filter\n"); + return s; +} + +GBool CCITTFaxStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// DCTStream +//------------------------------------------------------------------------ + +// IDCT constants (20.12 fixed point format) +#ifndef FP_IDCT +#define dctCos1 4017 // cos(pi/16) +#define dctSin1 799 // sin(pi/16) +#define dctCos3 3406 // cos(3*pi/16) +#define dctSin3 2276 // sin(3*pi/16) +#define dctCos6 1567 // cos(6*pi/16) +#define dctSin6 3784 // sin(6*pi/16) +#define dctSqrt2 5793 // sqrt(2) +#define dctSqrt1d2 2896 // sqrt(2) / 2 +#endif + +// IDCT constants +#ifdef FP_IDCT +#define dctCos1 0.98078528 // cos(pi/16) +#define dctSin1 0.19509032 // sin(pi/16) +#define dctCos3 0.83146961 // cos(3*pi/16) +#define dctSin3 0.55557023 // sin(3*pi/16) +#define dctCos6 0.38268343 // cos(6*pi/16) +#define dctSin6 0.92387953 // sin(6*pi/16) +#define dctSqrt2 1.41421356 // sqrt(2) +#define dctSqrt1d2 0.70710678 // sqrt(2) / 2 +#endif + +// color conversion parameters (16.16 fixed point format) +#define dctCrToR 91881 // 1.4020 +#define dctCbToG -22553 // -0.3441363 +#define dctCrToG -46802 // -0.71413636 +#define dctCbToB 116130 // 1.772 + +// clip [-256,511] --> [0,255] +#define dctClipOffset 256 +static Guchar dctClip[768]; +static int dctClipInit = 0; + +// zig zag decode map +static int dctZigZag[64] = { + 0, + 1, 8, + 16, 9, 2, + 3, 10, 17, 24, + 32, 25, 18, 11, 4, + 5, 12, 19, 26, 33, 40, + 48, 41, 34, 27, 20, 13, 6, + 7, 14, 21, 28, 35, 42, 49, 56, + 57, 50, 43, 36, 29, 22, 15, + 23, 30, 37, 44, 51, 58, + 59, 52, 45, 38, 31, + 39, 46, 53, 60, + 61, 54, 47, + 55, 62, + 63 +}; + +DCTStream::DCTStream(Stream *str): + FilterStream(str) { + int i, j; + + width = height = 0; + mcuWidth = mcuHeight = 0; + numComps = 0; + comp = 0; + x = y = dy = 0; + for (i = 0; i < 4; ++i) + for (j = 0; j < 32; ++j) + rowBuf[i][j] = NULL; + + if (!dctClipInit) { + for (i = -256; i < 0; ++i) + dctClip[dctClipOffset + i] = 0; + for (i = 0; i < 256; ++i) + dctClip[dctClipOffset + i] = i; + for (i = 256; i < 512; ++i) + dctClip[dctClipOffset + i] = 255; + dctClipInit = 1; + } +} + +DCTStream::~DCTStream() { + int i, j; + + delete str; + for (i = 0; i < numComps; ++i) + for (j = 0; j < mcuHeight; ++j) + gfree(rowBuf[i][j]); +} + +void DCTStream::reset() { + str->reset(); + if (!readHeader()) { + y = height; + return; + } + restartMarker = 0xd0; + restart(); +} + +int DCTStream::getChar() { + int c; + + c = lookChar(); + if (c == EOF) + return EOF; + if (++comp == numComps) { + comp = 0; + if (++x == width) { + x = 0; + ++y; + ++dy; + } + } + if (y == height) + readTrailer(); + return c; +} + +int DCTStream::lookChar() { + if (y >= height) + return EOF; + if (dy >= mcuHeight) { + if (!readMCURow()) { + y = height; + return EOF; + } + comp = 0; + x = 0; + dy = 0; + } + return rowBuf[comp][dy][x]; +} + +void DCTStream::restart() { + int i; + + inputBits = 0; + restartCtr = restartInterval; + for (i = 0; i < numComps; ++i) + compInfo[i].prevDC = 0; +} + +GBool DCTStream::readMCURow() { + Guchar data[64]; + Guchar *p1, *p2; + int pY, pCb, pCr, pR, pG, pB; + int h, v, horiz, vert, hSub, vSub; + int x1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i; + int c; + + for (x1 = 0; x1 < width; x1 += mcuWidth) { + + // deal with restart marker + if (restartInterval > 0 && restartCtr == 0) { + c = readMarker(); + if (c != restartMarker) { + error(getPos(), "Bad DCT data: incorrect restart marker"); + return gFalse; + } + if (++restartMarker == 0xd8) + restartMarker = 0xd0; + restart(); + } + + // read one MCU + for (cc = 0; cc < numComps; ++cc) { + h = compInfo[cc].hSample; + v = compInfo[cc].vSample; + horiz = mcuWidth / h; + vert = mcuHeight / v; + hSub = horiz / 8; + vSub = vert / 8; + for (y2 = 0; y2 < mcuHeight; y2 += vert) { + for (x2 = 0; x2 < mcuWidth; x2 += horiz) { + if (!readDataUnit(&dcHuffTables[compInfo[cc].dcHuffTable], + &acHuffTables[compInfo[cc].acHuffTable], + quantTables[compInfo[cc].quantTable], + &compInfo[cc].prevDC, + data)) + return gFalse; + if (hSub == 1 && vSub == 1) { + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + p1 = &rowBuf[cc][y2+y3][x1+x2]; + p1[0] = data[i]; + p1[1] = data[i+1]; + p1[2] = data[i+2]; + p1[3] = data[i+3]; + p1[4] = data[i+4]; + p1[5] = data[i+5]; + p1[6] = data[i+6]; + p1[7] = data[i+7]; + } + } else if (hSub == 2 && vSub == 2) { + for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) { + p1 = &rowBuf[cc][y2+y3][x1+x2]; + p2 = &rowBuf[cc][y2+y3+1][x1+x2]; + p1[0] = p1[1] = p2[0] = p2[1] = data[i]; + p1[2] = p1[3] = p2[2] = p2[3] = data[i+1]; + p1[4] = p1[5] = p2[4] = p2[5] = data[i+2]; + p1[6] = p1[7] = p2[6] = p2[7] = data[i+3]; + p1[8] = p1[9] = p2[8] = p2[9] = data[i+4]; + p1[10] = p1[11] = p2[10] = p2[11] = data[i+5]; + p1[12] = p1[13] = p2[12] = p2[13] = data[i+6]; + p1[14] = p1[15] = p2[14] = p2[15] = data[i+7]; + } + } else { + i = 0; + for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) { + for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) { + for (y5 = 0; y5 < vSub; ++y5) + for (x5 = 0; x5 < hSub; ++x5) + rowBuf[cc][y2+y4+y5][x1+x2+x4+x5] = data[i]; + ++i; + } + } + } + } + } + } + --restartCtr; + + // color space conversion + if (colorXform) { + // convert YCbCr to RGB + if (numComps == 3) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = rowBuf[0][y2][x1+x2]; + pCb = rowBuf[1][y2][x1+x2] - 128; + pCr = rowBuf[2][y2][x1+x2] - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + rowBuf[0][y2][x1+x2] = dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16; + rowBuf[1][y2][x1+x2] = dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + rowBuf[2][y2][x1+x2] = dctClip[dctClipOffset + pB]; + } + } + // convert YCbCrK to CMYK (K is passed through unchanged) + } else if (numComps == 4) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = rowBuf[0][y2][x1+x2]; + pCb = rowBuf[1][y2][x1+x2] - 128; + pCr = rowBuf[2][y2][x1+x2] - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + rowBuf[0][y2][x1+x2] = 255 - dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32678) >> 16; + rowBuf[1][y2][x1+x2] = 255 - dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + rowBuf[2][y2][x1+x2] = 255 - dctClip[dctClipOffset + pB]; + } + } + } + } + } + return gTrue; +} + +// This IDCT algorithm is taken from: +// Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, +// "Practical Fast 1-D DCT Algorithms with 11 Multiplications", +// IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, +// 988-991. +// The stage numbers mentioned in the comments refer to Figure 1 in this +// paper. +#ifndef FP_IDCT +GBool DCTStream::readDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + Guchar quantTable[64], int *prevDC, + Guchar data[64]) { + int tmp1[64]; + int v0, v1, v2, v3, v4, v5, v6, v7, t; + int run, size, amp; + int c; + int i, j; + + // Huffman decode and dequantize + size = readHuffSym(dcHuffTable); + if (size == 9999) + return gFalse; + if (size > 0) { + amp = readAmp(size); + if (amp == 9999) + return gFalse; + } else { + amp = 0; + } + tmp1[0] = (*prevDC += amp) * quantTable[0]; + for (i = 1; i < 64; ++i) + tmp1[i] = 0; + i = 1; + while (i < 64) { + run = 0; + while ((c = readHuffSym(acHuffTable)) == 0xf0 && run < 0x30) + run += 0x10; + if (c == 9999) + return gFalse; + if (c == 0x00) { + break; + } else { + run += (c >> 4) & 0x0f; + size = c & 0x0f; + amp = readAmp(size); + if (amp == 9999) + return gFalse; + i += run; + j = dctZigZag[i++]; + tmp1[j] = amp * quantTable[j]; + } + } + + // inverse DCT on rows + for (i = 0; i < 64; i += 8) { + + // stage 4 + v0 = (dctSqrt2 * tmp1[i+0] + 128) >> 8; + v1 = (dctSqrt2 * tmp1[i+4] + 128) >> 8; + v2 = tmp1[i+2]; + v3 = tmp1[i+6]; + v4 = (dctSqrt1d2 * (tmp1[i+1] - tmp1[i+7]) + 128) >> 8; + v7 = (dctSqrt1d2 * (tmp1[i+1] + tmp1[i+7]) + 128) >> 8; + v5 = tmp1[i+3] << 4; + v6 = tmp1[i+5] << 4; + + // stage 3 + t = (v0 - v1+ 1) >> 1; + v0 = (v0 + v1 + 1) >> 1; + v1 = t; + t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; + v3 = t; + t = (v4 - v6 + 1) >> 1; + v4 = (v4 + v6 + 1) >> 1; + v6 = t; + t = (v7 + v5 + 1) >> 1; + v5 = (v7 - v5 + 1) >> 1; + v7 = t; + + // stage 2 + t = (v0 - v3 + 1) >> 1; + v0 = (v0 + v3 + 1) >> 1; + v3 = t; + t = (v1 - v2 + 1) >> 1; + v1 = (v1 + v2 + 1) >> 1; + v2 = t; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + + // stage 1 + tmp1[i+0] = v0 + v7; + tmp1[i+7] = v0 - v7; + tmp1[i+1] = v1 + v6; + tmp1[i+6] = v1 - v6; + tmp1[i+2] = v2 + v5; + tmp1[i+5] = v2 - v5; + tmp1[i+3] = v3 + v4; + tmp1[i+4] = v3 - v4; + } + + // inverse DCT on columns + for (i = 0; i < 8; ++i) { + + // stage 4 + v0 = (dctSqrt2 * tmp1[0*8+i] + 2048) >> 12; + v1 = (dctSqrt2 * tmp1[4*8+i] + 2048) >> 12; + v2 = tmp1[2*8+i]; + v3 = tmp1[6*8+i]; + v4 = (dctSqrt1d2 * (tmp1[1*8+i] - tmp1[7*8+i]) + 2048) >> 12; + v7 = (dctSqrt1d2 * (tmp1[1*8+i] + tmp1[7*8+i]) + 2048) >> 12; + v5 = tmp1[3*8+i]; + v6 = tmp1[5*8+i]; + + // stage 3 + t = (v0 - v1 + 1) >> 1; + v0 = (v0 + v1 + 1) >> 1; + v1 = t; + t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; + v3 = t; + t = (v4 - v6 + 1) >> 1; + v4 = (v4 + v6 + 1) >> 1; + v6 = t; + t = (v7 + v5 + 1) >> 1; + v5 = (v7 - v5 + 1) >> 1; + v7 = t; + + // stage 2 + t = (v0 - v3 + 1) >> 1; + v0 = (v0 + v3 + 1) >> 1; + v3 = t; + t = (v1 - v2 + 1) >> 1; + v1 = (v1 + v2 + 1) >> 1; + v2 = t; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + + // stage 1 + tmp1[0*8+i] = v0 + v7; + tmp1[7*8+i] = v0 - v7; + tmp1[1*8+i] = v1 + v6; + tmp1[6*8+i] = v1 - v6; + tmp1[2*8+i] = v2 + v5; + tmp1[5*8+i] = v2 - v5; + tmp1[3*8+i] = v3 + v4; + tmp1[4*8+i] = v3 - v4; + } + + // convert to 8-bit integers + for (i = 0; i < 64; ++i) + data[i] = dctClip[dctClipOffset + 128 + ((tmp1[i] + 8) >> 4)]; + + return gTrue; +} +#endif + +#ifdef FP_IDCT +GBool DCTStream::readDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + Guchar quantTable[64], int *prevDC, + Guchar data[64]) { + double tmp1[64]; + double v0, v1, v2, v3, v4, v5, v6, v7, t; + int run, size, amp; + int c; + int i, j; + + // Huffman decode and dequantize + size = readHuffSym(dcHuffTable); + if (size == 9999) + return gFalse; + if (size > 0) { + amp = readAmp(size); + if (amp == 9999) + return gFalse; + } else { + amp = 0; + } + tmp1[0] = (*prevDC += amp) * quantTable[0]; + for (i = 1; i < 64; ++i) + tmp1[i] = 0; + i = 1; + while (i < 64) { + run = 0; + while ((c = readHuffSym(acHuffTable)) == 0xf0 && run < 0x30) + run += 0x10; + if (c == 9999) + return gFalse; + if (c == 0x00) { + break; + } else { + run += (c >> 4) & 0x0f; + size = c & 0x0f; + amp = readAmp(size); + if (amp == 9999) + return gFalse; + i += run; + j = dctZigZag[i++]; + tmp1[j] = amp * quantTable[j]; + } + } + + // inverse DCT on rows + for (i = 0; i < 64; i += 8) { + + // stage 4 + v0 = dctSqrt2 * tmp1[i+0]; + v1 = dctSqrt2 * tmp1[i+4]; + v2 = tmp1[i+2]; + v3 = tmp1[i+6]; + v4 = dctSqrt1d2 * (tmp1[i+1] - tmp1[i+7]); + v7 = dctSqrt1d2 * (tmp1[i+1] + tmp1[i+7]); + v5 = tmp1[i+3]; + v6 = tmp1[i+5]; + + // stage 3 + t = 0.5 * (v0 - v1); + v0 = 0.5 * (v0 + v1); + v1 = t; + t = v2 * dctSin6 + v3 * dctCos6; + v2 = v2 * dctCos6 - v3 * dctSin6; + v3 = t; + t = 0.5 * (v4 - v6); + v4 = 0.5 * (v4 + v6); + v6 = t; + t = 0.5 * (v7 + v5); + v5 = 0.5 * (v7 - v5); + v7 = t; + + // stage 2 + t = 0.5 * (v0 - v3); + v0 = 0.5 * (v0 + v3); + v3 = t; + t = 0.5 * (v1 - v2); + v1 = 0.5 * (v1 + v2); + v2 = t; + t = v4 * dctSin3 + v7 * dctCos3; + v4 = v4 * dctCos3 - v7 * dctSin3; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1; + v5 = v5 * dctCos1 - v6 * dctSin1; + v6 = t; + + // stage 1 + tmp1[i+0] = v0 + v7; + tmp1[i+7] = v0 - v7; + tmp1[i+1] = v1 + v6; + tmp1[i+6] = v1 - v6; + tmp1[i+2] = v2 + v5; + tmp1[i+5] = v2 - v5; + tmp1[i+3] = v3 + v4; + tmp1[i+4] = v3 - v4; + } + + // inverse DCT on columns + for (i = 0; i < 8; ++i) { + + // stage 4 + v0 = dctSqrt2 * tmp1[0*8+i]; + v1 = dctSqrt2 * tmp1[4*8+i]; + v2 = tmp1[2*8+i]; + v3 = tmp1[6*8+i]; + v4 = dctSqrt1d2 * (tmp1[1*8+i] - tmp1[7*8+i]); + v7 = dctSqrt1d2 * (tmp1[1*8+i] + tmp1[7*8+i]); + v5 = tmp1[3*8+i]; + v6 = tmp1[5*8+i]; + + // stage 3 + t = 0.5 * (v0 - v1); + v0 = 0.5 * (v0 + v1); + v1 = t; + t = v2 * dctSin6 + v3 * dctCos6; + v2 = v2 * dctCos6 - v3 * dctSin6; + v3 = t; + t = 0.5 * (v4 - v6); + v4 = 0.5 * (v4 + v6); + v6 = t; + t = 0.5 * (v7 + v5); + v5 = 0.5 * (v7 - v5); + v7 = t; + + // stage 2 + t = 0.5 * (v0 - v3); + v0 = 0.5 * (v0 + v3); + v3 = t; + t = 0.5 * (v1 - v2); + v1 = 0.5 * (v1 + v2); + v2 = t; + t = v4 * dctSin3 + v7 * dctCos3; + v4 = v4 * dctCos3 - v7 * dctSin3; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1; + v5 = v5 * dctCos1 - v6 * dctSin1; + v6 = t; + + // stage 1 + tmp1[0*8+i] = v0 + v7; + tmp1[7*8+i] = v0 - v7; + tmp1[1*8+i] = v1 + v6; + tmp1[6*8+i] = v1 - v6; + tmp1[2*8+i] = v2 + v5; + tmp1[5*8+i] = v2 - v5; + tmp1[3*8+i] = v3 + v4; + tmp1[4*8+i] = v3 - v4; + } + + // convert to 8-bit integers + for (i = 0; i < 64; ++i) + data[i] = dctClip[dctClipOffset + (int)(tmp1[i] + 128.5)]; + + return gTrue; +} +#endif + +int DCTStream::readHuffSym(DCTHuffTable *table) { + Gushort code; + int bit; + int codeBits; + + code = 0; + codeBits = 0; + do { + // add a bit to the code + if ((bit = readBit()) == EOF) + return 9999; + code = (code << 1) + bit; + ++codeBits; + + // look up code + if (code - table->firstCode[codeBits] < table->numCodes[codeBits]) { + code -= table->firstCode[codeBits]; + return table->sym[table->firstSym[codeBits] + code]; + } + } while (codeBits < 16); + + error(getPos(), "Bad Huffman code in DCT stream"); + return 9999; +} + +int DCTStream::readAmp(int size) { + int amp, bit; + int bits; + + amp = 0; + for (bits = 0; bits < size; ++bits) { + if ((bit = readBit()) == EOF) + return 9999; + amp = (amp << 1) + bit; + } + if (amp < (1 << (size - 1))) + amp -= (1 << size) - 1; + return amp; +} + +int DCTStream::readBit() { + int bit; + int c, c2; + + if (inputBits == 0) { + if ((c = str->getChar()) == EOF) + return EOF; + if (c == 0xff) { + do { + c2 = str->getChar(); + } while (c2 == 0xff); + if (c2 != 0x00) { + error(getPos(), "Bad DCT data: missing 00 after ff"); + return EOF; + } + } + inputBuf = c; + inputBits = 8; + } + bit = (inputBuf >> (inputBits - 1)) & 1; + --inputBits; + return bit; +} + +GBool DCTStream::readHeader() { + GBool doScan; + int minHSample, minVSample; + int bufWidth; + int n; + int c = 0; + int i, j; + + width = height = 0; + numComps = 0; + numQuantTables = 0; + numDCHuffTables = 0; + numACHuffTables = 0; + colorXform = 0; + gotAdobeMarker = gFalse; + restartInterval = 0; + + // read headers + doScan = gFalse; + while (!doScan) { + c = readMarker(); + switch (c) { + case 0xc0: // SOF0 + if (!readFrameInfo()) + return gFalse; + break; + case 0xc4: // DHT + if (!readHuffmanTables()) + return gFalse; + break; + case 0xd8: // SOI + break; + case 0xda: // SOS + if (!readScanInfo()) + return gFalse; + doScan = gTrue; + break; + case 0xdb: // DQT + if (!readQuantTables()) + return gFalse; + break; + case 0xdd: // DRI + if (!readRestartInterval()) + return gFalse; + break; + case 0xee: // APP14 + if (!readAdobeMarker()) + return gFalse; + break; + case EOF: + error(getPos(), "Bad DCT header"); + return gFalse; + default: + // skip APPn / COM / etc. + if (c >= 0xe0) { + n = read16() - 2; + for (i = 0; i < n; ++i) + str->getChar(); + } else { + error(getPos(), "Unknown DCT marker <%02x>", c); + return gFalse; + } + break; + } + } + + // compute MCU size + mcuWidth = minHSample = compInfo[0].hSample; + mcuHeight = minVSample = compInfo[0].vSample; + for (i = 1; i < numComps; ++i) { + if (compInfo[i].hSample < minHSample) + minHSample = compInfo[i].hSample; + if (compInfo[i].vSample < minVSample) + minVSample = compInfo[i].vSample; + if (compInfo[i].hSample > mcuWidth) + mcuWidth = compInfo[i].hSample; + if (compInfo[i].vSample > mcuHeight) + mcuHeight = compInfo[i].vSample; + } + for (i = 0; i < numComps; ++i) { + compInfo[i].hSample /= minHSample; + compInfo[i].vSample /= minVSample; + } + mcuWidth = (mcuWidth / minHSample) * 8; + mcuHeight = (mcuHeight / minVSample) * 8; + + // allocate buffers + bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; + for (i = 0; i < numComps; ++i) + for (j = 0; j < mcuHeight; ++j) + rowBuf[i][j] = (Guchar *)gmalloc(bufWidth * sizeof(Guchar)); + + // figure out color transform + if (!gotAdobeMarker && numComps == 3) { + if (compInfo[0].id == 1 && compInfo[1].id == 2 && compInfo[2].id == 3) { + colorXform = 1; + } + } + + // initialize counters + comp = 0; + x = 0; + y = 0; + dy = mcuHeight; + + return gTrue; +} + +GBool DCTStream::readFrameInfo() { + int length; + int prec; + int i; + int c; + + length = read16() - 2; + prec = str->getChar(); + height = read16(); + width = read16(); + numComps = str->getChar(); + length -= 6; + if (prec != 8) { + error(getPos(), "Bad DCT precision %d", prec); + return gFalse; + } + for (i = 0; i < numComps; ++i) { + compInfo[i].id = str->getChar(); + compInfo[i].inScan = gFalse; + c = str->getChar(); + compInfo[i].hSample = (c >> 4) & 0x0f; + compInfo[i].vSample = c & 0x0f; + compInfo[i].quantTable = str->getChar(); + compInfo[i].dcHuffTable = 0; + compInfo[i].acHuffTable = 0; + } + return gTrue; +} + +GBool DCTStream::readScanInfo() { + int length; + int scanComps, id, c; + int i, j; + + length = read16() - 2; + scanComps = str->getChar(); + --length; + if (length != 2 * scanComps + 3) { + error(getPos(), "Bad DCT scan info block"); + return gFalse; + } + for (i = 0; i < scanComps; ++i) { + id = str->getChar(); + for (j = 0; j < numComps; ++j) { + if (id == compInfo[j].id) + break; + } + if (j == numComps) { + error(getPos(), "Bad DCT component ID in scan info block"); + return gFalse; + } + compInfo[j].inScan = gTrue; + c = str->getChar(); + compInfo[j].dcHuffTable = (c >> 4) & 0x0f; + compInfo[j].acHuffTable = c & 0x0f; + } + str->getChar(); + str->getChar(); + str->getChar(); + return gTrue; +} + +GBool DCTStream::readQuantTables() { + int length; + int i; + int index; + + length = read16() - 2; + while (length > 0) { + index = str->getChar(); + if ((index & 0xf0) || index >= 4) { + error(getPos(), "Bad DCT quantization table"); + return gFalse; + } + if (index == numQuantTables) + numQuantTables = index + 1; + for (i = 0; i < 64; ++i) + quantTables[index][dctZigZag[i]] = str->getChar(); + length -= 65; + } + return gTrue; +} + +GBool DCTStream::readHuffmanTables() { + DCTHuffTable *tbl; + int length; + int index; + Gushort code; + Guchar sym; + int i; + int c; + + length = read16() - 2; + while (length > 0) { + index = str->getChar(); + --length; + if ((index & 0x0f) >= 4) { + error(getPos(), "Bad DCT Huffman table"); + return gFalse; + } + if (index & 0x10) { + index &= 0x0f; + if (index >= numACHuffTables) + numACHuffTables = index+1; + tbl = &acHuffTables[index]; + } else { + if (index >= numDCHuffTables) + numDCHuffTables = index+1; + tbl = &dcHuffTables[index]; + } + sym = 0; + code = 0; + for (i = 1; i <= 16; ++i) { + c = str->getChar(); + tbl->firstSym[i] = sym; + tbl->firstCode[i] = code; + tbl->numCodes[i] = c; + sym += c; + code = (code + c) << 1; + } + length -= 16; + for (i = 0; i < sym; ++i) + tbl->sym[i] = str->getChar(); + length -= sym; + } + return gTrue; +} + +GBool DCTStream::readRestartInterval() { + int length; + + length = read16(); + if (length != 4) { + error(getPos(), "Bad DCT restart interval"); + return gFalse; + } + restartInterval = read16(); + return gTrue; +} + +GBool DCTStream::readAdobeMarker() { + int length, i; + char buf[12]; + int c; + + length = read16(); + if (length != 14) + goto err; + for (i = 0; i < 12; ++i) { + if ((c = str->getChar()) == EOF) + goto err; + buf[i] = c; + } + if (strncmp(buf, "Adobe", 5)) + goto err; + colorXform = buf[11]; + gotAdobeMarker = gTrue; + return gTrue; + + err: + error(getPos(), "Bad DCT Adobe APP14 marker"); + return gFalse; +} + +GBool DCTStream::readTrailer() { + int c; + + c = readMarker(); + if (c != 0xd9) { // EOI + error(getPos(), "Bad DCT trailer"); + return gFalse; + } + return gTrue; +} + +int DCTStream::readMarker() { + int c; + + do { + do { + c = str->getChar(); + } while (c != 0xff); + do { + c = str->getChar(); + } while (c == 0xff); + } while (c == 0x00); + return c; +} + +int DCTStream::read16() { + int c1, c2; + + if ((c1 = str->getChar()) == EOF) + return EOF; + if ((c2 = str->getChar()) == EOF) + return EOF; + return (c1 << 8) + c2; +} + +GString *DCTStream::getPSFilter(char *indent) { + GString *s; + + s = str->getPSFilter(indent); + s->append(indent)->append("<< >> /DCTDecode filter\n"); + return s; +} + +GBool DCTStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// FlateStream +//------------------------------------------------------------------------ + +int FlateStream::codeLenCodeMap[flateMaxCodeLenCodes] = { + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 +}; + +FlateDecode FlateStream::lengthDecode[flateMaxLitCodes-257] = { + {0, 3}, + {0, 4}, + {0, 5}, + {0, 6}, + {0, 7}, + {0, 8}, + {0, 9}, + {0, 10}, + {1, 11}, + {1, 13}, + {1, 15}, + {1, 17}, + {2, 19}, + {2, 23}, + {2, 27}, + {2, 31}, + {3, 35}, + {3, 43}, + {3, 51}, + {3, 59}, + {4, 67}, + {4, 83}, + {4, 99}, + {4, 115}, + {5, 131}, + {5, 163}, + {5, 195}, + {5, 227}, + {0, 258} +}; + +FlateDecode FlateStream::distDecode[flateMaxDistCodes] = { + { 0, 1}, + { 0, 2}, + { 0, 3}, + { 0, 4}, + { 1, 5}, + { 1, 7}, + { 2, 9}, + { 2, 13}, + { 3, 17}, + { 3, 25}, + { 4, 33}, + { 4, 49}, + { 5, 65}, + { 5, 97}, + { 6, 129}, + { 6, 193}, + { 7, 257}, + { 7, 385}, + { 8, 513}, + { 8, 769}, + { 9, 1025}, + { 9, 1537}, + {10, 2049}, + {10, 3073}, + {11, 4097}, + {11, 6145}, + {12, 8193}, + {12, 12289}, + {13, 16385}, + {13, 24577} +}; + +FlateStream::FlateStream(Stream *str, int predictor1, int columns1, + int colors1, int bits1): + FilterStream(str) { + if (predictor1 != 1) { + pred = new StreamPredictor(this, predictor1, columns1, colors1, bits1); + } else { + pred = NULL; + } +} + +FlateStream::~FlateStream() { + if (pred) { + delete pred; + } + delete str; +} + +void FlateStream::reset() { + int cmf, flg; + + index = 0; + remain = 0; + codeBuf = 0; + codeSize = 0; + compressedBlock = gFalse; + endOfBlock = gTrue; + eof = gTrue; + + str->reset(); + + // read header + //~ need to look at window size? + endOfBlock = eof = gTrue; + cmf = str->getChar(); + flg = str->getChar(); + if (cmf == EOF || flg == EOF) + return; + if ((cmf & 0x0f) != 0x08) { + error(getPos(), "Unknown compression method in flate stream"); + return; + } + if ((((cmf << 8) + flg) % 31) != 0) { + error(getPos(), "Bad FCHECK in flate stream"); + return; + } + if (flg & 0x20) { + error(getPos(), "FDICT bit set in flate stream"); + return; + } + + eof = gFalse; +} + +int FlateStream::getChar() { + int c; + + if (pred) { + return pred->getChar(); + } + while (remain == 0) { + if (endOfBlock && eof) + return EOF; + readSome(); + } + c = buf[index]; + index = (index + 1) & flateMask; + --remain; + return c; +} + +int FlateStream::lookChar() { + int c; + + if (pred) { + return pred->lookChar(); + } + while (remain == 0) { + if (endOfBlock && eof) + return EOF; + readSome(); + } + c = buf[index]; + return c; +} + +int FlateStream::getRawChar() { + int c; + + while (remain == 0) { + if (endOfBlock && eof) + return EOF; + readSome(); + } + c = buf[index]; + index = (index + 1) & flateMask; + --remain; + return c; +} + +GString *FlateStream::getPSFilter(char *indent) { + return NULL; +} + +GBool FlateStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +void FlateStream::readSome() { + int code1, code2; + int len, dist; + int i, j, k; + int c; + + if (endOfBlock) { + if (!startBlock()) + return; + } + + if (compressedBlock) { + if ((code1 = getHuffmanCodeWord(&litCodeTab)) == EOF) + goto err; + if (code1 < 256) { + buf[index] = code1; + remain = 1; + } else if (code1 == 256) { + endOfBlock = gTrue; + remain = 0; + } else { + code1 -= 257; + code2 = lengthDecode[code1].bits; + if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF) + goto err; + len = lengthDecode[code1].first + code2; + if ((code1 = getHuffmanCodeWord(&distCodeTab)) == EOF) + goto err; + code2 = distDecode[code1].bits; + if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF) + goto err; + dist = distDecode[code1].first + code2; + i = index; + j = (index - dist) & flateMask; + for (k = 0; k < len; ++k) { + buf[i] = buf[j]; + i = (i + 1) & flateMask; + j = (j + 1) & flateMask; + } + remain = len; + } + + } else { + len = (blockLen < flateWindow) ? blockLen : flateWindow; + for (i = 0, j = index; i < len; ++i, j = (j + 1) & flateMask) { + if ((c = str->getChar()) == EOF) { + endOfBlock = eof = gTrue; + break; + } + buf[j] = c & 0xff; + } + remain = i; + blockLen -= len; + if (blockLen == 0) + endOfBlock = gTrue; + } + + return; + +err: + error(getPos(), "Unexpected end of file in flate stream"); + endOfBlock = eof = gTrue; + remain = 0; +} + +GBool FlateStream::startBlock() { + int blockHdr; + int c; + int check; + + // read block header + blockHdr = getCodeWord(3); + if (blockHdr & 1) + eof = gTrue; + blockHdr >>= 1; + + // uncompressed block + if (blockHdr == 0) { + compressedBlock = gFalse; + if ((c = str->getChar()) == EOF) + goto err; + blockLen = c & 0xff; + if ((c = str->getChar()) == EOF) + goto err; + blockLen |= (c & 0xff) << 8; + if ((c = str->getChar()) == EOF) + goto err; + check = c & 0xff; + if ((c = str->getChar()) == EOF) + goto err; + check |= (c & 0xff) << 8; + if (check != (~blockLen & 0xffff)) + error(getPos(), "Bad uncompressed block length in flate stream"); + codeBuf = 0; + codeSize = 0; + + // compressed block with fixed codes + } else if (blockHdr == 1) { + compressedBlock = gTrue; + loadFixedCodes(); + + // compressed block with dynamic codes + } else if (blockHdr == 2) { + compressedBlock = gTrue; + if (!readDynamicCodes()) + goto err; + + // unknown block type + } else { + goto err; + } + + endOfBlock = gFalse; + return gTrue; + +err: + error(getPos(), "Bad block header in flate stream"); + endOfBlock = eof = gTrue; + return gFalse; +} + +void FlateStream::loadFixedCodes() { + int i; + + // set up code arrays + litCodeTab.codes = allCodes; + distCodeTab.codes = allCodes + flateMaxLitCodes; + + // initialize literal code table + for (i = 0; i <= 143; ++i) + litCodeTab.codes[i].len = 8; + for (i = 144; i <= 255; ++i) + litCodeTab.codes[i].len = 9; + for (i = 256; i <= 279; ++i) + litCodeTab.codes[i].len = 7; + for (i = 280; i <= 287; ++i) + litCodeTab.codes[i].len = 8; + compHuffmanCodes(&litCodeTab, flateMaxLitCodes); + + // initialize distance code table + for (i = 0; i <= 5; ++i) { + distCodeTab.start[i] = 0; + } + for (i = 6; i <= flateMaxHuffman+1; ++i) { + distCodeTab.start[i] = flateMaxDistCodes; + } + for (i = 0; i < flateMaxDistCodes; ++i) { + distCodeTab.codes[i].len = 5; + distCodeTab.codes[i].code = i; + distCodeTab.codes[i].val = i; + } +} + +GBool FlateStream::readDynamicCodes() { + int numCodeLenCodes; + int numLitCodes; + int numDistCodes; + FlateCode codeLenCodes[flateMaxCodeLenCodes]; + FlateHuffmanTab codeLenCodeTab; + int len, repeat, code; + int i; + + // read lengths + if ((numLitCodes = getCodeWord(5)) == EOF) + goto err; + numLitCodes += 257; + if ((numDistCodes = getCodeWord(5)) == EOF) + goto err; + numDistCodes += 1; + if ((numCodeLenCodes = getCodeWord(4)) == EOF) + goto err; + numCodeLenCodes += 4; + if (numLitCodes > flateMaxLitCodes || + numDistCodes > flateMaxDistCodes || + numCodeLenCodes > flateMaxCodeLenCodes) + goto err; + + // read code length code table + codeLenCodeTab.codes = codeLenCodes; + for (i = 0; i < flateMaxCodeLenCodes; ++i) + codeLenCodes[i].len = 0; + for (i = 0; i < numCodeLenCodes; ++i) { + if ((codeLenCodes[codeLenCodeMap[i]].len = getCodeWord(3)) == -1) + goto err; + } + compHuffmanCodes(&codeLenCodeTab, flateMaxCodeLenCodes); + + // set up code arrays + litCodeTab.codes = allCodes; + distCodeTab.codes = allCodes + numLitCodes; + + // read literal and distance code tables + len = 0; + repeat = 0; + i = 0; + while (i < numLitCodes + numDistCodes) { + if ((code = getHuffmanCodeWord(&codeLenCodeTab)) == EOF) + goto err; + if (code == 16) { + if ((repeat = getCodeWord(2)) == EOF) + goto err; + for (repeat += 3; repeat > 0; --repeat) + allCodes[i++].len = len; + } else if (code == 17) { + if ((repeat = getCodeWord(3)) == EOF) + goto err; + len = 0; + for (repeat += 3; repeat > 0; --repeat) + allCodes[i++].len = 0; + } else if (code == 18) { + if ((repeat = getCodeWord(7)) == EOF) + goto err; + len = 0; + for (repeat += 11; repeat > 0; --repeat) + allCodes[i++].len = 0; + } else { + allCodes[i++].len = len = code; + } + } + compHuffmanCodes(&litCodeTab, numLitCodes); + compHuffmanCodes(&distCodeTab, numDistCodes); + + return gTrue; + +err: + error(getPos(), "Bad dynamic code table in flate stream"); + return gFalse; +} + +// On entry, the codes> array contains the lengths of each code, +// stored in code value order. This function computes the code words. +// The result is sorted in order of (1) code length and (2) code word. +// The length values are no longer valid. The start> array is +// filled with the indexes of the first code of each length. +void FlateStream::compHuffmanCodes(FlateHuffmanTab *tab, int n) { + int numLengths[flateMaxHuffman+1]; + int nextCode[flateMaxHuffman+1]; + int nextIndex[flateMaxHuffman+2]; + int code; + int i, j; + + // count number of codes for each code length + for (i = 0; i <= flateMaxHuffman; ++i) + numLengths[i] = 0; + for (i = 0; i < n; ++i) + ++numLengths[tab->codes[i].len]; + + // compute first index for each length + tab->start[0] = nextIndex[0] = 0; + for (i = 1; i <= flateMaxHuffman + 1; ++i) + tab->start[i] = nextIndex[i] = tab->start[i-1] + numLengths[i-1]; + + // compute first code for each length + code = 0; + numLengths[0] = 0; + for (i = 1; i <= flateMaxHuffman; ++i) { + code = (code + numLengths[i-1]) << 1; + nextCode[i] = code; + } + + // compute the codes -- this permutes the codes array from value + // order to length/code order + for (i = 0; i < n; ++i) { + j = nextIndex[tab->codes[i].len]++; + if (tab->codes[i].len == 0) + tab->codes[j].code = 0; + else + tab->codes[j].code = nextCode[tab->codes[i].len]++; + tab->codes[j].val = i; + } +} + +int FlateStream::getHuffmanCodeWord(FlateHuffmanTab *tab) { + int len; + int code; + int c; + int i, j; + + code = 0; + for (len = 1; len <= flateMaxHuffman; ++len) { + + // add a bit to the code + if (codeSize == 0) { + if ((c = str->getChar()) == EOF) + return EOF; + codeBuf = c & 0xff; + codeSize = 8; + } + code = (code << 1) | (codeBuf & 1); + codeBuf >>= 1; + --codeSize; + + // look for code + i = tab->start[len]; + j = tab->start[len + 1]; + if (i < j && code >= tab->codes[i].code && code <= tab->codes[j-1].code) { + i += code - tab->codes[i].code; + return tab->codes[i].val; + } + } + + // not found + error(getPos(), "Bad code (%04x) in flate stream", code); + return EOF; +} + +int FlateStream::getCodeWord(int bits) { + int c; + + while (codeSize < bits) { + if ((c = str->getChar()) == EOF) + return EOF; + codeBuf |= (c & 0xff) << codeSize; + codeSize += 8; + } + c = codeBuf & ((1 << bits) - 1); + codeBuf >>= bits; + codeSize -= bits; + return c; +} + +//------------------------------------------------------------------------ +// EOFStream +//------------------------------------------------------------------------ + +EOFStream::EOFStream(Stream *str): + FilterStream(str) { +} + +EOFStream::~EOFStream() { + delete str; +} + +//------------------------------------------------------------------------ +// FixedLengthEncoder +//------------------------------------------------------------------------ + +FixedLengthEncoder::FixedLengthEncoder(Stream *str, int length1): + FilterStream(str) { + length = length1; + count = 0; +} + +FixedLengthEncoder::~FixedLengthEncoder() { + if (str->isEncoder()) + delete str; +} + +void FixedLengthEncoder::reset() { + str->reset(); + count = 0; +} + +void FixedLengthEncoder::close() { +} + +int FixedLengthEncoder::getChar() { + if (length >= 0 && count >= length) + return EOF; + ++count; + return str->getChar(); +} + +int FixedLengthEncoder::lookChar() { + if (length >= 0 && count >= length) + return EOF; + return str->getChar(); +} + +//------------------------------------------------------------------------ +// ASCII85Encoder +//------------------------------------------------------------------------ + +ASCII85Encoder::ASCII85Encoder(Stream *str): + FilterStream(str) { + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +ASCII85Encoder::~ASCII85Encoder() { + if (str->isEncoder()) + delete str; +} + +void ASCII85Encoder::reset() { + str->reset(); + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +void ASCII85Encoder::close() { +} + +GBool ASCII85Encoder::fillBuf() { + Gulong t; + char buf1[5]; + int c; + int n, i; + + if (eof) + return gFalse; + t = 0; + for (n = 0; n < 4; ++n) { + if ((c = str->getChar()) == EOF) + break; + t = (t << 8) + c; + } + bufPtr = bufEnd = buf; + if (n > 0) { + if (n == 4 && t == 0) { + *bufEnd++ = 'z'; + if (++lineLen == 65) { + *bufEnd++ = '\n'; + lineLen = 0; + } + } else { + if (n < 4) + t <<= 8 * (4 - n); + for (i = 4; i >= 0; --i) { + buf1[i] = (char)(t % 85 + 0x21); + t /= 85; + } + for (i = 0; i <= n; ++i) { + *bufEnd++ = buf1[i]; + if (++lineLen == 65) { + *bufEnd++ = '\n'; + lineLen = 0; + } + } + } + } + if (n < 4) { + *bufEnd++ = '~'; + *bufEnd++ = '>'; + eof = gTrue; + } + return bufPtr < bufEnd; +} + +//------------------------------------------------------------------------ +// RunLengthEncoder +//------------------------------------------------------------------------ + +RunLengthEncoder::RunLengthEncoder(Stream *str): + FilterStream(str) { + bufPtr = bufEnd = nextEnd = buf; + eof = gFalse; +} + +RunLengthEncoder::~RunLengthEncoder() { + if (str->isEncoder()) + delete str; +} + +void RunLengthEncoder::reset() { + str->reset(); + bufPtr = bufEnd = nextEnd = buf; + eof = gFalse; +} + +void RunLengthEncoder::close() { +} + +// +// When fillBuf finishes, buf[] looks like this: +// +-----+--------------+-----------------+-- +// + tag | ... data ... | next 0, 1, or 2 | +// +-----+--------------+-----------------+-- +// ^ ^ ^ +// bufPtr bufEnd nextEnd +// +GBool RunLengthEncoder::fillBuf() { + int c, c1, c2; + int n; + + // already hit EOF? + if (eof) + return gFalse; + + // grab two bytes + if (nextEnd < bufEnd + 1) { + if ((c1 = str->getChar()) == EOF) { + eof = gTrue; + return gFalse; + } + } else { + c1 = bufEnd[0] & 0xff; + } + if (nextEnd < bufEnd + 2) { + if ((c2 = str->getChar()) == EOF) { + eof = gTrue; + buf[0] = 0; + buf[1] = c1; + bufPtr = buf; + bufEnd = &buf[2]; + return gTrue; + } + } else { + c2 = bufEnd[1] & 0xff; + } + + // check for repeat + c = 0; // make gcc happy + if (c1 == c2) { + n = 2; + while (n < 128 && (c = str->getChar()) == c1) + ++n; + buf[0] = (char)(257 - n); + buf[1] = c1; + bufEnd = &buf[2]; + if (c == EOF) { + eof = gTrue; + } else if (n < 128) { + buf[2] = c; + nextEnd = &buf[3]; + } else { + nextEnd = bufEnd; + } + + // get up to 128 chars + } else { + buf[1] = c1; + buf[2] = c2; + n = 2; + while (n < 128) { + if ((c = str->getChar()) == EOF) { + eof = gTrue; + break; + } + ++n; + buf[n] = c; + if (buf[n] == buf[n-1]) + break; + } + if (buf[n] == buf[n-1]) { + buf[0] = (char)(n-2-1); + bufEnd = &buf[n-1]; + nextEnd = &buf[n+1]; + } else { + buf[0] = (char)(n-1); + bufEnd = nextEnd = &buf[n+1]; + } + } + bufPtr = buf; + return gTrue; +} diff --git a/pdf2swf/xpdf/Stream.h b/pdf2swf/xpdf/Stream.h new file mode 100644 index 00000000..50345bb0 --- /dev/null +++ b/pdf2swf/xpdf/Stream.h @@ -0,0 +1,723 @@ +//======================================================================== +// +// Stream.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef STREAM_H +#define STREAM_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include +#include "gtypes.h" +#include "Object.h" + +#ifndef NO_DECRYPTION +class Decrypt; +#endif +class BaseStream; + +//------------------------------------------------------------------------ + +enum StreamKind { + strFile, + strASCIIHex, + strASCII85, + strLZW, + strRunLength, + strCCITTFax, + strDCT, + strFlate, + strWeird // internal-use stream types +}; + +//------------------------------------------------------------------------ +// Stream (base class) +//------------------------------------------------------------------------ + +class Stream { +public: + + // Constructor. + Stream(); + + // Destructor. + virtual ~Stream(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get kind of stream. + virtual StreamKind getKind() = 0; + + // Reset stream to beginning. + virtual void reset() = 0; + + // Close down the stream. + virtual void close(); + + // Get next char from stream. + virtual int getChar() = 0; + + // Peek at next char in stream. + virtual int lookChar() = 0; + + // Get next char from stream without using the predictor. + // This is only used by StreamPredictor. + virtual int getRawChar(); + + // Get next line from stream. + virtual char *getLine(char *buf, int size); + + // Get current position in file. + virtual int getPos() = 0; + + // Go to a position in the stream. + virtual void setPos(int pos1) = 0; + + // Get PostScript command for the filter(s). + virtual GString *getPSFilter(char *indent); + + // Does this stream type potentially contain non-printable chars? + virtual GBool isBinary(GBool last = gTrue) = 0; + + // Get the BaseStream or EmbedStream of this stream. + virtual BaseStream *getBaseStream() = 0; + + // Get the dictionary associated with this stream. + virtual Dict *getDict() = 0; + + // Is this an encoding filter? + virtual GBool isEncoder() { return gFalse; } + + // Add filters to this stream according to the parameters in . + // Returns the new stream. + Stream *addFilters(Object *dict); + +private: + + Stream *makeFilter(char *name, Stream *str, Object *params); + + int ref; // reference count +}; + +//------------------------------------------------------------------------ +// BaseStream +// +// This is the base class for all streams that read directly from a file. +//------------------------------------------------------------------------ + +class BaseStream: public Stream { +public: + + BaseStream(Object *dict); + virtual ~BaseStream(); + virtual Stream *makeSubStream(int start, int length, Object *dict) = 0; + virtual void setPos(int pos1) = 0; + virtual BaseStream *getBaseStream() { return this; } + virtual Dict *getDict() { return dict.getDict(); } + + // Get/set position of first byte of stream within the file. + virtual int getStart() = 0; + virtual void moveStart(int delta) = 0; + +#ifndef NO_DECRYPTION + // Set decryption for this stream. + void doDecryption(Guchar *fileKey, int objNum, int objGen); +#endif + +#ifndef NO_DECRYPTION +protected: + + Decrypt *decrypt; +#endif + +private: + + Object dict; +}; + +//------------------------------------------------------------------------ +// FilterStream +// +// This is the base class for all streams that filter another stream. +//------------------------------------------------------------------------ + +class FilterStream: public Stream { +public: + + FilterStream(Stream *str); + virtual ~FilterStream(); + virtual void close(); + virtual int getPos() { return str->getPos(); } + virtual void setPos(int pos); + virtual BaseStream *getBaseStream() { return str->getBaseStream(); } + virtual Dict *getDict() { return str->getDict(); } + +protected: + + Stream *str; +}; + +//------------------------------------------------------------------------ +// ImageStream +//------------------------------------------------------------------------ + +class ImageStream { +public: + + // Create an image stream object for an image with the specified + // parameters. Note that these are the actual image parameters, + // which may be different from the predictor parameters. + ImageStream(Stream *str, int width, int nComps, int nBits); + + ~ImageStream(); + + // Reset the stream. + void reset(); + + // Gets the next pixel from the stream. should be able to hold + // at least nComps elements. Returns false at end of file. + GBool getPixel(Guchar *pix); + + // Skip an entire line from the image. + void skipLine(); + +private: + + Stream *str; // base stream + int width; // pixels per line + int nComps; // components per pixel + int nBits; // bits per component + int nVals; // components per line + Guchar *imgLine; // line buffer + int imgIdx; // current index in imgLine +}; + +//------------------------------------------------------------------------ +// StreamPredictor +//------------------------------------------------------------------------ + +class StreamPredictor { +public: + + // Create a predictor object. Note that the parameters are for the + // predictor, and may not match the actual image parameters. + StreamPredictor(Stream *str, int predictor, + int width, int nComps, int nBits); + + ~StreamPredictor(); + + int lookChar(); + int getChar(); + +private: + + GBool getNextLine(); + + Stream *str; // base stream + int predictor; // predictor + int width; // pixels per line + int nComps; // components per pixel + int nBits; // bits per component + int nVals; // components per line + int pixBytes; // bytes per pixel + int rowBytes; // bytes per line + Guchar *predLine; // line buffer + int predIdx; // current index in predLine +}; + +//------------------------------------------------------------------------ +// FileStream +//------------------------------------------------------------------------ + +#define fileStreamBufSize 256 + +class FileStream: public BaseStream { +public: + + FileStream(FILE *f, int start, int length, Object *dict); + virtual ~FileStream(); + virtual Stream *makeSubStream(int start, int length, Object *dict); + virtual StreamKind getKind() { return strFile; } + virtual void reset(); + virtual void close(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual int getPos() { return bufPos + (bufPtr - buf); } + virtual void setPos(int pos1); + virtual GBool isBinary(GBool last = gTrue) { return last; } + virtual int getStart() { return start; } + virtual void moveStart(int delta); + +private: + + GBool fillBuf(); + + FILE *f; + int start; + int length; + char buf[fileStreamBufSize]; + char *bufPtr; + char *bufEnd; + int bufPos; + int savePos; +}; + +//------------------------------------------------------------------------ +// EmbedStream +// +// This is a special stream type used for embedded streams (inline +// images). It reads directly from the base stream -- after the +// EmbedStream is deleted, reads from the base stream will proceed where +// the BaseStream left off. Note that this is very different behavior +// that creating a new FileStream (using makeSubStream). +//------------------------------------------------------------------------ + +class EmbedStream: public BaseStream { +public: + + EmbedStream(Stream *str, Object *dict); + virtual ~EmbedStream(); + virtual Stream *makeSubStream(int start, int length, Object *dict); + virtual StreamKind getKind() { return str->getKind(); } + virtual void reset() {} + virtual int getChar() { return str->getChar(); } + virtual int lookChar() { return str->lookChar(); } + virtual int getPos() { return str->getPos(); } + virtual void setPos(int pos); + virtual GBool isBinary(GBool last = gTrue) { return last; } + virtual int getStart(); + virtual void moveStart(int delta); + +private: + + Stream *str; +}; + +//------------------------------------------------------------------------ +// ASCIIHexStream +//------------------------------------------------------------------------ + +class ASCIIHexStream: public FilterStream { +public: + + ASCIIHexStream(Stream *str); + virtual ~ASCIIHexStream(); + virtual StreamKind getKind() { return strASCIIHex; } + virtual void reset(); + virtual int getChar() + { int c = lookChar(); buf = EOF; return c; } + virtual int lookChar(); + virtual GString *getPSFilter(char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + int buf; + GBool eof; +}; + +//------------------------------------------------------------------------ +// ASCII85Stream +//------------------------------------------------------------------------ + +class ASCII85Stream: public FilterStream { +public: + + ASCII85Stream(Stream *str); + virtual ~ASCII85Stream(); + virtual StreamKind getKind() { return strASCII85; } + virtual void reset(); + virtual int getChar() + { int ch = lookChar(); ++index; return ch; } + virtual int lookChar(); + virtual GString *getPSFilter(char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + int c[5]; + int b[4]; + int index, n; + GBool eof; +}; + +//------------------------------------------------------------------------ +// LZWStream +//------------------------------------------------------------------------ + +class LZWStream: public FilterStream { +public: + + LZWStream(Stream *str, int predictor1, int columns1, int colors1, + int bits1, int early1); + virtual ~LZWStream(); + virtual StreamKind getKind() { return strLZW; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual int getRawChar(); + virtual GString *getPSFilter(char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + StreamPredictor *pred; // predictor + int early; // early parameter + FILE *zPipe; // uncompress pipe + GString *zName; // .Z file name + int inputBuf; // input buffer + int inputBits; // number of bits in input buffer + int inCodeBits; // size of input code + char buf[256]; // buffer + char *bufPtr; // next char to read + char *bufEnd; // end of buffer + + void dumpFile(FILE *f); + int getCode(); + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// RunLengthStream +//------------------------------------------------------------------------ + +class RunLengthStream: public FilterStream { +public: + + RunLengthStream(Stream *str); + virtual ~RunLengthStream(); + virtual StreamKind getKind() { return strRunLength; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GString *getPSFilter(char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + char buf[128]; // buffer + char *bufPtr; // next char to read + char *bufEnd; // end of buffer + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// CCITTFaxStream +//------------------------------------------------------------------------ + +struct CCITTCodeTable; + +class CCITTFaxStream: public FilterStream { +public: + + CCITTFaxStream(Stream *str, int encoding, GBool endOfLine, + GBool byteAlign, int columns, int rows, + GBool endOfBlock, GBool black); + virtual ~CCITTFaxStream(); + virtual StreamKind getKind() { return strCCITTFax; } + virtual void reset(); + virtual int getChar() + { int c = lookChar(); buf = EOF; return c; } + virtual int lookChar(); + virtual GString *getPSFilter(char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + int encoding; // 'K' parameter + GBool endOfLine; // 'EndOfLine' parameter + GBool byteAlign; // 'EncodedByteAlign' parameter + int columns; // 'Columns' parameter + int rows; // 'Rows' parameter + GBool endOfBlock; // 'EndOfBlock' parameter + GBool black; // 'BlackIs1' parameter + GBool eof; // true if at eof + GBool nextLine2D; // true if next line uses 2D encoding + int row; // current row + int inputBuf; // input buffer + int inputBits; // number of bits in input buffer + short *refLine; // reference line changing elements + int b1; // index into refLine + short *codingLine; // coding line changing elements + int a0; // index into codingLine + int outputBits; // remaining ouput bits + int buf; // character buffer + + short getTwoDimCode(); + short getWhiteCode(); + short getBlackCode(); + short lookBits(int n); + void eatBits(int n) { inputBits -= n; } +}; + +//------------------------------------------------------------------------ +// DCTStream +//------------------------------------------------------------------------ + +// DCT component info +struct DCTCompInfo { + int id; // component ID + GBool inScan; // is this component in the current scan? + int hSample, vSample; // horiz/vert sampling resolutions + int quantTable; // quantization table number + int dcHuffTable, acHuffTable; // Huffman table numbers + int prevDC; // DC coefficient accumulator +}; + +// DCT Huffman decoding table +struct DCTHuffTable { + Guchar firstSym[17]; // first symbol for this bit length + Gushort firstCode[17]; // first code for this bit length + Gushort numCodes[17]; // number of codes of this bit length + Guchar sym[256]; // symbols +}; + +class DCTStream: public FilterStream { +public: + + DCTStream(Stream *str); + virtual ~DCTStream(); + virtual StreamKind getKind() { return strDCT; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual GString *getPSFilter(char *indent); + virtual GBool isBinary(GBool last = gTrue); + Stream *getRawStream() { return str; } + +private: + + int width, height; // image size + int mcuWidth, mcuHeight; // size of min coding unit, in data units + DCTCompInfo compInfo[4]; // info for each component + int numComps; // number of components in image + int colorXform; // need YCbCr-to-RGB transform? + GBool gotAdobeMarker; // set if APP14 Adobe marker was present + int restartInterval; // restart interval, in MCUs + Guchar quantTables[4][64]; // quantization tables + int numQuantTables; // number of quantization tables + DCTHuffTable dcHuffTables[4]; // DC Huffman tables + DCTHuffTable acHuffTables[4]; // AC Huffman tables + int numDCHuffTables; // number of DC Huffman tables + int numACHuffTables; // number of AC Huffman tables + Guchar *rowBuf[4][32]; // buffer for one MCU + int comp, x, y, dy; // current position within image/MCU + int restartCtr; // MCUs left until restart + int restartMarker; // next restart marker + int inputBuf; // input buffer for variable length codes + int inputBits; // number of valid bits in input buffer + + void restart(); + GBool readMCURow(); + GBool readDataUnit(DCTHuffTable *dcHuffTable, DCTHuffTable *acHuffTable, + Guchar quantTable[64], int *prevDC, Guchar data[64]); + int readHuffSym(DCTHuffTable *table); + int readAmp(int size); + int readBit(); + GBool readHeader(); + GBool readFrameInfo(); + GBool readScanInfo(); + GBool readQuantTables(); + GBool readHuffmanTables(); + GBool readRestartInterval(); + GBool readAdobeMarker(); + GBool readTrailer(); + int readMarker(); + int read16(); +}; + +//------------------------------------------------------------------------ +// FlateStream +//------------------------------------------------------------------------ + +#define flateWindow 32768 // buffer size +#define flateMask (flateWindow-1) +#define flateMaxHuffman 15 // max Huffman code length +#define flateMaxCodeLenCodes 19 // max # code length codes +#define flateMaxLitCodes 288 // max # literal codes +#define flateMaxDistCodes 30 // max # distance codes + +// Huffman code table entry +struct FlateCode { + int len; // code length in bits + int code; // code word + int val; // value represented by this code +}; + +// Huffman code table +struct FlateHuffmanTab { + int start[flateMaxHuffman+2]; // indexes of first code of each length + FlateCode *codes; // codes, sorted by length and code word +}; + +// Decoding info for length and distance code words +struct FlateDecode { + int bits; // # extra bits + int first; // first length/distance +}; + +class FlateStream: public FilterStream { +public: + + FlateStream(Stream *str, int predictor1, int columns1, + int colors1, int bits1); + virtual ~FlateStream(); + virtual StreamKind getKind() { return strFlate; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual int getRawChar(); + virtual GString *getPSFilter(char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + StreamPredictor *pred; // predictor + Guchar buf[flateWindow]; // output data buffer + int index; // current index into output buffer + int remain; // number valid bytes in output buffer + int codeBuf; // input buffer + int codeSize; // number of bits in input buffer + FlateCode // literal and distance codes + allCodes[flateMaxLitCodes + flateMaxDistCodes]; + FlateHuffmanTab litCodeTab; // literal code table + FlateHuffmanTab distCodeTab; // distance code table + GBool compressedBlock; // set if reading a compressed block + int blockLen; // remaining length of uncompressed block + GBool endOfBlock; // set when end of block is reached + GBool eof; // set when end of stream is reached + + static int // code length code reordering + codeLenCodeMap[flateMaxCodeLenCodes]; + static FlateDecode // length decoding info + lengthDecode[flateMaxLitCodes-257]; + static FlateDecode // distance decoding info + distDecode[flateMaxDistCodes]; + + void readSome(); + GBool startBlock(); + void loadFixedCodes(); + GBool readDynamicCodes(); + void compHuffmanCodes(FlateHuffmanTab *tab, int n); + int getHuffmanCodeWord(FlateHuffmanTab *tab); + int getCodeWord(int bits); +}; + +//------------------------------------------------------------------------ +// EOFStream +//------------------------------------------------------------------------ + +class EOFStream: public FilterStream { +public: + + EOFStream(Stream *str); + virtual ~EOFStream(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset() {} + virtual int getChar() { return EOF; } + virtual int lookChar() { return EOF; } + virtual GString *getPSFilter(char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gFalse; } +}; + +//------------------------------------------------------------------------ +// FixedLengthEncoder +//------------------------------------------------------------------------ + +class FixedLengthEncoder: public FilterStream { +public: + + FixedLengthEncoder(Stream *str, int length1); + ~FixedLengthEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual void close(); + virtual int getChar(); + virtual int lookChar(); + virtual GString *getPSFilter(char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + int length; + int count; +}; + +//------------------------------------------------------------------------ +// ASCII85Encoder +//------------------------------------------------------------------------ + +class ASCII85Encoder: public FilterStream { +public: + + ASCII85Encoder(Stream *str); + virtual ~ASCII85Encoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual void close(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GString *getPSFilter(char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[8]; + char *bufPtr; + char *bufEnd; + int lineLen; + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// RunLengthEncoder +//------------------------------------------------------------------------ + +class RunLengthEncoder: public FilterStream { +public: + + RunLengthEncoder(Stream *str); + virtual ~RunLengthEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual void close(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GString *getPSFilter(char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[131]; + char *bufPtr; + char *bufEnd; + char *nextEnd; + GBool eof; + + GBool fillBuf(); +}; + +#endif diff --git a/pdf2swf/xpdf/XRef.cc b/pdf2swf/xpdf/XRef.cc new file mode 100644 index 00000000..d70b9f20 --- /dev/null +++ b/pdf2swf/xpdf/XRef.cc @@ -0,0 +1,592 @@ +//======================================================================== +// +// XRef.cc +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include +#include +#include +#include +#include "gmem.h" +#include "Object.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" +#include "Dict.h" +#ifndef NO_DECRYPTION +#include "Decrypt.h" +#endif +#include "Error.h" +#include "XRef.h" + +//------------------------------------------------------------------------ + +#define xrefSearchSize 1024 // read this many bytes at end of file + // to look for 'startxref' + +#ifndef NO_DECRYPTION +//------------------------------------------------------------------------ +// Permission bits +//------------------------------------------------------------------------ + +#define permPrint (1<<2) +#define permChange (1<<3) +#define permCopy (1<<4) +#define permNotes (1<<5) +#define defPermFlags 0xfffc +#endif + +//------------------------------------------------------------------------ +// The global xref table +//------------------------------------------------------------------------ + +XRef *xref = NULL; + +//------------------------------------------------------------------------ +// XRef +//------------------------------------------------------------------------ + +XRef::XRef(BaseStream *str, GString *userPassword) { + XRef *oldXref; + int pos; + int i; + + ok = gTrue; + size = 0; + entries = NULL; + streamEnds = NULL; + streamEndsLen = 0; + + // get rid of old xref (otherwise it will try to fetch the Root object + // in the new document, using the old xref) + oldXref = xref; + xref = NULL; + + // read the trailer + this->str = str; + start = str->getStart(); + pos = readTrailer(); + + // if there was a problem with the trailer, + // try to reconstruct the xref table + if (pos == 0) { + if (!(ok = constructXRef())) { + xref = oldXref; + return; + } + + // trailer is ok - read the xref table + } else { + entries = (XRefEntry *)gmalloc(size * sizeof(XRefEntry)); + for (i = 0; i < size; ++i) { + entries[i].offset = -1; + entries[i].used = gFalse; + } + while (readXRef(&pos)) ; + + // if there was a problem with the xref table, + // try to reconstruct it + if (!ok) { + gfree(entries); + size = 0; + entries = NULL; + if (!(ok = constructXRef())) { + xref = oldXref; + return; + } + } + } + + // set up new xref table + xref = this; + + // check for encryption +#ifndef NO_DECRYPTION + encrypted = gFalse; +#endif + if (checkEncrypted(userPassword)) { + ok = gFalse; + xref = oldXref; + return; + } +} + +XRef::~XRef() { + gfree(entries); + trailerDict.free(); + if (streamEnds) { + gfree(streamEnds); + } +} + +// Read startxref position, xref table size, and root. Returns +// first xref position. +int XRef::readTrailer() { + Parser *parser; + Object obj; + char buf[xrefSearchSize+1]; + int n, pos, pos1; + char *p; + int c; + int i; + + // read last xrefSearchSize bytes + str->setPos(-xrefSearchSize); + for (n = 0; n < xrefSearchSize; ++n) { + if ((c = str->getChar()) == EOF) + break; + buf[n] = c; + } + buf[n] = '\0'; + + // find startxref + for (i = n - 9; i >= 0; --i) { + if (!strncmp(&buf[i], "startxref", 9)) + break; + } + if (i < 0) + return 0; + for (p = &buf[i+9]; isspace(*p); ++p) ; + pos = lastXRefPos = atoi(p); + + // find trailer dict by looking after first xref table + // (NB: we can't just use the trailer dict at the end of the file -- + // this won't work for linearized files.) + str->setPos(start + pos); + for (i = 0; i < 4; ++i) + buf[i] = str->getChar(); + if (strncmp(buf, "xref", 4)) + return 0; + pos1 = pos + 4; + while (1) { + str->setPos(start + pos1); + for (i = 0; i < 35; ++i) { + if ((c = str->getChar()) == EOF) + return 0; + buf[i] = c; + } + if (!strncmp(buf, "trailer", 7)) + break; + p = buf; + while (isspace(*p)) ++p; + while ('0' <= *p && *p <= '9') ++p; + while (isspace(*p)) ++p; + n = atoi(p); + while ('0' <= *p && *p <= '9') ++p; + while (isspace(*p)) ++p; + if (p == buf) + return 0; + pos1 += (p - buf) + n * 20; + } + pos1 += 7; + + // read trailer dict + obj.initNull(); + parser = new Parser(new Lexer(str->makeSubStream(start + pos1, -1, &obj))); + parser->getObj(&trailerDict); + if (trailerDict.isDict()) { + trailerDict.dictLookupNF("Size", &obj); + if (obj.isInt()) + size = obj.getInt(); + else + pos = 0; + obj.free(); + trailerDict.dictLookupNF("Root", &obj); + if (obj.isRef()) { + rootNum = obj.getRefNum(); + rootGen = obj.getRefGen(); + } else { + pos = 0; + } + obj.free(); + } else { + pos = 0; + } + delete parser; + + // return first xref position + return pos; +} + +// Read an xref table and the prev pointer from the trailer. +GBool XRef::readXRef(int *pos) { + Parser *parser; + Object obj, obj2; + char s[20]; + GBool more; + int first, n, i, j; + int c; + + // seek to xref in stream + str->setPos(start + *pos); + + // make sure it's an xref table + while ((c = str->getChar()) != EOF && isspace(c)) ; + s[0] = (char)c; + s[1] = (char)str->getChar(); + s[2] = (char)str->getChar(); + s[3] = (char)str->getChar(); + if (!(s[0] == 'x' && s[1] == 'r' && s[2] == 'e' && s[3] == 'f')) + goto err2; + + // read xref + while (1) { + while ((c = str->lookChar()) != EOF && isspace(c)) + str->getChar(); + if (c == 't') + break; + for (i = 0; (c = str->getChar()) != EOF && isdigit(c) && i < 20; ++i) + s[i] = (char)c; + if (i == 0) + goto err2; + s[i] = '\0'; + first = atoi(s); + while ((c = str->lookChar()) != EOF && isspace(c)) + str->getChar(); + for (i = 0; (c = str->getChar()) != EOF && isdigit(c) && i < 20; ++i) + s[i] = (char)c; + if (i == 0) + goto err2; + s[i] = '\0'; + n = atoi(s); + while ((c = str->lookChar()) != EOF && isspace(c)) + str->getChar(); + for (i = first; i < first + n; ++i) { + for (j = 0; j < 20; ++j) { + if ((c = str->getChar()) == EOF) + goto err2; + s[j] = (char)c; + } + if (entries[i].offset < 0) { + s[10] = '\0'; + entries[i].offset = atoi(s); + s[16] = '\0'; + entries[i].gen = atoi(&s[11]); + if (s[17] == 'n') + entries[i].used = gTrue; + else if (s[17] == 'f') + entries[i].used = gFalse; + else + goto err2; +#if 1 //~ + //~ PDF files of patents from the IBM Intellectual Property + //~ Network have a bug: the xref table claims to start at 1 + //~ instead of 0. + if (i == 1 && first == 1 && + entries[1].offset == 0 && entries[1].gen == 65535 && + !entries[1].used) { + i = first = 0; + entries[0] = entries[1]; + entries[1].offset = -1; + } +#endif + } + } + } + + // read prev pointer from trailer dictionary + obj.initNull(); + parser = new Parser(new Lexer(str->makeSubStream(str->getPos(), -1, &obj))); + parser->getObj(&obj); + if (!obj.isCmd("trailer")) + goto err1; + obj.free(); + parser->getObj(&obj); + if (!obj.isDict()) + goto err1; + obj.getDict()->lookupNF("Prev", &obj2); + if (obj2.isInt()) { + *pos = obj2.getInt(); + more = gTrue; + } else { + more = gFalse; + } + obj.free(); + obj2.free(); + + delete parser; + return more; + + err1: + obj.free(); + err2: + ok = gFalse; + return gFalse; +} + +// Attempt to construct an xref table for a damaged file. +GBool XRef::constructXRef() { + Parser *parser; + Object obj; + char buf[256]; + int pos; + int num, gen; + int newSize; + int streamEndsSize; + char *p; + int i; + GBool gotRoot; + + error(0, "PDF file is damaged - attempting to reconstruct xref table..."); + gotRoot = gFalse; + streamEndsLen = streamEndsSize = 0; + + str->reset(); + while (1) { + pos = str->getPos(); + if (!str->getLine(buf, 256)) { + break; + } + p = buf; + + // got trailer dictionary + if (!strncmp(p, "trailer", 7)) { + obj.initNull(); + parser = new Parser(new Lexer( + str->makeSubStream(start + pos + 7, -1, &obj))); + if (!trailerDict.isNone()) + trailerDict.free(); + parser->getObj(&trailerDict); + if (trailerDict.isDict()) { + trailerDict.dictLookupNF("Root", &obj); + if (obj.isRef()) { + rootNum = obj.getRefNum(); + rootGen = obj.getRefGen(); + gotRoot = gTrue; + } + obj.free(); + } else { + pos = 0; + } + delete parser; + + // look for object + } else if (isdigit(*p)) { + num = atoi(p); + do { + ++p; + } while (*p && isdigit(*p)); + if (isspace(*p)) { + do { + ++p; + } while (*p && isspace(*p)); + if (isdigit(*p)) { + gen = atoi(p); + do { + ++p; + } while (*p && isdigit(*p)); + if (isspace(*p)) { + do { + ++p; + } while (*p && isspace(*p)); + if (!strncmp(p, "obj", 3)) { + if (num >= size) { + newSize = (num + 1 + 255) & ~255; + entries = (XRefEntry *) + grealloc(entries, newSize * sizeof(XRefEntry)); + for (i = size; i < newSize; ++i) { + entries[i].offset = -1; + entries[i].used = gFalse; + } + size = newSize; + } + if (!entries[num].used || gen >= entries[num].gen) { + entries[num].offset = pos - start; + entries[num].gen = gen; + entries[num].used = gTrue; + } + } + } + } + } + + } else if (!strncmp(p, "endstream", 9)) { + if (streamEndsLen == streamEndsSize) { + streamEndsSize += 64; + streamEnds = (int *)grealloc(streamEnds, streamEndsSize * sizeof(int)); + } + streamEnds[streamEndsLen++] = pos; + } + } + + if (gotRoot) + return gTrue; + + error(-1, "Couldn't find trailer dictionary"); + return gFalse; +} + +#ifndef NO_DECRYPTION +GBool XRef::checkEncrypted(GString *userPassword) { + Object encrypt, ownerKey, userKey, permissions, fileID, fileID1; + GBool encrypted1; + GBool ret; + + ret = gFalse; + + permFlags = defPermFlags; + trailerDict.dictLookup("Encrypt", &encrypt); + if ((encrypted1 = encrypt.isDict())) { + ret = gTrue; + encrypt.dictLookup("O", &ownerKey); + encrypt.dictLookup("U", &userKey); + encrypt.dictLookup("P", &permissions); + trailerDict.dictLookup("ID", &fileID); + if (ownerKey.isString() && ownerKey.getString()->getLength() == 32 && + userKey.isString() && userKey.getString()->getLength() == 32 && + permissions.isInt() && + fileID.isArray()) { + permFlags = permissions.getInt(); + fileID.arrayGet(0, &fileID1); + if (fileID1.isString()) { + if (Decrypt::makeFileKey(ownerKey.getString(), userKey.getString(), + permFlags, fileID1.getString(), + userPassword, fileKey)) { + ret = gFalse; + } else { + error(-1, "Incorrect user password"); + } + } else { + error(-1, "Weird encryption info"); + } + fileID1.free(); + } else { + error(-1, "Weird encryption info"); + } + ownerKey.free(); + userKey.free(); + permissions.free(); + fileID.free(); + } + encrypt.free(); + + // this flag has to be set *after* we read the O/U/P strings + encrypted = encrypted1; + + return ret; +} +#else +GBool XRef::checkEncrypted(GString *userPassword) { + Object obj; + GBool encrypted; + + trailerDict.dictLookup("Encrypt", &obj); + if ((encrypted = !obj.isNull())) { + error(-1, "PDF file is encrypted and cannot be displayed"); + error(-1, "* Decryption support is currently not included in xpdf"); + error(-1, "* due to legal restrictions: the U.S.A. still has bogus"); + error(-1, "* export controls on cryptography software."); + } + obj.free(); + return encrypted; +} +#endif + +GBool XRef::okToPrint() { +#ifndef NO_DECRYPTION + if (!(permFlags & permPrint)) { + return gFalse; + } +#endif + return gTrue; +} + +GBool XRef::okToChange() { +#ifndef NO_DECRYPTION + if (!(permFlags & permChange)) { + return gFalse; + } +#endif + return gTrue; +} + +GBool XRef::okToCopy() { +#ifndef NO_DECRYPTION + if (!(permFlags & permCopy)) { + return gFalse; + } +#endif + return gTrue; +} + +GBool XRef::okToAddNotes() { +#ifndef NO_DECRYPTION + if (!(permFlags & permNotes)) { + return gFalse; + } +#endif + return gTrue; +} + +Object *XRef::fetch(int num, int gen, Object *obj) { + XRefEntry *e; + Parser *parser; + Object obj1, obj2, obj3; + + // check for bogus ref - this can happen in corrupted PDF files + if (num < 0 || num >= size) { + obj->initNull(); + return obj; + } + + e = &entries[num]; + if (e->gen == gen && e->offset >= 0) { + obj1.initNull(); + parser = new Parser(new Lexer( + str->makeSubStream(start + e->offset, -1, &obj1))); + parser->getObj(&obj1); + parser->getObj(&obj2); + parser->getObj(&obj3); + if (obj1.isInt() && obj1.getInt() == num && + obj2.isInt() && obj2.getInt() == gen && + obj3.isCmd("obj")) { +#ifndef NO_DECRYPTION + parser->getObj(obj, encrypted ? fileKey : (Guchar *)NULL, num, gen); +#else + parser->getObj(obj); +#endif + } else { + obj->initNull(); + } + obj1.free(); + obj2.free(); + obj3.free(); + delete parser; + } else { + obj->initNull(); + } + return obj; +} + +Object *XRef::getDocInfo(Object *obj) { + return trailerDict.dictLookup("Info", obj); +} + +int XRef::getStreamEnd(int start) { + int a, b, m; + + if (streamEndsLen == 0 || + start > streamEnds[streamEndsLen - 1]) { + return -1; + } + + a = -1; + b = streamEndsLen - 1; + // invariant: streamEnds[a] < start <= streamEnds[b] + while (b - a > 1) { + m = (a + b) / 2; + if (start <= streamEnds[m]) { + b = m; + } else { + a = m; + } + } + return streamEnds[b]; +} diff --git a/pdf2swf/xpdf/XRef.h b/pdf2swf/xpdf/XRef.h new file mode 100644 index 00000000..e2260d0c --- /dev/null +++ b/pdf2swf/xpdf/XRef.h @@ -0,0 +1,112 @@ +//======================================================================== +// +// XRef.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef XREF_H +#define XREF_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include "gtypes.h" +#include "Object.h" + +class Dict; +class Stream; + +//------------------------------------------------------------------------ +// XRef +//------------------------------------------------------------------------ + +struct XRefEntry { + int offset; + int gen; + GBool used; +}; + +class XRef { +public: + + // Constructor. Read xref table from stream. + XRef(BaseStream *str, GString *userPassword); + + // Destructor. + ~XRef(); + + // Is xref table valid? + GBool isOk() { return ok; } + + // Is the file encrypted? +#ifndef NO_DECRYPTION + GBool isEncrypted() { return encrypted; } +#else + GBool isEncrypted() { return gFalse; } +#endif + + // Check various permissions. + GBool okToPrint(); + GBool okToChange(); + GBool okToCopy(); + GBool okToAddNotes(); + + // Get catalog object. + Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); } + + // Fetch an indirect reference. + Object *fetch(int num, int gen, Object *obj); + + // Return the document's Info dictionary (if any). + Object *getDocInfo(Object *obj); + + // Return the number of objects in the xref table. + int getNumObjects() { return size; } + + // Return the offset of the last xref table. + int getLastXRefPos() { return lastXRefPos; } + + // Return the catalog object reference. + int getRootNum() { return rootNum; } + int getRootGen() { return rootGen; } + + // Get end position for a stream in a damaged file. + // Returns -1 if unknown or file is not damaged. + int getStreamEnd(int start); + +private: + + BaseStream *str; // input stream + int start; // offset in file (to allow for garbage + // at beginning of file) + XRefEntry *entries; // xref entries + int size; // size of array + int rootNum, rootGen; // catalog dict + GBool ok; // true if xref table is valid + Object trailerDict; // trailer dictionary + int lastXRefPos; // offset of last xref table + int *streamEnds; // 'endstream' positions - only used in + // damaged files + int streamEndsLen; // number of valid entries in streamEnds +#ifndef NO_DECRYPTION + GBool encrypted; // true if file is encrypted + int permFlags; // permission bits + Guchar fileKey[16]; // file decryption key +#endif + + int readTrailer(); + GBool readXRef(int *pos); + GBool constructXRef(); + GBool checkEncrypted(GString *userPassword); +}; + +//------------------------------------------------------------------------ +// The global xref table +//------------------------------------------------------------------------ + +extern XRef *xref; + +#endif diff --git a/pdf2swf/xpdf/config.h b/pdf2swf/xpdf/config.h new file mode 100644 index 00000000..c09d8f5a --- /dev/null +++ b/pdf2swf/xpdf/config.h @@ -0,0 +1,115 @@ +//======================================================================== +// +// config.h +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef CONFIG_H +#define CONFIG_H + +//------------------------------------------------------------------------ +// general constants +//------------------------------------------------------------------------ + +// xpdf version +#define xpdfVersion "0.92" + +// supported PDF version +#define supportedPDFVersionStr "1.3" +#define supportedPDFVersionNum 1.3 + +// copyright notice +#define xpdfCopyright "Copyright 1996-2000 Derek B. Noonburg" + +// default paper size (in points) for PostScript output +#ifdef A4_PAPER +#define defPaperWidth 595 // ISO A4 (210x297 mm) +#define defPaperHeight 842 +#else +#define defPaperWidth 612 // American letter (8.5x11") +#define defPaperHeight 792 +#endif + +// config file name +#if defined(VMS) +#define xpdfConfigFile "xpdfrc" +#else +#define xpdfConfigFile ".xpdfrc" +#endif + +//------------------------------------------------------------------------ +// X-related constants +//------------------------------------------------------------------------ + +// default maximum size of color cube to allocate +#define defaultRGBCube 5 + +// number of X server fonts to cache +#define serverFontCacheSize 16 + +// number of Type 1 (t1lib) fonts to cache +#define t1FontCacheSize 32 + +// number of TrueType (FreeType) fonts to cache +#define ttFontCacheSize 32 + +//------------------------------------------------------------------------ +// popen +//------------------------------------------------------------------------ + +#ifdef _MSC_VER +#define popen _popen +#define pclose _pclose +#endif + +#if defined(VMS) || defined(VMCMS) || defined(DOS) || defined(OS2) || defined(WIN32) || defined(__DJGPP__) || defined(__CYGWIN32) || defined(MACOS) +#define POPEN_READ_MODE "rb" +#else +#define POPEN_READ_MODE "r" +#endif + +//------------------------------------------------------------------------ +// uncompress program +//------------------------------------------------------------------------ + +#ifdef HAVE_POPEN + +// command to uncompress to stdout +# ifdef USE_GZIP +# define uncompressCmd "gzip -d -c -q" +# else +# ifdef __EMX__ +# define uncompressCmd "compress -d -c" +# else +# define uncompressCmd "uncompress -c" +# endif // __EMX__ +# endif // USE_GZIP + +#else // HAVE_POPEN + +// command to uncompress a file +# ifdef USE_GZIP +# define uncompressCmd "gzip -d -q" +# else +# define uncompressCmd "uncompress" +# endif // USE_GZIP + +#endif // HAVE_POPEN + +//------------------------------------------------------------------------ +// Win32 stuff +//------------------------------------------------------------------------ + +#ifdef CDECL +#undef CDECL +#endif + +#ifdef _MSC_VER +#define CDECL __cdecl +#else +#define CDECL +#endif + +#endif diff --git a/pdf2swf/xpdf/gfile.cc b/pdf2swf/xpdf/gfile.cc new file mode 100644 index 00000000..cc0324c2 --- /dev/null +++ b/pdf2swf/xpdf/gfile.cc @@ -0,0 +1,643 @@ +//======================================================================== +// +// gfile.cc +// +// Miscellaneous file and directory name manipulation. +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#include "../../config.h" +#ifdef WIN32 + extern "C" { +# ifndef _MSC_VER +# include +# endif + } +#else // !WIN32 +# if defined(MACOS) +# include +# elif !defined(ACORN) +# include +# include +# include +# endif +# include +# include +# if !defined(VMS) && !defined(ACORN) && !defined(MACOS) +# include +# endif +# if defined(VMS) && (__DECCXX_VER < 50200000) +# include +# endif +#endif // WIN32 +#include "GString.h" +#include "gfile.h" + +// Some systems don't define this, so just make it something reasonably +// large. +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +//------------------------------------------------------------------------ + +GString *getHomeDir() { +#ifdef VMS + //---------- VMS ---------- + return new GString("SYS$LOGIN:"); + +#elif defined(__EMX__) || defined(WIN32) + //---------- OS/2+EMX and Win32 ---------- + char *s; + GString *ret; + + if ((s = getenv("HOME"))) + ret = new GString(s); + else + ret = new GString("."); + return ret; + +#elif defined(ACORN) + //---------- RISCOS ---------- + return new GString("@"); + +#elif defined(MACOS) + //---------- MacOS ---------- + return new GString(":"); + +#else + //---------- Unix ---------- + char *s; + struct passwd *pw; + GString *ret; + + if ((s = getenv("HOME"))) { + ret = new GString(s); + } else { + if ((s = getenv("USER"))) + pw = getpwnam(s); + else + pw = getpwuid(getuid()); + if (pw) + ret = new GString(pw->pw_dir); + else + ret = new GString("."); + } + return ret; +#endif +} + +GString *getCurrentDir() { + char buf[PATH_MAX+1]; + +#if defined(__EMX__) + if (_getcwd2(buf, sizeof(buf))) +#elif defined(WIN32) + if (GetCurrentDirectory(sizeof(buf), buf)) +#elif defined(ACORN) + if (strcpy(buf, "@")) +#elif defined(MACOS) + if (strcpy(buf, ":")) +#else + if (getcwd(buf, sizeof(buf))) +#endif + return new GString(buf); + return new GString(); +} + +GString *appendToPath(GString *path, char *fileName) { +#if defined(VMS) + //---------- VMS ---------- + //~ this should handle everything necessary for file + //~ requesters, but it's certainly not complete + char *p0, *p1, *p2; + char *q1; + + p0 = path->getCString(); + p1 = p0 + path->getLength() - 1; + if (!strcmp(fileName, "-")) { + if (*p1 == ']') { + for (p2 = p1; p2 > p0 && *p2 != '.' && *p2 != '['; --p2) ; + if (*p2 == '[') + ++p2; + path->del(p2 - p0, p1 - p2); + } else if (*p1 == ':') { + path->append("[-]"); + } else { + path->clear(); + path->append("[-]"); + } + } else if ((q1 = strrchr(fileName, '.')) && !strncmp(q1, ".DIR;", 5)) { + if (*p1 == ']') { + path->insert(p1 - p0, '.'); + path->insert(p1 - p0 + 1, fileName, q1 - fileName); + } else if (*p1 == ':') { + path->append('['); + path->append(']'); + path->append(fileName, q1 - fileName); + } else { + path->clear(); + path->append(fileName, q1 - fileName); + } + } else { + if (*p1 != ']' && *p1 != ':') + path->clear(); + path->append(fileName); + } + return path; + +#elif defined(WIN32) + //---------- Win32 ---------- + GString *tmp; + char buf[256]; + char *fp; + + tmp = new GString(path); + tmp->append('/'); + tmp->append(fileName); + GetFullPathName(tmp->getCString(), sizeof(buf), buf, &fp); + delete tmp; + path->clear(); + path->append(buf); + return path; + +#elif defined(ACORN) + //---------- RISCOS ---------- + char *p; + int i; + + path->append("."); + i = path->getLength(); + path->append(fileName); + for (p = path->getCString() + i; *p; ++p) { + if (*p == '/') { + *p = '.'; + } else if (*p == '.') { + *p = '/'; + } + } + return path; + +#elif defined(MACOS) + //---------- MacOS ---------- + char *p; + int i; + + path->append(":"); + i = path->getLength(); + path->append(fileName); + for (p = path->getCString() + i; *p; ++p) { + if (*p == '/') { + *p = ':'; + } else if (*p == '.') { + *p = ':'; + } + } + return path; + +#elif defined(__EMX__) + //---------- OS/2+EMX ---------- + int i; + + // appending "." does nothing + if (!strcmp(fileName, ".")) + return path; + + // appending ".." goes up one directory + if (!strcmp(fileName, "..")) { + for (i = path->getLength() - 2; i >= 0; --i) { + if (path->getChar(i) == '/' || path->getChar(i) == '\\' || + path->getChar(i) == ':') + break; + } + if (i <= 0) { + if (path->getChar(0) == '/' || path->getChar(0) == '\\') { + path->del(1, path->getLength() - 1); + } else if (path->getLength() >= 2 && path->getChar(1) == ':') { + path->del(2, path->getLength() - 2); + } else { + path->clear(); + path->append(".."); + } + } else { + if (path->getChar(i-1) == ':') + ++i; + path->del(i, path->getLength() - i); + } + return path; + } + + // otherwise, append "/" and new path component + if (path->getLength() > 0 && + path->getChar(path->getLength() - 1) != '/' && + path->getChar(path->getLength() - 1) != '\\') + path->append('/'); + path->append(fileName); + return path; + +#else + //---------- Unix ---------- + int i; + + // appending "." does nothing + if (!strcmp(fileName, ".")) + return path; + + // appending ".." goes up one directory + if (!strcmp(fileName, "..")) { + for (i = path->getLength() - 2; i >= 0; --i) { + if (path->getChar(i) == '/') + break; + } + if (i <= 0) { + if (path->getChar(0) == '/') { + path->del(1, path->getLength() - 1); + } else { + path->clear(); + path->append(".."); + } + } else { + path->del(i, path->getLength() - i); + } + return path; + } + + // otherwise, append "/" and new path component + if (path->getLength() > 0 && + path->getChar(path->getLength() - 1) != '/') + path->append('/'); + path->append(fileName); + return path; +#endif +} + +GString *grabPath(char *fileName) { +#ifdef VMS + //---------- VMS ---------- + char *p; + + if ((p = strrchr(fileName, ']'))) + return new GString(fileName, p + 1 - fileName); + if ((p = strrchr(fileName, ':'))) + return new GString(fileName, p + 1 - fileName); + return new GString(); + +#elif defined(__EMX__) || defined(WIN32) + //---------- OS/2+EMX and Win32 ---------- + char *p; + + if ((p = strrchr(fileName, '/'))) + return new GString(fileName, p - fileName); + if ((p = strrchr(fileName, '\\'))) + return new GString(fileName, p - fileName); + if ((p = strrchr(fileName, ':'))) + return new GString(fileName, p + 1 - fileName); + return new GString(); + +#elif defined(ACORN) + //---------- RISCOS ---------- + char *p; + + if ((p = strrchr(fileName, '.'))) + return new GString(fileName, p - fileName); + return new GString(); + +#elif defined(MACOS) + //---------- MacOS ---------- + char *p; + + if ((p = strrchr(fileName, ':'))) + return new GString(fileName, p - fileName); + return new GString(); + +#else + //---------- Unix ---------- + char *p; + + if ((p = strrchr(fileName, '/'))) + return new GString(fileName, p - fileName); + return new GString(); +#endif +} + +GBool isAbsolutePath(char *path) { +#ifdef VMS + //---------- VMS ---------- + return strchr(path, ':') || + (path[0] == '[' && path[1] != '.' && path[1] != '-'); + +#elif defined(__EMX__) || defined(WIN32) + //---------- OS/2+EMX and Win32 ---------- + return path[0] == '/' || path[0] == '\\' || path[1] == ':'; + +#elif defined(ACORN) + //---------- RISCOS ---------- + return path[0] == '$'; + +#elif defined(MACOS) + //---------- MacOS ---------- + return path[0] != ':'; + +#else + //---------- Unix ---------- + return path[0] == '/'; +#endif +} + +GString *makePathAbsolute(GString *path) { +#ifdef VMS + //---------- VMS ---------- + char buf[PATH_MAX+1]; + + if (!isAbsolutePath(path->getCString())) { + if (getcwd(buf, sizeof(buf))) { + path->insert(0, buf); + } + } + return path; + +#elif defined(WIN32) + //---------- Win32 ---------- + char buf[_MAX_PATH]; + char *fp; + + buf[0] = '\0'; + if (!GetFullPathName(path->getCString(), _MAX_PATH, buf, &fp)) { + path->clear(); + return path; + } + path->clear(); + path->append(buf); + return path; + +#elif defined(ACORN) + //---------- RISCOS ---------- + path->insert(0, '@'); + return path; + +#elif defined(MACOS) + //---------- MacOS ---------- + path->del(0, 1); + return path; + +#else + //---------- Unix and OS/2+EMX ---------- + struct passwd *pw; + char buf[PATH_MAX+1]; + GString *s; + char *p1, *p2; + int n; + + if (path->getChar(0) == '~') { + if (path->getChar(1) == '/' || +#ifdef __EMX__ + path->getChar(1) == '\\' || +#endif + path->getLength() == 1) { + path->del(0, 1); + s = getHomeDir(); + path->insert(0, s); + delete s; + } else { + p1 = path->getCString() + 1; +#ifdef __EMX__ + for (p2 = p1; *p2 && *p2 != '/' && *p2 != '\\'; ++p2) ; +#else + for (p2 = p1; *p2 && *p2 != '/'; ++p2) ; +#endif + if ((n = p2 - p1) > PATH_MAX) + n = PATH_MAX; + strncpy(buf, p1, n); + buf[n] = '\0'; + if ((pw = getpwnam(buf))) { + path->del(0, p2 - p1 + 1); + path->insert(0, pw->pw_dir); + } + } + } else if (!isAbsolutePath(path->getCString())) { + if (getcwd(buf, sizeof(buf))) { +#ifndef __EMX__ + path->insert(0, '/'); +#endif + path->insert(0, buf); + } + } + return path; +#endif +} + +time_t getModTime(char *fileName) { +#ifdef WIN32 + //~ should implement this, but it's (currently) only used in xpdf + return 0; +#else + struct stat statBuf; + + if (stat(fileName, &statBuf)) { + return 0; + } + return statBuf.st_mtime; +#endif +} +static char tmpbuf[128]; +static char* mktmpname(char*ptr) { +// used to be mktemp. This does remove the warnings, but +// It's not exactly an improvement. + sprintf(tmpbuf, "%08x%08x",lrand48(),lrand48()); + return tmpbuf; +} +GBool openTempFile(GString **name, FILE **f, char *mode, char *ext) { +#if defined(VMS) || defined(__EMX__) || defined(WIN32) || defined(ACORN) || defined(MACOS) + //---------- non-Unix ---------- + char *s; + + // There is a security hole here: an attacker can create a symlink + // with this file name after the tmpnam call and before the fopen + // call. I will happily accept fixes to this function for non-Unix + // OSs. + if (!(s = mktmpname(NULL))) { + return gFalse; + } + *name = new GString(s); + if (ext) { + (*name)->append(ext); + } + if (!(*f = fopen((*name)->getCString(), mode))) { + delete (*name); + return gFalse; + } + return gTrue; +#else + //---------- Unix ---------- + char *s, *p; + int fd; + + if (ext) { + if (!(s = mktmpname(NULL))) { + return gFalse; + } + *name = new GString(s); + s = (*name)->getCString(); + if ((p = strrchr(s, '.'))) { + (*name)->del(p - s, (*name)->getLength() - (p - s)); + } + (*name)->append(ext); + fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600); + } else { +#if HAVE_MKSTEMP + if ((s = getenv("TMPDIR"))) { + *name = new GString(s); + } else { + *name = new GString("/tmp"); + } + (*name)->append("/XXXXXX"); + fd = mkstemp((*name)->getCString()); +#else // HAVE_MKSTEMP + if (!(s = mktmpname(NULL))) { + return gFalse; + } + *name = new GString(s); + fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600); +#endif // HAVE_MKSTEMP + } + if (fd < 0 || !(*f = fdopen(fd, mode))) { + delete *name; + return gFalse; + } + return gTrue; +#endif +} + +//------------------------------------------------------------------------ +// GDir and GDirEntry +//------------------------------------------------------------------------ + +GDirEntry::GDirEntry(char *dirPath, char *name1, GBool doStat) { +#ifdef VMS + char *p; +#elif defined(WIN32) + int fa; + GString *s; +#elif defined(ACORN) +#else + struct stat st; + GString *s; +#endif + + name = new GString(name1); + dir = gFalse; + if (doStat) { +#ifdef VMS + if (!strcmp(name1, "-") || + ((p = strrchr(name1, '.')) && !strncmp(p, ".DIR;", 5))) + dir = gTrue; +#elif defined(ACORN) +#else + s = new GString(dirPath); + appendToPath(s, name1); +#ifdef WIN32 + fa = GetFileAttributes(s->getCString()); + dir = (fa != 0xFFFFFFFF && (fa & FILE_ATTRIBUTE_DIRECTORY)); +#else + if (stat(s->getCString(), &st) == 0) + dir = S_ISDIR(st.st_mode); +#endif + delete s; +#endif + } +} + +GDirEntry::~GDirEntry() { + delete name; +} + +GDir::GDir(char *name, GBool doStat1) { + path = new GString(name); + doStat = doStat1; +#if defined(WIN32) + GString *tmp; + + tmp = path->copy(); + tmp->append("/*.*"); + hnd = FindFirstFile(tmp->getCString(), &ffd); + delete tmp; +#elif defined(ACORN) +#elif defined(MACOS) +#else + dir = opendir(name); +#ifdef VMS + needParent = strchr(name, '[') != NULL; +#endif +#endif +} + +GDir::~GDir() { + delete path; +#if defined(WIN32) + if (hnd) { + FindClose(hnd); + hnd = NULL; + } +#elif defined(ACORN) +#elif defined(MACOS) +#else + if (dir) + closedir(dir); +#endif +} + +GDirEntry *GDir::getNextEntry() { + struct dirent *ent; + GDirEntry *e; + + e = NULL; +#if defined(WIN32) + e = new GDirEntry(path->getCString(), ffd.cFileName, doStat); + if (hnd && !FindNextFile(hnd, &ffd)) { + FindClose(hnd); + hnd = NULL; + } +#elif defined(ACORN) +#elif defined(MACOS) +#else + if (dir) { +#ifdef VMS + if (needParent) { + e = new GDirEntry(path->getCString(), "-", doStat); + needParent = gFalse; + return e; + } +#endif + ent = readdir(dir); +#ifndef VMS + if (ent && !strcmp(ent->d_name, ".")) + ent = readdir(dir); +#endif + if (ent) + e = new GDirEntry(path->getCString(), ent->d_name, doStat); + } +#endif + return e; +} + +void GDir::rewind() { +#ifdef WIN32 + GString *tmp; + + if (hnd) + FindClose(hnd); + tmp = path->copy(); + tmp->append("/*.*"); + hnd = FindFirstFile(tmp->getCString(), &ffd); +#elif defined(ACORN) +#elif defined(MACOS) +#else + if (dir) + rewinddir(dir); +#ifdef VMS + needParent = strchr(path->getCString(), '[') != NULL; +#endif +#endif +} diff --git a/pdf2swf/xpdf/gfile.h b/pdf2swf/xpdf/gfile.h new file mode 100644 index 00000000..28289fb1 --- /dev/null +++ b/pdf2swf/xpdf/gfile.h @@ -0,0 +1,132 @@ +//======================================================================== +// +// gfile.h +// +// Miscellaneous file and directory name manipulation. +// +// Copyright 1996 Derek B. Noonburg +// +//======================================================================== + +#ifndef GFILE_H +#define GFILE_H + +#include +#include +#include +#include "../../config.h" +#if defined(WIN32) +# include +# ifdef FPTEX +# include +# else +# include +# endif +#elif defined(ACORN) +#elif defined(MACOS) +# include +#else +# include +# include +# ifdef VMS +# include "vms_dirent.h" +# elif HAVE_DIRENT_H +# include +# define NAMLEN(d) strlen((d)->d_name) +# else +# define dirent direct +# define NAMLEN(d) (d)->d_namlen +# if HAVE_SYS_NDIR_H +# include +# endif +# if HAVE_SYS_DIR_H +# include +# endif +# if HAVE_NDIR_H +# include +# endif +# endif +#endif +#include "gtypes.h" + +class GString; + +//------------------------------------------------------------------------ + +// Get home directory path. +extern GString *getHomeDir(); + +// Get current directory. +extern GString *getCurrentDir(); + +// Append a file name to a path string. may be an empty +// string, denoting the current directory). Returns . +extern GString *appendToPath(GString *path, char *fileName); + +// Grab the path from the front of the file name. If there is no +// directory component in , returns an empty string. +extern GString *grabPath(char *fileName); + +// Is this an absolute path or file name? +extern GBool isAbsolutePath(char *path); + +// Make this path absolute by prepending current directory (if path is +// relative) or prepending user's directory (if path starts with '~'). +GString *makePathAbsolute(GString *path); + +// Get the modification time for . Returns 0 if there is an +// error. +time_t getModTime(char *fileName); + +// Create a temporary file and open it for writing. If is not +// NULL, it will be used as the file name extension. Returns both the +// name and the file pointer. For security reasons, all writing +// should be done to the returned file pointer; the file may be +// reopened later for reading, but not for writing. The string +// should be "w" or "wb". Returns true on success. +GBool openTempFile(GString **name, FILE **f, char *mode, char *ext); + +//------------------------------------------------------------------------ +// GDir and GDirEntry +//------------------------------------------------------------------------ + +class GDirEntry { +public: + + GDirEntry(char *dirPath, char *name1, GBool doStat); + ~GDirEntry(); + GString *getName() { return name; } + GBool isDir() { return dir; } + +private: + + GString *name; // dir/file name + GBool dir; // is it a directory? +}; + +class GDir { +public: + + GDir(char *name, GBool doStat1 = gTrue); + ~GDir(); + GDirEntry *getNextEntry(); + void rewind(); + +private: + + GString *path; // directory path + GBool doStat; // call stat() for each entry? +#if defined(WIN32) + WIN32_FIND_DATA ffd; + HANDLE hnd; +#elif defined(ACORN) +#elif defined(MACOS) +#else + DIR *dir; // the DIR structure from opendir() +#ifdef VMS + GBool needParent; // need to return an entry for [-] +#endif +#endif +}; + +#endif diff --git a/pdf2swf/xpdf/gmem.c b/pdf2swf/xpdf/gmem.c new file mode 100644 index 00000000..cac386bc --- /dev/null +++ b/pdf2swf/xpdf/gmem.c @@ -0,0 +1,203 @@ +/* + * gmem.c + * + * Memory routines with out-of-memory checking. + * + * Copyright 1996 Derek B. Noonburg + */ + +#include +#include +#include +#include +#include "gmem.h" + +#ifdef DEBUG_MEM + +typedef struct _GMemHdr { + int size; + int index; + struct _GMemHdr *next; +} GMemHdr; + +#define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7) +#define gMemTrlSize (sizeof(long)) + +#if gmemTrlSize==8 +#define gMemDeadVal 0xdeadbeefdeadbeef +#else +#define gMemDeadVal 0xdeadbeef +#endif + +/* round data size so trailer will be aligned */ +#define gMemDataSize(size) \ + ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize) + +#define gMemNLists 64 +#define gMemListShift 4 +#define gMemListMask (gMemNLists - 1) +static GMemHdr *gMemList[gMemNLists] = { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; + +static int gMemIndex = 0; +static int gMemAlloc = 0; + +#endif /* DEBUG_MEM */ + +void *gmalloc(int size) { +#ifdef DEBUG_MEM + int size1; + char *mem; + GMemHdr *hdr; + void *data; + int lst; + long *trl, *p; + + if (size == 0) + return NULL; + size1 = gMemDataSize(size); + if (!(mem = (char *)malloc(size1 + gMemHdrSize + gMemTrlSize))) { + fprintf(stderr, "Out of memory\n"); + exit(1); + } + hdr = (GMemHdr *)mem; + data = (void *)(mem + gMemHdrSize); + trl = (long *)(mem + gMemHdrSize + size1); + hdr->size = size; + hdr->index = gMemIndex++; + lst = ((int)hdr >> gMemListShift) & gMemListMask; + hdr->next = gMemList[lst]; + gMemList[lst] = hdr; + ++gMemAlloc; + for (p = (long *)data; p <= trl; ++p) + *p = gMemDeadVal; + return data; +#else + void *p; + + if (size == 0) + return NULL; + if (!(p = malloc(size))) { + fprintf(stderr, "Out of memory\n"); + exit(1); + } + return p; +#endif +} + +void *grealloc(void *p, int size) { +#ifdef DEBUG_MEM + GMemHdr *hdr; + void *q; + int oldSize; + + if (size == 0) { + if (p) + gfree(p); + return NULL; + } + if (p) { + hdr = (GMemHdr *)((char *)p - gMemHdrSize); + oldSize = hdr->size; + q = gmalloc(size); + memcpy(q, p, size < oldSize ? size : oldSize); + gfree(p); + } else { + q = gmalloc(size); + } + return q; +#else + void *q; + + if (size == 0) { + if (p) + free(p); + return NULL; + } + if (p) + q = realloc(p, size); + else + q = malloc(size); + if (!q) { + fprintf(stderr, "Out of memory\n"); + exit(1); + } + return q; +#endif +} + +void gfree(void *p) { +#ifdef DEBUG_MEM + int size; + GMemHdr *hdr; + GMemHdr *prevHdr, *q; + int lst; + long *trl, *clr; + + if (p) { + hdr = (GMemHdr *)((char *)p - gMemHdrSize); + lst = ((int)hdr >> gMemListShift) & gMemListMask; + for (prevHdr = NULL, q = gMemList[lst]; q; prevHdr = q, q = q->next) { + if (q == hdr) + break; + } + if (q) { + if (prevHdr) + prevHdr->next = hdr->next; + else + gMemList[lst] = hdr->next; + --gMemAlloc; + size = gMemDataSize(hdr->size); + trl = (long *)((char *)hdr + gMemHdrSize + size); + if (*trl != gMemDeadVal) { + fprintf(stderr, "Overwrite past end of block %d at address %p\n", + hdr->index, p); + } + for (clr = (long *)hdr; clr <= trl; ++clr) + *clr = gMemDeadVal; + free(hdr); + } else { + fprintf(stderr, "Attempted to free bad address %p\n", p); + } + } +#else + if (p) + free(p); +#endif +} + +#ifdef DEBUG_MEM +void gMemReport(FILE *f) { + GMemHdr *p; + int lst; + + fprintf(f, "%d memory allocations in all\n", gMemIndex); + if (gMemAlloc > 0) { + fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc); + fprintf(f, " index size\n"); + fprintf(f, "-------- --------\n"); + for (lst = 0; lst < gMemNLists; ++lst) { + for (p = gMemList[lst]; p; p = p->next) + fprintf(f, "%8d %8d\n", p->index, p->size); + } + } else { + fprintf(f, "No memory blocks left allocated\n"); + } +} +#endif + +char *copyString(char *s) { + char *s1; + + s1 = (char *)gmalloc(strlen(s) + 1); + strcpy(s1, s); + return s1; +} diff --git a/pdf2swf/xpdf/gmem.h b/pdf2swf/xpdf/gmem.h new file mode 100644 index 00000000..732726d4 --- /dev/null +++ b/pdf2swf/xpdf/gmem.h @@ -0,0 +1,54 @@ +/* + * gmem.h + * + * Memory routines with out-of-memory checking. + * + * Copyright 1996 Derek B. Noonburg + */ + +#ifndef GMEM_H +#define GMEM_H + +#include +#include "../../config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Same as malloc, but prints error message and exits if malloc() + * returns NULL. + */ +extern void *gmalloc(int size); + +/* + * Same as realloc, but prints error message and exits if realloc() + * returns NULL. If

is NULL, calls malloc instead of realloc(). + */ +extern void *grealloc(void *p, int size); + +/* + * Same as free, but checks for and ignores NULL pointers. + */ +extern void gfree(void *p); + +#ifdef DEBUG_MEM +/* + * Report on unfreed memory. + */ +extern void gMemReport(FILE *f); +#else +#define gMemReport(f) +#endif + +/* + * Allocate memory and copy a string into it. + */ +extern char *copyString(char *s); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pdf2swf/xpdf/gtypes.h b/pdf2swf/xpdf/gtypes.h new file mode 100644 index 00000000..65932674 --- /dev/null +++ b/pdf2swf/xpdf/gtypes.h @@ -0,0 +1,29 @@ +/* + * gtypes.h + * + * Some useful simple types. + * + * Copyright 1996 Derek B. Noonburg + */ + +#ifndef GTYPES_H +#define GTYPES_H + +/* + * These have stupid names to avoid conflicts with some (but not all) + * C++ compilers which define them. + */ +typedef int GBool; +#define gTrue 1 +#define gFalse 0 + +/* + * These have stupid names to avoid conflicts with , + * which on various systems defines some random subset of these. + */ +typedef unsigned char Guchar; +typedef unsigned short Gushort; +typedef unsigned int Guint; +typedef unsigned long Gulong; + +#endif diff --git a/release.in b/release.in new file mode 100644 index 00000000..2a959ee9 --- /dev/null +++ b/release.in @@ -0,0 +1,167 @@ +#!/bin/sh +datadir=@datadir@ +name=@PACKAGE@-@VERSION@ +rm -f ${name} +rm -f ${name}.tar +rm -f ${name}.tar.gz +ln -s ./ ${name} +tar -chf ${name}.tar \ +${name}/src/swfcombine.1 \ +${name}/src/swfcombine.c \ +${name}/src/swfstrings.1 \ +${name}/src/swfstrings.c \ +${name}/src/swfdump.1 \ +${name}/src/swfdump.c \ +${name}/src/bitio.c \ +${name}/src/bitio.h \ +${name}/src/types.h \ +${name}/src/args.h \ +${name}/src/flash.c \ +${name}/src/flash.h \ +${name}/src/combine.c \ +${name}/src/combine.h \ +${name}/src/settings.h \ +${name}/src/reloc.c \ +${name}/src/reloc.h \ +${name}/src/Makefile.in \ +${name}/src/Makefile.am \ +${name}/lib/example/box.c \ +${name}/lib/example/jpegtest.c \ +${name}/lib/example/shape1.c \ +${name}/lib/example/texbox.c \ +${name}/lib/example/texbox_ac.c \ +${name}/lib/example/transtest.c \ +${name}/lib/modules/swfdump.c \ +${name}/lib/modules/swfobject.c \ +${name}/lib/modules/swfshape.c \ +${name}/lib/modules/swftext.c \ +${name}/lib/modules/swfbutton.c \ +${name}/lib/modules/swfbits.c \ +${name}/lib/modules/swftools.c \ +${name}/lib/modules/swfcgi.c \ +${name}/lib/rfxswf.c \ +${name}/lib/rfxswf.h \ +${name}/lib/log.c \ +${name}/lib/log.h \ +${name}/lib/Makefile.am \ +${name}/lib/Makefile.in \ +${name}/pdf2swf/Makefile.in \ +${name}/pdf2swf/fonts/Makefile.in \ +${name}/pdf2swf/fonts/Makefile.am \ +${name}/pdf2swf/fonts/n021003l.pfb \ +${name}/pdf2swf/fonts/n021023l.pfb \ +${name}/pdf2swf/fonts/n021004l.pfb \ +${name}/pdf2swf/fonts/n021024l.pfb \ +${name}/pdf2swf/fonts/n019003l.pfb \ +${name}/pdf2swf/fonts/n019023l.pfb \ +${name}/pdf2swf/fonts/n019004l.pfb \ +${name}/pdf2swf/fonts/n019024l.pfb \ +${name}/pdf2swf/fonts/n022003l.pfb \ +${name}/pdf2swf/fonts/n022023l.pfb \ +${name}/pdf2swf/fonts/n022004l.pfb \ +${name}/pdf2swf/fonts/n022024l.pfb \ +${name}/pdf2swf/fonts/s050000l.pfb \ +${name}/pdf2swf/fonts/d050000l.pfb \ +${name}/pdf2swf/fonts/n021003l.afm \ +${name}/pdf2swf/fonts/n021023l.afm \ +${name}/pdf2swf/fonts/n021004l.afm \ +${name}/pdf2swf/fonts/n021024l.afm \ +${name}/pdf2swf/fonts/n019003l.afm \ +${name}/pdf2swf/fonts/n019023l.afm \ +${name}/pdf2swf/fonts/n019004l.afm \ +${name}/pdf2swf/fonts/n019024l.afm \ +${name}/pdf2swf/fonts/n022003l.afm \ +${name}/pdf2swf/fonts/n022023l.afm \ +${name}/pdf2swf/fonts/n022004l.afm \ +${name}/pdf2swf/fonts/n022024l.afm \ +${name}/pdf2swf/fonts/s050000l.afm \ +${name}/pdf2swf/fonts/d050000l.afm \ +${name}/pdf2swf/fonts/FontDataBase \ +${name}/pdf2swf/swfoutput.h \ +${name}/pdf2swf/swfoutput.cc \ +${name}/pdf2swf/swfoutput_x11.cc \ +${name}/pdf2swf/pdfswf.h \ +${name}/pdf2swf/pdfswf.cc \ +${name}/pdf2swf/spline.h \ +${name}/pdf2swf/spline.cc \ +${name}/pdf2swf/args.h \ +${name}/pdf2swf/pdf2swf.cc \ +${name}/pdf2swf/Makefile.am \ +${name}/pdf2swf/xpdf/Array.cc \ +${name}/pdf2swf/xpdf/Array.h \ +${name}/pdf2swf/xpdf/Catalog.cc \ +${name}/pdf2swf/xpdf/Catalog.h \ +${name}/pdf2swf/xpdf/CompactFontInfo.h \ +${name}/pdf2swf/xpdf/Decrypt.cc \ +${name}/pdf2swf/xpdf/Decrypt.h \ +${name}/pdf2swf/xpdf/Dict.cc \ +${name}/pdf2swf/xpdf/Dict.h \ +${name}/pdf2swf/xpdf/Error.cc \ +${name}/pdf2swf/xpdf/Error.h \ +${name}/pdf2swf/xpdf/FontEncoding.cc \ +${name}/pdf2swf/xpdf/FontEncoding.h \ +${name}/pdf2swf/xpdf/FontFile.cc \ +${name}/pdf2swf/xpdf/FontFile.h \ +${name}/pdf2swf/xpdf/FontInfo.h \ +${name}/pdf2swf/xpdf/FormWidget.cc \ +${name}/pdf2swf/xpdf/FormWidget.h \ +${name}/pdf2swf/xpdf/GString.cc \ +${name}/pdf2swf/xpdf/GString.h \ +${name}/pdf2swf/xpdf/Gfx.cc \ +${name}/pdf2swf/xpdf/Gfx.h \ +${name}/pdf2swf/xpdf/GfxFont.cc \ +${name}/pdf2swf/xpdf/GfxFont.h \ +${name}/pdf2swf/xpdf/GfxState.cc \ +${name}/pdf2swf/xpdf/GfxState.h \ +${name}/pdf2swf/xpdf/Lexer.cc \ +${name}/pdf2swf/xpdf/Lexer.h \ +${name}/pdf2swf/xpdf/Link.cc \ +${name}/pdf2swf/xpdf/Link.h \ +${name}/pdf2swf/xpdf/Object.cc \ +${name}/pdf2swf/xpdf/Object.h \ +${name}/pdf2swf/xpdf/OutputDev.cc \ +${name}/pdf2swf/xpdf/OutputDev.h \ +${name}/pdf2swf/xpdf/PDFDoc.cc \ +${name}/pdf2swf/xpdf/PDFDoc.h \ +${name}/pdf2swf/xpdf/Page.cc \ +${name}/pdf2swf/xpdf/Page.h \ +${name}/pdf2swf/xpdf/Params.cc \ +${name}/pdf2swf/xpdf/Params.h \ +${name}/pdf2swf/xpdf/Parser.cc \ +${name}/pdf2swf/xpdf/Parser.h \ +${name}/pdf2swf/xpdf/StdFontInfo.h \ +${name}/pdf2swf/xpdf/Stream-CCITT.h \ +${name}/pdf2swf/xpdf/Stream.cc \ +${name}/pdf2swf/xpdf/Stream.h \ +${name}/pdf2swf/xpdf/XRef.cc \ +${name}/pdf2swf/xpdf/XRef.h \ +${name}/pdf2swf/xpdf/config.h \ +${name}/pdf2swf/xpdf/gfile.cc \ +${name}/pdf2swf/xpdf/gfile.h \ +${name}/pdf2swf/xpdf/gmem.c \ +${name}/pdf2swf/xpdf/gmem.h \ +${name}/pdf2swf/xpdf/gtypes.h \ +${name}/pdf2swf/xpdf/Makefile.am \ +${name}/pdf2swf/xpdf/Makefile.in \ +${name}/pdf2swf/pdf2swf.1 \ +${name}/pdf2swf/swfoutput.cc \ +${name}/configure.in \ +${name}/install-sh \ +${name}/mkinstalldirs \ +${name}/missing \ +${name}/configure \ +${name}/aclocal.m4 \ +${name}/config.h.in \ +${name}/stamp-h.in \ +${name}/Makefile.am \ +${name}/Makefile.in \ +${name}/INSTALL \ +${name}/COPYING \ +${name}/NEWS \ +${name}/README \ +${name}/AUTHORS \ +${name}/ChangeLog \ +${name}/release.in \ +${name}/TODO +gzip ${name}.tar +rm -f ${name} diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 00000000..6b50cee5 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,13 @@ +## Process this file with automake to produce Makefile.in +bin_PROGRAMS = swfcombine swfstrings swfdump +swfdump_SOURCES = swfdump.c +swfcombine_SOURCES = bitio.c bitio.h reloc.c reloc.h combine.c combine.h flash.c flash.h swfcombine.c types.h +swfstrings_SOURCES = swfstrings.c +swfdump_LINK = $(CCLD) ../lib/rfxswf.o -o $@ +swfcombine_LINK = $(CCLD) ../lib/log.o -o $@ +swfstrings_LINK = $(CCLD) ../lib/log.o ../lib/rfxswf.o -o $@ +##LIBS = +##swfcombine_LIBS = +##swfstrings_LIBS = -ljpeg +man_MANS = swfcombine.1 swfstrings.1 swfdump.1 + diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 00000000..d87977be --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,383 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 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. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +AWK = @AWK@ +CC = @CC@ +CPP = @CPP@ +CXX = @CXX@ +EXEEXT = @EXEEXT@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +LN_S = @LN_S@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ + +bin_PROGRAMS = swfcombine swfstrings swfdump +swfdump_SOURCES = swfdump.c +swfcombine_SOURCES = bitio.c bitio.h reloc.c reloc.h combine.c combine.h flash.c flash.h swfcombine.c types.h +swfstrings_SOURCES = swfstrings.c +swfdump_LINK = $(CCLD) ../lib/rfxswf.o -o $@ +swfcombine_LINK = $(CCLD) ../lib/log.o -o $@ +swfstrings_LINK = $(CCLD) ../lib/log.o ../lib/rfxswf.o -o $@ +man_MANS = swfcombine.1 swfstrings.1 swfdump.1 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +bin_PROGRAMS = swfcombine$(EXEEXT) swfstrings$(EXEEXT) swfdump$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I.. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +swfcombine_OBJECTS = bitio.o reloc.o combine.o flash.o swfcombine.o +swfcombine_LDADD = $(LDADD) +swfcombine_DEPENDENCIES = +swfcombine_LDFLAGS = +swfstrings_OBJECTS = swfstrings.o +swfstrings_LDADD = $(LDADD) +swfstrings_DEPENDENCIES = +swfstrings_LDFLAGS = +swfdump_OBJECTS = swfdump.o +swfdump_LDADD = $(LDADD) +swfdump_DEPENDENCIES = +swfdump_LDFLAGS = +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +man1dir = $(mandir)/man1 +MANS = $(man_MANS) + +NROFF = nroff +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +DEP_FILES = .deps/bitio.P .deps/combine.P .deps/flash.P .deps/reloc.P \ +.deps/swfcombine.P .deps/swfdump.P .deps/swfstrings.P +SOURCES = $(swfcombine_SOURCES) $(swfstrings_SOURCES) $(swfdump_SOURCES) +OBJECTS = $(swfcombine_OBJECTS) $(swfstrings_OBJECTS) $(swfdump_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ + $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + done + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +swfcombine$(EXEEXT): $(swfcombine_OBJECTS) $(swfcombine_DEPENDENCIES) + @rm -f swfcombine$(EXEEXT) + $(swfcombine_LINK) $(swfcombine_LDFLAGS) $(swfcombine_OBJECTS) $(swfcombine_LDADD) $(LIBS) + +swfstrings$(EXEEXT): $(swfstrings_OBJECTS) $(swfstrings_DEPENDENCIES) + @rm -f swfstrings$(EXEEXT) + $(swfstrings_LINK) $(swfstrings_LDFLAGS) $(swfstrings_OBJECTS) $(swfstrings_LDADD) $(LIBS) + +swfdump$(EXEEXT): $(swfdump_OBJECTS) $(swfdump_DEPENDENCIES) + @rm -f swfdump$(EXEEXT) + $(swfdump_LINK) $(swfdump_LDFLAGS) $(swfdump_OBJECTS) $(swfdump_LDADD) $(LIBS) + +install-man1: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done + +uninstall-man1: + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +install-man: $(MANS) + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-man1 +uninstall-man: + @$(NORMAL_UNINSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = src + +distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/Makefile + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + +DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) + +-include $(DEP_FILES) + +mostlyclean-depend: + +clean-depend: + +distclean-depend: + -rm -rf .deps + +maintainer-clean-depend: + +%.o: %.c + @echo '$(COMPILE) -c $<'; \ + $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.c + @echo '$(LTCOMPILE) -c $<'; \ + $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: install-binPROGRAMS +install-exec: install-exec-am + +install-data-am: install-man +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-binPROGRAMS uninstall-man +uninstall: uninstall-am +all-am: Makefile $(PROGRAMS) $(MANS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/man1 + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ + mostlyclean-tags mostlyclean-depend mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-binPROGRAMS clean-compile clean-tags clean-depend \ + clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ + distclean-depend distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-binPROGRAMS \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-depend maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ +maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile install-man1 uninstall-man1 install-man \ +uninstall-man tags mostlyclean-tags distclean-tags clean-tags \ +maintainer-clean-tags distdir mostlyclean-depend distclean-depend \ +clean-depend maintainer-clean-depend info-am info dvi-am dvi check \ +check-am installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# 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/src/args.h b/src/args.h new file mode 100644 index 00000000..a5699df4 --- /dev/null +++ b/src/args.h @@ -0,0 +1,63 @@ +/* args.h + Routines to simplify argument handling + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __args_h__ +#define __args_h__ + +extern int args_callback_option(char*,char*); +extern int args_callback_longoption(char*,char*); +extern int args_callback_command(char*,char*); +extern void args_callback_usage(char*name); + +int argn; +char**argv; + +void processargs(int argn2,char**argv2) +{ + int t; + if(argn2==1) + { + args_callback_usage(argv2[0]); + exit(1); + } + for(t=1;t + + This file is distributed under the GPL, see file COPYING for details */ + +#include "bitio.h" + +static uchar*data; +static int datalength; +static int datapos; + +void resetbits(); + +void reader_init(uchar*newdata, int newlength) +{ + data = newdata; + datalength = newlength; + datapos = 0; + resetbits(); +} +void skip(int length) +{ + datapos += length; +} +static u8 bitpos=8,mybyte; +static u8 bitmem=0; +void resetbits() +{ + bitpos=8; +} + +void input1(void*target) +{ + *(uchar*)target = *(uchar*)&data[datapos]; + datapos ++; +} +void input2(void*target) +{ + *(unsigned short int*)target = *(unsigned short int*)&data[datapos]; + datapos += 2; +} +void input4(void*target) +{ + *(unsigned int*)target = *(unsigned int*)&data[datapos]; + datapos += 4; +} +uchar*getinputpos() +{ + return &data[datapos]; +} +int getinputlength() +{ + return datalength; +} +void setinputpos(uchar*pos) +{ + datapos = pos-data; +} + +u32 readbit() +{ + if(bitpos==8) + { + bitpos=0; + input1(&mybyte); + } + return (mybyte>>(7-bitpos++))&1; +} +void readbits(u32*val,int num) +{ + int t; + *val=0; + for(t=0;t>(num-1))&1) + { + x|=(0xffffffff<data = data; + w->maxlength = maxlength; + w->pos = 0; + w->bitpos = 0; + w->mybyte = 0; +} + +void writer_write(struct writer_t*w, void*data, int length) +{ + memcpy(&w->data[w->pos], data, length); + w->pos += length; +} + +void writer_writeu8(struct writer_t*w, u8 value) +{ + writer_resetbits(w); + writer_write(w, &value, 1); +} + +void writer_writeu16(struct writer_t*w, u16 value) +{ + writer_resetbits(w); + writer_write(w, &value, 2); +} + +void* writer_getpos(struct writer_t*w) +{ + return &w->data[w->pos]; +} + +void writer_resetbits(struct writer_t*w) +{ + if(w->bitpos) + writer_write(w, &w->mybyte, 1); + w->bitpos = 0; + w->mybyte = 0; +} + +void writer_writebit(struct writer_t*w, int bit) +{ + if(w->bitpos==8) + { + writer_write(w, &w->mybyte, 1); + w->bitpos = 0; + w->mybyte = 0; + } + if(bit&1) + w->mybyte |= 1 << (7 - w->bitpos); + w->bitpos ++; +} + +void writer_writebits(struct writer_t*w, u32 data, int bits) +{ + int t; + for(t=0;t> (bits-t-1))&1); + } +} + diff --git a/src/bitio.h b/src/bitio.h new file mode 100644 index 00000000..c9ec2383 --- /dev/null +++ b/src/bitio.h @@ -0,0 +1,51 @@ +/* bitio.h + Header file for bitio.c. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __bitio_h__ +#define __bitio_h__ + +#include "types.h" + +void resetbits(); +void reader_init(uchar*newdata, int newlength); +void skip(int length); +void input1(void*target); +void input2(void*target); +void input4(void*target); + +uchar*getinputpos(); +int getinputlength(); +void setinputpos(uchar*pos); + +u32 readbit(); +void readbits(u32*val,int num); +void readsbits(s32*val,int num); +u32 getbits(int num); +s32 getsbits(int num); +u16 readu8(); +u16 readu16(); + +struct writer_t { + u8* data; + int maxlength; + int pos; + int bitpos; + u8 mybyte; +}; + +void writer_init(struct writer_t*w, u8*data, int maxlength); +void writer_write(struct writer_t*w, void*data, int length); +void* writer_getpos(struct writer_t*w); +void writer_writebit(struct writer_t*w, int bit); +void writer_writebits(struct writer_t*w, u32 data, int bits); +void writer_writeu8(struct writer_t*w, u8 value); +void writer_writeu16(struct writer_t*w, u16 value); +void writer_resetbits(struct writer_t*w); + +#endif //__bitio_h__ diff --git a/src/combine.c b/src/combine.c new file mode 100644 index 00000000..a6120066 --- /dev/null +++ b/src/combine.c @@ -0,0 +1,398 @@ +/* combine.c + Implements combine(), which merges two swfs in memory. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#include +#include +#include +#include +#include "../lib/log.h" +#include "./flash.h" +#include "./reloc.h" +#include "./settings.h" + +// TODO: +// * readers should be object-oriented + +static char* tag_placeobject2_name (struct swf_tag* tag) +{ + struct PlaceObject2 plo2; + placeobject2_init (&plo2, tag); + return plo2.name; +} + +static u16 tag_placeobject2_character (struct swf_tag* tag) +{ + struct PlaceObject2 plo2; + placeobject2_init (&plo2, tag); + return plo2.id; +} + +static struct swffile master; +static struct swffile slave; + +static int masterids[65536]; + +static int get_free_id() +{ + int t; + for (t=1;t<65536;t++) + { + if(masterids[t] == -1) + { + masterids[t] = 1; + return t; + } + } + return -1; +} + +void changedepth(struct swf_tag*tag, int add) +{ + if(tag->id == TAGID_PLACEOBJECT) + (*(u16*)&tag->data[2]) += add; + if(tag->id == TAGID_PLACEOBJECT2) + (*(u16*)&tag->data[1]) += add; + if(tag->id == TAGID_REMOVEOBJECT) + (*(u16*)&tag->data[2]) += add; + if(tag->id == TAGID_REMOVEOBJECT2) + (*(u16*)&tag->data[0]) += add; +} + +/* applies the config move and scale parameters to + * a matrix. (If settings would provide a rotation, + * this would be a matrix concatenation/multiplication + * routine. In this case, it's just element-wise multiplication. + */ +void matrix_adjust(struct MATRIX*m) +{ + if(config.scalex != 1 || config.scaley != 1) + { + if(!m->hasscale) { + m->hasscale = 1; + m->a[0][0] = config.scalex; + m->a[1][1] = config.scaley; + } else { + m->a[0][0] *= config.scalex; + m->a[1][1] *= config.scaley; + } + if(m->hasrotate) { + m->a[0][1] *= config.scalex; + m->a[1][0] *= config.scaley; + } + m->b[0] *= config.scalex; + m->b[1] *= config.scaley; + } +/* printf("hasscale: %d\n",m->hasscale); + printf("hasrotate: %d\n", m->hasrotate); + printf("move: %d %d\n", m->b[0],m->b[1]); + printf("rot: %f %f\n",m->a[0][0],m->a[0][1]); + printf(" %f %f\n",m->a[1][0],m->a[1][1]);*/ + m->b[0] += config.movex; + m->b[1] += config.movey; +} + +void write_changepos(struct swf_tag*tag, struct writer_t*w) +{ + if(config.movex || config.movey || config.scalex != 1 || config.scaley != 1) + { + switch(tag->id) + { + case TAGID_PLACEOBJECT: { + struct PlaceObject p; + placeobject_init(&p, tag); + matrix_adjust(&p.matrix); + placeobject_write(&p, w); + break; + } + case TAGID_PLACEOBJECT2: { + struct PlaceObject2 p; + placeobject2_init(&p, tag); + if(!p.hasmatrix) { + p.hasmatrix = 1; + MATRIX_init(&p.matrix); + } + matrix_adjust(&p.matrix); + placeobject2_write(&p, w); + break; + } + default: + writer_write(w, tag->fulldata, tag->fulllength); + } + } + else + { + writer_write(w, tag->fulldata, tag->fulllength); + } +} + +uchar * combine(uchar*masterdata, int masterlength, char*slavename, uchar*slavedata, int slavelength, int*newlength) +{ + char master_flash = 0; + char slave_flash = 0; + + logf(" move x (%d)", config.movex); + logf(" move y (%d)", config.movey); + logf(" scale x (%d)", config.scalex); + logf(" scale y (%d)", config.scaley); + + memset(masterids, -1, sizeof(masterids)); + + if(masterlength < 3) + { + logf(" the master file is too small (%d bytes)", masterlength); + return 0; + } + if(slavelength < 3) + { + logf(" the slave file is too small (%d bytes)", slavelength); + return 0; + } + if(masterdata[2] == 'S' && + masterdata[1] == 'W' && + masterdata[0] == 'F') + { + logf(" the master file is flash (swf) format\n"); + master_flash = 1; + } + if(slavedata[2] == 'S' && + slavedata[1] == 'W' && + slavedata[0] == 'F') + { + logf(" the slave file is flash (swf) format\n"); + slave_flash = 1; + } + + if(master_flash && slave_flash) + { + int length; + int pos=0; + u16 tmp; + u32 tmp32; + u32*tagidpos; + u8*startpos; + u32*headlength; + uchar*newdata; + int spriteid = -1; + int replaceddefine = -1; + struct writer_t w; + + read_swf(&master, masterdata, masterlength); + + length = masterlength + slavelength*2 + 128; // this is a guess, but a good guess. + newdata = malloc(length); + writer_init(&w, newdata, length); + + if(!newdata) { + logf(" Couldn't allocate %d bytes of memory", length); + return 0; + } + + // set the idtab + pos = 0; + do { + int tag = master.tags[pos].id; + if(is_defining_tag(tag)) { + int defineid = getidfromtag(&master.tags[pos]); + logf(" tagid %02x defines object %d", tag, defineid); + masterids[defineid] = 1; + } else if(tag == TAGID_PLACEOBJECT2) { + char * name = tag_placeobject2_name(&master.tags[pos]); + int id = tag_placeobject2_character(&master.tags[pos]); + + if(name) + logf(" tagid %02x places object %d named \"%s\"", tag, id, name); + else + logf(" tagid %02x places object %d (no name)", tag, id); + + if (name && !strcmp(name,slavename)) { + if(id>=0) { + spriteid = id; + logf(" Slave file attached to object %d.", id); + } + } + } + } + while(master.tags[pos++].id != 0); + + swf_relocate (slavedata, slavelength, masterids); + + read_swf(&slave, slavedata, slavelength); + + // write header + + writer_write(&w, "FWS",3); + headlength = (u32*)(writer_getpos(&w) + 1); + writer_write(&w, master.header.headerdata, master.header.headerlength); + + // write sprite(1) + + pos = 0; + while(slave.tags[pos].id != 0) { + struct swf_tag * tag = &slave.tags[pos]; + if(!is_sprite_tag(tag->id)) { + logf(" processing sprite tag %02x", slave.tags[pos].id); + if(is_defining_tag(tag->id)) + { + logf(" [sprite defs] write tag %02x (%d bytes in body)", + tag->id, tag->length); + writer_write(&w, tag->fulldata, tag->fulllength); + } + else + { + switch(tag->id) + {case TAGID_DEFINEFONTINFO: + { + /* define font info is not a defining tag, in that + * it doesn't define a new id, but rather extends + * an existing one. It also isn't a sprite tag. + * Anyway we can't throw it out, so we just pass it + * through. + */ + break; + } + case TAGID_EXPORTASSETS: + logf(" deliberately ignoring EXPORTASSETS tag"); + break; + case TAGID_ENABLEDEBUGGER: + logf(" deliberately ignoring ENABLEDEBUGGER tag"); + break; + case TAGID_BACKGROUNDCOLOR: + logf(" deliberately ignoring BACKGROUNDCOLOR tag"); + break; + case 40: + case 49: + case 51: + logf(" found tag %d. This is a Generator template, isn't it?", slave.tags[pos].id); + break; + default: + logf(" funny tag: %d is neither defining nor sprite", slave.tags[pos].id); + } + } + } + pos++; + } + + // write master (1) + pos = 0; + do { + if(is_defining_tag(master.tags[pos].id)) + { + logf(" [master] write tag %02x (%d bytes in body)", + master.tags[pos].id, master.tags[pos].length); + if( getidfromtag(&master.tags[pos]) == spriteid) + { + if(config.overlay) + { + *(u16*)master.tags[pos].data = replaceddefine = get_free_id(); + writer_write(&w, master.tags[pos].fulldata, master.tags[pos].fulllength); + } else { + /* don't write this tag */ + logf(" replacing tag %d id %d with sprite", master.tags[pos].id + ,spriteid); + } + } else { + writer_write(&w, master.tags[pos].fulldata, master.tags[pos].fulllength); + } + } + } + while(master.tags[pos++].id != 0); + + // write slave(2) (header) + tmp = 0x3f + (TAGID_DEFINESPRITE << 6); + writer_write(&w, &tmp, 2); + tagidpos = (u32*)writer_getpos(&w); + writer_write(&w, &tmp32, 4); + + startpos = (u8*)writer_getpos(&w); + + if (spriteid<0) + { + logf(" Didn't find anything named %s in file. No substitutions will occur.", slavename); + spriteid = get_free_id(); + } + + logf (" sprite id is %d", spriteid); + tmp = spriteid; + writer_write(&w, &tmp, 2); + tmp = slave.header.count; + writer_write(&w, &tmp, 2); + + + // write slave(2) (body) + pos = 0; + tmp = slave.header.count; + logf(" %d frames to go",tmp); + + if(config.clip) { + tmp = 7 + (TAGID_PLACEOBJECT2 << 6); + writer_write(&w, &tmp, 2); + tmp = 2+64; //flags: character + clipaction + writer_write(&w, &tmp, 1); + tmp = 0; //depth + writer_write(&w, &tmp,2); + tmp = replaceddefine; //id + writer_write(&w, &tmp,2); + tmp = 65535; //clipdepth + writer_write(&w, &tmp,2); + } + + if(config.overlay) { + tmp = 5 + (TAGID_PLACEOBJECT2 << 6); + writer_write(&w, &tmp, 2); + tmp = 2; //flags: character + writer_write(&w, &tmp, 1); + tmp = 0; //depth + writer_write(&w, &tmp,2); + tmp = replaceddefine; //id + writer_write(&w, &tmp,2); + } + + do { + struct swf_tag * tag = &slave.tags[pos]; + if (is_sprite_tag(tag->id)) { + + changedepth(tag, +1); + logf(" [sprite main] write tag %02x (%d bytes in body)", + slave.tags[pos].id, slave.tags[pos].length); + write_changepos(tag, &w); + + if(tag->id == TAGID_SHOWFRAME) + { + tmp--; + logf(" %d frames to go",tmp); + } + } + } + while(slave.tags[pos++].id != TAGID_END); + + *tagidpos = (u8*)writer_getpos(&w) - startpos; // set length of sprite (in header) + logf(" sprite length is %d",*tagidpos); + + // write master (2) + pos = 0; + do { + if(!is_defining_tag(master.tags[pos].id)) + { + logf(" [master] write tag %02x (%d bytes in body)", + master.tags[pos].id, master.tags[pos].length); + writer_write(&w, master.tags[pos].fulldata, master.tags[pos].fulllength); + } + } + while(master.tags[pos++].id != 0); + + tmp32 = (u8*)writer_getpos(&w) - (u8*)newdata; //length + *newlength = tmp32; + *headlength = tmp32; // set the header to the correct length + + return newdata; //length + } + + *newlength = 0; + return 0; +} diff --git a/src/combine.h b/src/combine.h new file mode 100644 index 00000000..d522771d --- /dev/null +++ b/src/combine.h @@ -0,0 +1,14 @@ +/* combine.h + Header file for combine.c + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __combine_h__ +#define __combine_h__ +unsigned char * combine(unsigned char*masterdata, int masterlength, + char*slavename, unsigned char*slavedata, int slavelength, int*newlength); +#endif //__combine_h__ diff --git a/src/flash.c b/src/flash.c new file mode 100644 index 00000000..fff82843 --- /dev/null +++ b/src/flash.c @@ -0,0 +1,528 @@ +/* flash.c + Various routines for reading and writing swf files and tags. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#include "flash.h" +#include "bitio.h" + +void swf_init(uchar*newdata, int newlength) +{ + reader_init (&newdata[3], newlength - 3); +} + +struct flash_header swf_read_header() +{ + struct flash_header head; + u16 rate; + u16 count; + char version; + int length; + u8* oldpos = getinputpos(); + + input1(&version); + head.version = version; + input4(&length); + head.length = length; + + resetbits(); + head.boundingBox = readRECT(); + input2(&rate); + head.rate = rate; + input2(&count); + head.count = count; + + head.headerlength = getinputpos() - oldpos; + head.headerdata = oldpos; + + return head; +} + +struct RGB readRGB() +{ + struct RGB rgb; + input1(&rgb.r); + input1(&rgb.g); + input1(&rgb.b); + return rgb; +} + +struct RGBA readRGBA() +{ + struct RGBA rgba; + input1(&rgba.r); + input1(&rgba.g); + input1(&rgba.b); + input1(&rgba.a); + return rgba; +} + +struct GRADIENT readGRADIENT(int shape) +{ + struct GRADIENT gradient; + int t; + gradient.num = readu8(); + for(t=0;t=3) + gradient.rgb[t] = readRGB(); + else + gradient.rgba[t] = readRGBA(); + } +} + +struct RECT readRECT() +{ + u32 a; + struct RECT r; + s32 b; + readbits(&a,5); + readsbits(&b,a); + r.x1=b; + readsbits(&b,a); + r.x2=b; + readsbits(&b,a); + r.y1=b; + readsbits(&b,a); + r.y2=b; + return r; +} + + +void writeRECT(u8**pos, struct RECT*r) +{ + struct writer_t w; + int t=0; + writer_init(&w, *pos, 256); + writer_writebits(&w, 31, 5); //FIXME:count + writer_writebits(&w, r->x1, 31); + writer_writebits(&w, r->x2, 31); + writer_writebits(&w, r->y1, 31); + writer_writebits(&w, r->y2, 31); + writer_resetbits(&w); + *pos = writer_getpos(&w); +} + +struct CXFORM readCXFORM() +{ + struct CXFORM c; + int bits; + c.hasadd=readbit(); + c.hasmult=readbit(); + bits=getbits(4); + c.alpha = 0; + + if (c.hasmult) + { + c.rmult=getsbits(bits)/65536.0; + c.gmult=getsbits(bits)/65536.0; + c.bmult=getsbits(bits)/65536.0; + if(c.alpha) + c.amult=getsbits(bits)/65536.0; + } + if (c.hasadd) + { + c.radd=getsbits(bits)/65536.0; + c.gadd=getsbits(bits)/65536.0; + c.badd=getsbits(bits)/65536.0; + if(c.alpha) + c.aadd=getsbits(bits)/65536.0; + } + return c; +} + +void CXFORM_write(struct CXFORM *obj, struct writer_t*w) +{ + int bits = 15; + writer_writebit(w,obj->hasadd); + writer_writebit(w,obj->hasmult); + writer_writebits(w, bits, 4); + if (obj->hasmult) + { + writer_writebits(w, obj->rmult, bits); + writer_writebits(w, obj->gmult, bits); + writer_writebits(w, obj->bmult, bits); + if(obj->alpha) + writer_writebits(w, obj->amult, 4); + } + if (obj->hasadd) + { + writer_writebits(w, obj->radd, bits); + writer_writebits(w, obj->gadd, bits); + writer_writebits(w, obj->badd, bits); + if(obj->alpha) + writer_writebits(w, obj->aadd, 4); + } +} + +unsigned char* readSTRING() +{ + unsigned char*now = getinputpos(); + char a; + do + { + input1(&a); + } + while(a); + return now; +} +void MATRIX_init(struct MATRIX*m) +{ + m->hasrotate = 0; + m->hasscale = 0; + m->b[0] = 0; + m->b[1] = 0; + m->a[0][0] = 1; + m->a[1][1] = 1; + m->a[1][0] = 0; + m->a[0][1] = 0; +} +struct MATRIX readMATRIX() +{ + struct MATRIX m; + u8 hasrotate; + u8 translatebits; + u32 translatex; + u32 translatey; + + m.a[0][0] = m.a[1][1] = 1; + m.a[0][1] = m.a[1][0] = 0; + m.hasscale=readbit(); + if(m.hasscale) + { + u8 scalebits=getbits(5); + s32 scalex=getsbits(scalebits); + s32 scaley=getsbits(scalebits); + m.a[0][0]=scalex/65536.0; + m.a[1][1]=scaley/65536.0; + } + m.hasrotate=readbit(); + if(m.hasrotate) + { + u8 rotbits=getbits(5); + s32 rotateskew0=getsbits(rotbits); + s32 rotateskew1=getsbits(rotbits); + m.a[0][1]=rotateskew0/65536.0; + m.a[1][0]=rotateskew1/65536.0; + } + + translatebits=getbits(5); + translatex=getsbits(translatebits); + translatey=getsbits(translatebits); + m.b[0]=translatex; + m.b[1]=translatey; + + return m; +} + +void MATRIX_write(struct MATRIX * m , struct writer_t*w) +{ + writer_writebit (w, m->hasscale); + if(m->hasscale) + { + int bits = 31; + writer_writebits(w, bits, 5); + writer_writebits(w, (u32)(m->a[0][0]*65536.0), bits); + writer_writebits(w, (u32)(m->a[1][1]*65536.0), bits); + } + writer_writebit (w, m->hasrotate); + if(m->hasrotate) + { + int bits = 31; + writer_writebits(w, bits, 5); + writer_writebits(w, (u32)(m->a[0][1]*65536.0), bits); + writer_writebits(w, (u32)(m->a[1][0]*65536.0), bits); + } + + //translate + { + int bits = 31; + writer_writebits(w, bits, 5); + writer_writebits(w, (u32)(m->b[0]), bits); + writer_writebits(w, (u32)(m->b[1]), bits); + } +} + + +int swf_read_tag(struct swf_tag* swftag) +{ + u8*pos2,*pos = getinputpos(); + u16 tag; + u32 taglength; + u32 tagid; + int t; + + input2(&tag); + + taglength = tag & 0x3f; + if (taglength == 0x3f) + { + input4(&taglength); + } + + swftag->id=tag>>6; + swftag->length = taglength; + swftag->data = getinputpos(); + skip(taglength); + pos2 = getinputpos(); + swftag->fulllength = pos2 - pos; + swftag->fulldata = pos; + return 1; +} + +int swf_count_tags() +{ + u8*pos = getinputpos(); + int t=0; + struct swf_tag tag; + + while(1) + { + swf_read_tag(&tag); + t++; + if (tag.id == 0) + break; + } + + setinputpos(pos); + return t; +} + +void placeobject_init (struct PlaceObject*obj, struct swf_tag*tag) +{ + reader_init (tag->data, tag->length); + obj -> id = readu16(); + obj -> depth = readu16(); + obj -> matrix = readMATRIX(); + obj -> hascxform = (getinputpos() < &tag->data[tag->length]); + if(obj -> hascxform) + obj -> cxform = readCXFORM(); +} + +void placeobject_write (struct PlaceObject*obj, struct writer_t*w) +{ + u16 taghead = 0x3f | TAGID_PLACEOBJECT<<6; + u8*pos; + u8*lenpos; + writer_resetbits(w); + writer_write(w, &taghead, 2); + lenpos = writer_getpos(w); + + writer_write(w, &taghead, 2); + writer_write(w, &taghead, 2); + + pos = writer_getpos(w); + + writer_write(w, &obj->id, 2); + writer_write(w, &obj->depth, 2); + MATRIX_write(&obj->matrix, w); + + if(obj->hascxform) + { + CXFORM_write(&obj->cxform, w); + } + writer_resetbits(w); + + *(u32*)lenpos = (u8*)writer_getpos(w) - pos; +} + +void placeobject2_init (struct PlaceObject2*obj,struct swf_tag*tag) +{ + u8 b; + reader_init (tag->data, tag->length); + b=readu8(); + obj->reserved= (b>>7)&1; + obj->hasclipactions= (b>>6)&1; + obj->hasname= (b>>5)&1; + obj->hasratio= (b>>4)&1; + obj->hascolortransform=(b>>3)&1; + obj->hasmatrix= (b>>2)&1; + obj->hascharacter= (b>>1)&1; + obj->hasmove= (b>>0)&1; + + obj->depth = readu16(); + obj->id = -1; + if(obj->hascharacter) { + obj->id = readu16(); + } + if(obj->hasmatrix) { + obj->matrix = readMATRIX(); + } + if(obj->hascolortransform) { + obj->cxform = readCXFORM(); + } + if(obj->hasratio) { + obj->ratio=readu16(); + } + obj->name = 0; + if(obj->hasname) { + obj->name=readSTRING(); + } + if(obj->hasclipactions) { + obj->clipactions=readu16(); + } +} + +void placeobject2_write (struct PlaceObject2*obj, struct writer_t*w) +{ + u8 flags = obj->reserved<<7 | obj->hasclipactions<<6 | obj->hasname<<5 | obj->hasratio<<4 | + obj->hascolortransform<<3 | obj->hasmatrix<<2 | obj->hascharacter<<1 | obj->hasmove; + u16 taghead = 0x3f | TAGID_PLACEOBJECT2<<6; + u8*pos; + u8*lenpos; + writer_resetbits(w); + writer_write(w, &taghead, 2); + lenpos = writer_getpos(w); + writer_write(w, &taghead, 2); + writer_write(w, &taghead, 2); + + pos = writer_getpos(w); + + writer_writeu8(w, flags); + writer_writeu16(w, obj->depth); + if(obj->hascharacter) + writer_writeu16(w, obj->id); + if(obj->hasmatrix) + MATRIX_write(&obj->matrix, w); + if(obj->hascolortransform) + CXFORM_write(&obj->cxform, w); + if(obj->hasratio) + writer_writeu16(w, obj->ratio); + writer_resetbits(w); + if(obj->hasname) + writer_write(w, obj->name, strlen(obj->name) + 1); + if(obj->hasclipactions) + writer_writeu16(w, obj->clipactions); + writer_resetbits(w); + *(u32*)lenpos = (u8*)writer_getpos(w) - pos; +} + +void read_swf(struct swffile*swf, uchar*data, int length) +{ + int pos; + struct flash_header head; + int tagnum; + swf_init(data, length); + head = swf_read_header(data); + logf(" [HEADER] the version is %d", head.version); + logf(" [HEADER] the length is %d", head.length); + logf(" [HEADER] the boundingBox is %d:%d:%d:%d", + head.boundingBox.x1,head.boundingBox.y1, + head.boundingBox.x2,head.boundingBox.y2); + logf(" [HEADER] the rate (frames/second) is %d", head.rate); + logf(" [HEADER] the count (frame number) is %d", head.count); + + tagnum = swf_count_tags(); + swf->tags = (struct swf_tag*)malloc(sizeof(struct swf_tag)*tagnum); + + logf(" [HEADER] the file consists of %d tags", tagnum); + + pos = 0; + while(1) + { + struct swf_tag tag; + swf_read_tag(&tag); + logf(" read tag %02x (%d bytes)", tag.id, tag.length); + swf->tags[pos] = tag; + pos++; + if(tag.id == TAGID_END) + break; + } + swf->tagnum = tagnum; + swf->header = head; +} + +int definingtagids[] = +{TAGID_DEFINESHAPE, + TAGID_DEFINESHAPE2, + TAGID_DEFINESHAPE3, + TAGID_DEFINEMORPHSHAPE, + TAGID_DEFINEFONT, + TAGID_DEFINEFONT2, + TAGID_DEFINETEXT, + TAGID_DEFINETEXT2, + TAGID_DEFINEEDITTEXT, + TAGID_DEFINEBITS, + TAGID_DEFINEBITSJPEG2, + TAGID_DEFINEBITSJPEG3, + TAGID_DEFINEBITSLOSSLESS, + TAGID_DEFINEBITSLOSSLESS2, + TAGID_DEFINEMOVIE, + TAGID_DEFINESPRITE, + TAGID_DEFINEBUTTON, + TAGID_DEFINEBUTTON2, + TAGID_DEFINESOUND, + -1 +}; + +// tags which may be used inside a sprite definition +int spritetagids[] = +{TAGID_SHOWFRAME, + TAGID_PLACEOBJECT, + TAGID_PLACEOBJECT2, + TAGID_REMOVEOBJECT, + TAGID_REMOVEOBJECT2, //? + TAGID_DOACTION, + TAGID_STARTSOUND, + TAGID_FRAMELABEL, + TAGID_SOUNDSTREAMHEAD, + TAGID_SOUNDSTREAMHEAD2, + TAGID_SOUNDSTREAMBLOCK, + TAGID_END, + -1 +}; + +int getidfromtag(struct swf_tag* tag) +{ + // todo: check for more than one id + return *(u16*)tag->data; +} + +void setidintag(struct swf_tag* tag, int id) +{ + *(u16*)tag->data = id; +} + +char is_sprite_tag (int id) +{ + + int t=0; + while(spritetagids[t]>=0) + { + if(spritetagids[t] == id) + return 1; + t++; + } + return 0; +} + +char is_defining_tag (int id) +{ + + int t=0; + while(definingtagids[t]>=0) + { + if(definingtagids[t] == id) + return 1; + t++; + } + return 0; +} + +struct swf_tag* duptag(struct swf_tag*tag) +{ + struct swf_tag* newtag = (struct swf_tag*)malloc(sizeof(struct swf_tag)); + newtag->id = tag->id; + newtag->fulldata = (u8*)malloc(tag->fulllength); + newtag->fulllength = tag->fulllength; + newtag->data = newtag->fulldata + (tag->data - tag->fulldata); + newtag->length = tag->length; + memcpy(newtag->fulldata, tag->fulldata, tag->fulllength); + return newtag; +} + diff --git a/src/flash.h b/src/flash.h new file mode 100644 index 00000000..255aeff5 --- /dev/null +++ b/src/flash.h @@ -0,0 +1,196 @@ +/* flash.h + Header file for flash.c + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __flash_h__ +#define __flash_h__ + +#include "types.h" + +#define TAGID_END 0 +#define TAGID_SHOWFRAME 1 +#define TAGID_DEFINESHAPE 2 +#define TAGID_PLACEOBJECT 4 +#define TAGID_REMOVEOBJECT 5 +#define TAGID_DEFINEBITS 6 +#define TAGID_DEFINEBUTTON 7 +#define TAGID_JPEGTABLES 8 +#define TAGID_BACKGROUNDCOLOR 9 +#define TAGID_DEFINEFONT 10 +#define TAGID_DEFINETEXT 11 +#define TAGID_DOACTION 12 +#define TAGID_DEFINEFONTINFO 13 +#define TAGID_DEFINESOUND 14 +#define TAGID_STARTSOUND 15 +#define TAGID_SOUNDSTREAMHEAD 18 +#define TAGID_SOUNDSTREAMHEAD2 18 +#define TAGID_SOUNDSTREAMBLOCK 19 +#define TAGID_DEFINEBITSLOSSLESS 20 +#define TAGID_DEFINEBITSJPEG2 21 +#define TAGID_DEFINESHAPE2 22 +#define TAGID_PROTECT 24 +#define TAGID_PLACEOBJECT2 26 +#define TAGID_REMOVEOBJECT2 28 +#define TAGID_DEFINESHAPE3 32 +#define TAGID_DEFINETEXT2 33 +#define TAGID_DEFINEBUTTON2 34 +#define TAGID_DEFINEBITSJPEG3 35 +#define TAGID_DEFINEBITSLOSSLESS2 36 +#define TAGID_DEFINEEDITTEXT 37 +#define TAGID_DEFINEMOVIE 38 +#define TAGID_DEFINESPRITE 39 +#define TAGID_FRAMELABEL 43 +#define TAGID_DEFINEMORPHSHAPE 46 +#define TAGID_DEFINEFONT2 48 +#define TAGID_EXPORTASSETS 56 +#define TAGID_IMPORTASSETS 57 +#define TAGID_ENABLEDEBUGGER 58 + +#include "bitio.h" + +struct swf_tag; +struct RECT; +struct RGB; +struct MATRIX; +struct CXFORM; +struct CLIPACTIONS; + +struct swf_tag +{ + u8 id; + u32 length; + u8*data; + u32 fulllength; // includes id + u8*fulldata; // likewise +}; + +struct RGB +{ + byte r,g,b; +}; + +struct RGBA +{ + byte r,g,b,a; +}; + +struct RECT +{ + int x1, y1, x2, y2; +}; + +struct MATRIX +{ + u8 hasscale; + u8 hasrotate; + float a[2][2]; + int b[2]; +}; + +struct CXFORM +{ + u8 hasadd; + u8 hasmult; + float rmult, gmult, bmult, amult; + float radd, gadd, badd, aadd; + u8 alpha; +}; + +struct GRADIENT +{ + int num; + u8 ratios[8]; + struct RGB rgb[8]; + struct RGBA rgba[8]; +}; + +struct RECT readRECT(); +struct RGB readRGB(); +struct MATRIX readMATRIX(); +unsigned char* readSTRING(); +struct CXFORM readCXFORM(); +struct CLIPACTIONS readCLIPACTIONS(); + +void writeRECT(u8**pos, struct RECT*r); + +void swf_init(uchar*newdata, int newlength); +struct flash_header +{ + int version; + u32 length; + struct RECT boundingBox; + u16 rate; + u16 count; + + u8*headerdata; + int headerlength; +}; + +struct swffile +{ + struct flash_header header; + int tagnum; + struct swf_tag* tags; +}; + +struct flash_header swf_read_header(); +struct RGB readRGB(); +struct RGBA readRGBA(); +struct GRADIENT readGRADIENT(int shape); +struct RECT readRECT(); +struct CXFORM readCXFORM(); +struct MATRIX readMATRIX(); +unsigned char* readSTRING(); +int swf_read_tag(struct swf_tag* swftag); +int swf_count_tags(); + + +struct PlaceObject +{ + u16 id; + u16 depth; + struct MATRIX matrix; + struct CXFORM cxform; + u8 hascxform; +}; + +struct PlaceObject2 +{ + u8 reserved; + u8 hasclipactions; + u8 hasname; + u8 hasratio; + u8 hascolortransform; + u8 hasmatrix; + u8 hascharacter; + u8 hasmove; + + u16 depth; + int id; + struct MATRIX matrix; + struct CXFORM cxform; + u16 ratio; + char * name; + u16 clipactions; +}; + + +void placeobject_init (struct PlaceObject*obj, struct swf_tag*tag); +void placeobject_write (struct PlaceObject*obj, struct writer_t*w); + +void placeobject2_init (struct PlaceObject2*obj, struct swf_tag*tag); + +void read_swf(struct swffile*swf, uchar*data, int length); + +int getidfromtag(struct swf_tag* tag); +void setidintag(struct swf_tag* tag, int id); +char is_sprite_tag (int id); +char is_defining_tag (int id); +struct swf_tag* duptag(struct swf_tag*tag); + +#endif //__flash_h__ diff --git a/src/reloc.c b/src/reloc.c new file mode 100644 index 00000000..2f82afa5 --- /dev/null +++ b/src/reloc.c @@ -0,0 +1,285 @@ +/* reloc.h + Implements swf_relocate(), which changes the id range of a swf file in + memory. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#include "flash.h" + +static struct swffile file; + +int slaveids[65536]; + + +void map_ids_mem(u8*mem, int length); +static struct swf_tag* map_ids(struct swf_tag*tag) +{ + map_ids_mem(tag->fulldata, tag->fulllength); + return tag; +} + +void maponeid(void*idpos) +{ + u16*idptr = (u16*)idpos; + if(slaveids[*idptr]<0) { + logf(" Trying to map id never encountered before: id=%d", *idptr); + return ; + } + logf(" mapping %d to %d", *idptr, slaveids[*idptr]); + *idptr = slaveids[*idptr]; +} + + +// take a memory region which contains a tag, and +// map the ids inside this tag to new values +void map_ids_mem(u8*mem, int length) +{ + int num=1; + struct swf_tag newtag_instance; + struct swf_tag*newtag = &newtag_instance; + reader_init (mem, length); + swf_read_tag(newtag); + + switch(newtag->id) + { + case TAGID_PLACEOBJECT: + maponeid(&newtag->data[0]); + break; + case TAGID_PLACEOBJECT2: + // only if placeflaghascharacter + if(!(newtag->data[0]&2)) + break; + maponeid(&newtag->data[3]); + break; + case TAGID_REMOVEOBJECT: + maponeid(&newtag->data[0]); + break; + case TAGID_STARTSOUND: + maponeid(&newtag->data[0]); + break; + case TAGID_DEFINESPRITE: { + u8*mem = &newtag->data[4]; + int len = newtag->length-4; + + while(1) { + u8*fmem = mem; + int flen = len; + struct swf_tag sprtag; + + reader_init (mem, len); + swf_read_tag (&sprtag); + + mem = getinputpos(); + len = getinputlength(); + + if(sprtag.id == TAGID_END) + break; + + map_ids_mem (fmem,flen); + } + } + break; + case TAGID_DEFINEBUTTON2: // has some font ids in the button records + num++; + //fallthrough + case TAGID_DEFINEBUTTON: + reader_init (newtag->data, newtag->length); + readu16(); //button id + if(num>1) + { + readu8(); //flag + readu16(); //offset + } + while(1) + { + u16 charid; + if(!readu8()) //flags + break; + charid = *(u16*)getinputpos(); + maponeid(getinputpos()); + readu16(); //char + readu16(); //layer + readMATRIX(); + readCXFORM(); + } + // ... + break; + case TAGID_DEFINEEDITTEXT: { + u8 flags1,flags2; + reader_init (newtag->data, newtag->length); + readu16(); //id + readRECT(); //bounding box + resetbits(); + flags1 = readu8(); + flags2 = readu8(); + if(flags1 & 128) + maponeid(getinputpos()); + } + break; + case TAGID_DEFINETEXT2: + num ++; + case TAGID_DEFINETEXT: { + int glyphbits, advancebits; + reader_init (newtag->data, newtag->length); + readu16(); //id + readRECT(); //bounding box + readMATRIX(); //matrix + resetbits(); + glyphbits = readu8(); //glyphbits + advancebits = readu8(); //advancebits + while(1) { + u16 flags = getbits(8); + printf("define text flags: %02x\n", flags); + if(!flags) break; + if(flags & 128) // text style record + { + if(flags & 8) { // hasfont + maponeid(getinputpos()); + resetbits(); + readu16(); + } + if(flags & 4) { // hascolor + if(num==1) readRGB(); + else readRGBA(); + } + if(flags & 2) { //has x offset + resetbits(); + readu16(); + } + if(flags & 1) { //has y offset + resetbits(); + readu16(); + } + if(flags & 8) { //has height + resetbits(); + readu16(); + } + } else { // glyph record + getbits(glyphbits); + getbits(advancebits); + break; + } + } + break; + } + case TAGID_DEFINEFONTINFO: + maponeid(&newtag->data[0]); + break; + + case TAGID_DEFINESHAPE3: // these thingies might have bitmap ids in their fillstyles + num++; //fallthrough + case TAGID_DEFINESHAPE2: + num++; //fallthrough + case TAGID_DEFINESHAPE: { + u16 count; + int t; + struct RECT r; + reader_init (newtag->data, newtag->length); + readu16(); // id; + r = readRECT(); // bounds +// printf("%d shape bounds: %d %d %d %d\n",newtag->id,r.x1,r.y1,r.x2,r.y2); + resetbits(); + count = readu8(); + if(count == 0xff && num>1) + count = readu16(); +// printf("%d fillstyles\n", count); + for(t=0;tid)) + { + int newid; + int id; + + id = getidfromtag(tag); //own id + + if(bitmap[id] < 0) { //free + newid = id; + } + else { + newid = get_free_id(id); + } + bitmap[newid] = 1; + slaveids[id] = newid; + + logf(" sprite id %d mapped to %d",id, newid); + + setidintag(tag, newid); + + logf(" [sprite defs] write tag %02x (%d bytes in body)", + tag->id, tag->length); + } + pos++; + } +} + diff --git a/src/reloc.h b/src/reloc.h new file mode 100644 index 00000000..8624c440 --- /dev/null +++ b/src/reloc.h @@ -0,0 +1,14 @@ +/* reloc.h + Header file for reloc.c + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __swf_reallocate__ +#define __swf_reallocate__ +void swf_relocate (u8*data, int length, int*bitmap); +#endif // __swf_reallocate__ + diff --git a/src/settings.h b/src/settings.h new file mode 100644 index 00000000..da73a716 --- /dev/null +++ b/src/settings.h @@ -0,0 +1,26 @@ +/* args.h + Settings for swfcombine. This is deliberately not named "config.h" to + avoid conflicts with GNU autoconf. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __config_h__ +#define __config_h__ +struct config_t +{ + char overlay; + char alloctest; + char clip; + char stack; + int loglevel; + int movex; + int movey; + float scalex; + float scaley; +}; +extern struct config_t config; +#endif diff --git a/src/swfcombine.1 b/src/swfcombine.1 new file mode 100644 index 00000000..d1e484e2 --- /dev/null +++ b/src/swfcombine.1 @@ -0,0 +1,83 @@ +.TH swfcombine "1" "October 2001" "swfcombine" "swftools" +.SH NAME +swfcombine - a tool for combining swf (flash) files +.SH Synopsis +.B swfcombine +[\fIoptions\fR] [\fImasterfile.swf\fR] [\fIslavename1=\fR][\fIslavefile1.swf\fR] ... [\fIslavenameN=\fR][\fIslavefileN.swf\fR] +.SH DESCRIPTION +Take two or more SWF files, and combine them into a new SWF. SWFs can either +be stacked (no masterfile is present) or inserted (into the masterfile). +.PP +SWF files are animation files which can be displayed in Web Browsers using +the Flash Plugin. +.LP +For template mechanisms, it's often convenient to separate the processes +of generating small animation fragments, and merging them all into a big +movie. swfcombine can be used to perform the latter. +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +Print short help message and exit +.\".TP +.\" \fB\-\-version\fR +.\" Print version info and exit +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR +Explicitly specify output file. (otherwise, output.swf will be used) +.TP +\fB\-l\fR, \fB\-\-overlay\fR +Don't remove any master objects, only overlay new objects. +.TP +\fB\-c\fR, \fB\-\-clip\fR +Clip the slave objects by the corresponding master objects. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Be verbose. Use more than one -v for greater effect. +.TP +\fB\-t\fR, \fB\-\-stack\fR +Don't assume the first file is a master file. Instead, store each +file in a seperate frame. +.TP +\fB\-x\fR, \fB\-\-xpos\fR \fIxpos\fR +(move x) Adjust position of slave by xpos twips (1/20 pixel). +.TP +\fB\-y\fR, \fB\-\-ypos\fR \fIypos\fR +(move y) Adjust position of slave by ypos twips (1/20 pixel). +.TP +\fB\-s\fR, \fB\-\-scale\fR \fIscale\fR +(scale) Adjust size of slave by scale% +.PP +.SH Combining two or more .swf files using a master file +Of the flash files to be combined, all except one will be packed into a sprite +structure (Movieclip) which will then be inserted into the master .swf file. +This means that, in terms of trees, when combining several flash files, +one will form the root of the tree, while the others will be +appended to the root as a subnode. +The user has to specify which of the files will become the root +of the tree ("master") and which will be the appended nodes ("slaves"). +The slave files must all have a name, which is then used to determine +their exact position inside the master file. +The slave files will then be converted into sprites, inserted into the +master file, and all PlaceObject tags in the master file which match the +name of the slave file will be updated to correctly display the slave sprite. +.SH Combining (stacking) one or more .swf files without a master +The flash files will be inserted in seperate frames. They will still be +packed into Movieclips, therefore the outputfile will have exactly as many +frames as there were inputfiles. Also, the files don't need to have names. +If you want to access the Movieclips, their names are frameXX, where XX is +the decimal number of the file, starting by zero (00). + +.SH EXAMPLES + +Create two flash movies. Insert some rectangle into one of them, and give +it a name. (E.g. "foo") Now call + +swfcombine -o combined.swf master.swf foo:slave.swf + +As a result, the slave movie should be visible inside the master movie +at the position where the rectangle used to be. + +.SH AUTHOR + +Matthias Kramm + diff --git a/src/swfcombine.c b/src/swfcombine.c new file mode 100644 index 00000000..77597b66 --- /dev/null +++ b/src/swfcombine.c @@ -0,0 +1,431 @@ +/* swfcombine.c + main routine for swfcombine(1), which is a tool for merging .swf-files. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#include +#include +#include +#include "args.h" +#include "combine.h" +#include "settings.h" +#include "types.h" +#include "flash.h" + +char * master_filename = 0; +char * master_name = 0; +char * slave_filename[128]; +char * slave_name[128]; +int slave_movex[128]; +int slave_movey[128]; +float slave_scalex[128]; +float slave_scaley[128]; +int numslaves = 0; + +char * outputname = "output.swf"; + +int args_callback_option(char*name,char*val) { + if(!strcmp(name,"c")) + { + config.clip = 1; + return 0; + } + else if(!strcmp(name,"l")) + { + config.overlay = 1; + return 0; + } + else if (!strcmp(name, "o")) + { + outputname = val; + return 1; + } + else if (!strcmp(name, "v")) + { + config.loglevel ++; + return 0; + } + else if (!strcmp(name, "a")) + { + config.alloctest = 1; + return 0; + } + else if (!strcmp(name, "x")) + { + config.movex = atoi(val); + return 1; + } + else if (!strcmp(name, "y")) + { + config.movey = atoi(val); + return 1; + } + else if (!strcmp(name, "s")) + { + config.scalex = config.scaley = atoi(val)/100.0; + return 1; + } + else if (!strcmp(name, "t")) + { + if(master_filename) { + fprintf(stderr, "error with arguments. Try --help.\n"); + exit(1); + } + config.stack = 1; + master_filename = "__none__"; + return 0; + } + else if (!strcmp(name, "V")) + { + printf("swfcombine - part of swftools 0.0.1\n"); + exit(0); + } + else + { + fprintf(stderr, "Unknown option: -%s\n", name); + exit(1); + } +} + +struct options_t +{ + char*shortoption; + char*longoption; +} options[] = +{{"o","output"}, + {"s","scale"}, + {"x","xpos"}, + {"y","ypos"}, + {"l","overlay"}, + {"v","verbose"}, + {"V","version"}, + {"c","clip"}, +}; + +int args_callback_longoption(char*name,char*val) { + int t; + for(t=0;t slave entity %s (named \"%s\")\n", filename, myname); + + slave_filename[numslaves] = filename; + slave_name[numslaves] = myname; + slave_movex[numslaves] = config.movex; + slave_movey[numslaves] = config.movey; + slave_scalex[numslaves] = config.scalex; + slave_scaley[numslaves] = config.scaley; + config.movex = config.movey = 0; + config.scalex = config.scaley = 1.0; + numslaves ++; + } + return 0; +} + +void args_callback_usage(char*name) +{ + printf("Usage: %s [-l] [-o outputfile] [name=]masterfile [-x xpos] [-y ypos] [-s scale] [name1=]slavefile1 .. [-x xpos] [-y ypos] [-s scale] [nameN=]slavefileN\n", name); + printf("\n"); + printf("-o outputfile explicitly specify output file. (otherwise, output.swf will be used)\n"); + printf("-l (overlay) Don't remove any master objects, only overlay new objects\n"); + printf("-c (clip) Clip the slave objects by the corresponding master objects\n"); + printf("-v (verbose) Use more than one -v for greater effect \n"); + printf("-x xpos (move x) Adjust position of slave by xpos twips (1/20 pixel)\n"); + printf("-y ypos (move y) Adjust position of slave by ypos twips (1/20 pixel)\n"); + printf("-s scale (scale) Adjust size of slave by scale%\n"); + printf("\n"); +} + +/* read a whole file in memory */ +char* fi_slurp(FILE*fi, unsigned int * setlength) +{ + char * mem; + long long int length; //;) + long long int pos = 0; + fseek(fi,0,SEEK_END); + length = ftell(fi); + fseek(fi,0,SEEK_SET); + if(!length) + return 0; + mem = malloc(length); + if(!mem) + return 0; + while(!feof(fi)) + { + pos += fread(&mem[pos], 1, 65536, fi); + } + if (setlength) + *setlength = length; + return mem; +} + +void fi_dump(FILE*fi, void*_mem, int length) +{ + char*mem = (char*)_mem; + int pos = 0; + while(pos < length) + { + int size = 65536; + if (size > (length - pos)) + size = (length - pos); + pos += fwrite(&mem[pos], 1, size, fi); + } +} + +void makestackmaster(u8**masterdata, int*masterlength) +{ + u8 head[] = {'F','W','S'}; + u8 *pos; + u32 * fixpos; + int t; + struct RECT box; + int strlength = 0; + int fileversion = 1; + + logf(" stacking doesn't work yet. Prepare for problems."); + + /* scan all slaves for bounding box */ + for(t=0;t Couldn't open %s.", slave_filename[t]); + exit(1); + } + ret = fread(data,1,256,fi); + if(ret < 13) { + logf(" File %s is to small (%d bytes)", slave_filename[t], ret); + exit(1); + } + swf_init(data,256); + head = swf_read_header(); + logf(" File %s has bounding box %d:%d:%d:%d\n", + slave_filename[t], + head.boundingBox.x1, head.boundingBox.y1, + head.boundingBox.x2, head.boundingBox.y2); + if(head.version > fileversion) + fileversion = head.version; + if(!t) + box = head.boundingBox; + else { + if(head.boundingBox.x1 < box.x1) + box.x1 = head.boundingBox.x1; + if(head.boundingBox.y1 < box.y1) + box.y1 = head.boundingBox.y1; + if(head.boundingBox.x2 > box.x2) + box.x2 = head.boundingBox.x2; + if(head.boundingBox.y2 > box.y2) + box.y2 = head.boundingBox.y2; + } + logf(" New master bounding box is %d:%d:%d:%d\n", + box.x1, box.y1, + box.x2, box.y2); + fclose(fi); + } + + /* we don't have a master, so we create one ourselves. */ + /* (please notice the philosophical content) */ + *masterlength = (numslaves + 1) * 32 + strlength; + *masterdata = (u8*)malloc(*masterlength); + pos = *masterdata; + memcpy(pos, head, sizeof(head)); + pos += sizeof(head); + *pos++ = fileversion; + fixpos = (u32*)pos; + *(u32*)pos = 0x12345678; // to be overwritten + pos += 4; + writeRECT(&pos, &box); + *(u16*)pos = 0x2000; // framerate + pos += 2; + *(u16*)pos = numslaves; + pos += 2; + for(t=0;t Can't combine -l and -t"); + exit(1); + } + if(config.clip) { + logf(" Can't combine -c and -t"); + exit(1); + } + logf(" (stacking) %d files found\n", numslaves); + + makestackmaster(&masterdata,&masterlength); + + logf(" Generated %d bytes of master data", masterlength); + } + else { + logf(" master entity %s (named \"%s\")\n", master_filename, master_name); + fi = fopen(master_filename, "rb"); + if(!fi) { + fprintf(stderr, "Failed to open %s\n", master_filename); + return 1; + } + masterdata = fi_slurp(fi, &masterlength); + if(!masterdata) { + fprintf(stderr, "Failed to read from %s\n", master_filename); + return 1; + } + logf(" Read %d bytes from masterfile\n", masterlength); + fclose(fi); + } + + for(t=0;t slave entity(%d) %s (named \"%s\")\n", t+1, slave_filename[t], slave_name[t]); + + if (config.alloctest) + { + int*bitmap = malloc(sizeof(int)*65536); + memset(bitmap, -1, 65536*sizeof(int)); + memset(bitmap, 1, 101*sizeof(int)); + swf_relocate(masterdata, masterlength, bitmap); + newdata = masterdata; + newlength = masterlength; + free(bitmap); + } + else + { + if (!numslaves) + { + logf(" You must have at least one slave entity."); + return 0; + } + for(t = 0; t < numslaves; t++) + { + config.movex = slave_movex[t]; + config.movey = slave_movey[t]; + config.scalex = slave_scalex[t]; + config.scaley = slave_scaley[t]; + + logf(" Combine [%s]%s and [%s]%s", master_name, master_filename, + slave_name[t], slave_filename[t]); + fi = fopen(slave_filename[t], "rb"); + if(!fi) { + fprintf(stderr, "Failed to open %s\n", slave_filename[t]); + return 1; + } + slavedata = fi_slurp(fi, &slavelength); + if(!slavedata) { + fprintf(stderr, "Failed to read from %s\n", slave_filename[t]); + return 1; + } + logf(" Read %d bytes from slavefile\n", slavelength); + fclose(fi); + + newdata = combine(masterdata, masterlength, slave_name[t], slavedata, slavelength, &newlength); + if(!newdata) { + logf(" Aborting."); + return 1; + } + + free(masterdata); + masterdata = newdata; + masterlength = newlength; + } + } + + logf(" New File is %d bytes \n", newlength); + if(newdata && newlength) { + FILE*fi = fopen(outputname, "wb"); + fi_dump(fi, newdata, newlength); + fclose(fi); + } + return 0; +} + diff --git a/src/swfdump.1 b/src/swfdump.1 new file mode 100644 index 00000000..0918cb16 --- /dev/null +++ b/src/swfdump.1 @@ -0,0 +1,23 @@ +.TH swfdump "1" "October 2001" "swfdump" "swftools" +.SH NAME +swfdump - a tool for displaying information about flash files +.SH Synopsis +.B swfdump +[\fIoptions\fR] [\fIfile.swf\fR] +.SH DESCRIPTION +swfdump shows ids, names and depths of objects defined in the SWF file. +.PP +SWF files are animation files which can be displayed in Web Browsers using +the Flash Plugin. +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +Print short help message and exit +.\".TP +.\" \fB\-\-version\fR +.\" Print version info and exit + +.SH AUTHOR + +Matthias Kramm + diff --git a/src/swfdump.c b/src/swfdump.c new file mode 100644 index 00000000..fc9fda1b --- /dev/null +++ b/src/swfdump.c @@ -0,0 +1,109 @@ +/* swfdump.c + Shows the structure of a swf file + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#include +#include +#include "../lib/rfxswf.h" +#include "args.h" + +char * filename = 0; + +/* idtab stores the ids which are defined in the file. This allows us + to detect errors in the file. (i.e. ids which are defined more than + once */ +char idtab[65536]; + +int args_callback_option(char*name,char*val) +{ +} +int args_callback_longoption(char*name,char*val) +{ +} +void args_callback_usage(char*name) +{ + printf("Usage: %s file.swf\n", name); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +int main (int argc,char ** argv) +{ + SWF swf; + TAG*tag; + int f; + char prefix[128]; + prefix[0] = 0; + memset(idtab,0,65536); + + processargs(argc, argv); + + f = open(filename,O_RDONLY); + + if (f<0) + { + perror("Couldn't open file: "); + exit(1); + } + if FAILED(ReadSWF(f,&swf)) + { + fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",filename); + close(f); + exit(1); + } + close(f); + + tag = swf.FirstTag; + + while(tag) { + printf("[%02x] %s%s", tag->id, prefix, getTagName(tag)); + if(isDefiningTag(tag)) { + U16 id = GetDefineID(tag); + printf(" defines id %04x", id); + if(idtab[id]) + fprintf(stderr, "Error: Id %04x is defined more than once.\n", id); + idtab[id] = 1; + } + else if(tag->id == ST_PLACEOBJECT || + tag->id == ST_PLACEOBJECT2) { + printf(" places id %04x at depth %04x", GetPlaceID(tag), GetDepth(tag)); + if(GetName(tag)) + printf(" name \"%s\"",GetName(tag)); + } + else if(tag->id == ST_REMOVEOBJECT) { + printf(" removes id %04x from depth %04x", GetPlaceID(tag), GetDepth(tag)); + } + else if(tag->id == ST_REMOVEOBJECT2) { + printf(" removes object from depth %04x", GetDepth(tag)); + } + + printf("\n"); + + if(tag->id == ST_DEFINESPRITE) + { + sprintf(prefix, " "); + } + if(tag->id == ST_END) + { + sprintf(prefix, ""); + } + tag = tag->next; + } + + FreeTags(&swf); + return 0; +} + diff --git a/src/swfstrings.1 b/src/swfstrings.1 new file mode 100644 index 00000000..0ab12a7b --- /dev/null +++ b/src/swfstrings.1 @@ -0,0 +1,24 @@ +.TH swfstrings "1" "October 2001" "swfstrings" "swftools" +.SH NAME +swfstrings - a tool for extracting text out of swf files. +.SH Synopsis +.B swfstrings +[\fIoptions\fR] [\fIfile.swf\fR] +.SH DESCRIPTION +swfstrings extracts text out of DEFINETEXT tags of the .swf file. It also +displays the fonts being used. +.PP +SWF files are animation files which can be displayed in Web Browsers using +the Flash Plugin. +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +Print short help message and exit +.\".TP +.\" \fB\-\-version\fR +.\" Print version info and exit + +.SH AUTHOR + +Rainer Böhme + diff --git a/src/swfstrings.c b/src/swfstrings.c new file mode 100644 index 00000000..2bf1d9a8 --- /dev/null +++ b/src/swfstrings.c @@ -0,0 +1,54 @@ +/* swfstrings.c + Scans a swf file for strings + + Part of the swftools package. + + Copyright (c) 2000,2001 Rainer Böhme + + This file is distributed under the GPL, see file COPYING for details */ + +#include +#include +#include "../lib/rfxswf.h" + +SWF swf; + +void fontcallback(U16 id,U8 * name) +{ LPSWFFONT font; + LPTAG t; + + FontExtract(&swf,id,&font); + printf("#< %s %s %s>\n",name,FontIsBold(font)?"bold":"",FontIsItalic(font)?"italic":""); + + t = swf.FirstTag; + + while (t) + { TextPrintDefineText(t,font); + t = NextTag(t); + } + + FontFree(font); +} + +int main (int argc,char ** argv) +{ int f; + + if (argc>1) + { f = open(argv[1],O_RDONLY); + if (f>=0) + { if FAILED(ReadSWF(f,&swf)) + { fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",argv[1]); + close(f); + } + else + { close(f); + FontEnumerate(&swf,&fontcallback); + FreeTags(&swf); + } + } else fprintf(stderr,"File not found: %s\n",argv[1]); + } + else fprintf(stderr,"\nreflex SWF Text Scan Utility\n(w) 2000 by Rainer Boehme \n\nUsage: %s filename.swf\n", argv[0]); + + return 0; +} + diff --git a/src/types.h b/src/types.h new file mode 100644 index 00000000..a5b540d7 --- /dev/null +++ b/src/types.h @@ -0,0 +1,33 @@ +/* types.h + Some typedefs to make life simpler. If this file causes you problems, you might + try to remove all #include "types.h" and live with what configure does define. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +#ifndef __types_h__ +#define __types_h__ +typedef long unsigned w32; +typedef short unsigned w16; +typedef unsigned char u8; +typedef signed char s8; +typedef short unsigned u16; +typedef short signed s16; +typedef long unsigned u32; +typedef long signed s32; +typedef long long unsigned u64; +typedef long long signed s64; +typedef unsigned char byte; +typedef unsigned char uchar; +typedef signed char sbyte; +typedef unsigned short int word; +typedef signed short int sword; +typedef unsigned long int dword; +typedef signed long int sdword; +typedef signed short int integer; +typedef signed long int longint; +typedef long double extended; +#endif // __types_h__ diff --git a/stamp-h.in b/stamp-h.in new file mode 100644 index 00000000..9788f702 --- /dev/null +++ b/stamp-h.in @@ -0,0 +1 @@ +timestamp -- cgit v1.2.3