From fc554a43712b76d16b41ec77dd311b4a78b1ef6b Mon Sep 17 00:00:00 2001 From: kramm Date: Thu, 18 Oct 2001 10:31:20 +0000 Subject: [PATCH 1/1] Initial revision --- AUTHORS | 2 + COPYING | 340 ++++ ChangeLog | 10 + INSTALL | 182 +++ Makefile.am | 1 + Makefile.in | 361 +++++ 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 + 154 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 0000000..5e53190 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Matthias Kramm +Rainer Böhme diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /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 0000000..6a80a3b --- /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 0000000..b42a17a --- /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 0000000..53d8840 --- /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 0000000..e0de14b --- /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 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/TODO b/TODO new file mode 100644 index 0000000..6468d2d --- /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 0000000..af170a3 --- /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 0000000..b7a1e4d --- /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 0000000..aed6b06 --- /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 0000000..04e6f44 --- /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 0000000..e9de238 --- /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 0000000..1e2da91 --- /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 0000000..0a7c957 --- /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 0000000..5b10d4b --- /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 0000000..76eb1ea --- /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 0000000..7685e5b --- /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 0000000..c94ec36 --- /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 0000000..647a615 --- /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 0000000..6c705ee --- /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 0000000..e3fbc2d --- /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 0000000..05b21fb --- /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 0000000..98e5f03 --- /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 0000000..12b3fdf --- /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 0000000..132f116 --- /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 0000000..c09f30d --- /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 0000000..3c9eb07 --- /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 0000000..7f3865b --- /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 0000000..2912350 --- /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 0000000..ca6316a --- /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 0000000..7789652 --- /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 0000000..cd392cd --- /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 0000000..a88df65 --- /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 0000000..4d1f179 --- /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 0000000..766bd6b --- /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 0000000..c6a6f49 --- /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 0000000..a5699df --- /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 0000000..98735a0 --- /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 0000000000000000000000000000000000000000..4a3c386d292d5609de78d1bb0c44b9c40c688f88 GIT binary patch literal 45955 zcmb@sWmFtYlgEo|a0$-fE;Bem0>NE_2X}V~7F-hC-2%abTY^gnE`i`4g1g(D;o0|r z-FrXmId{*=hg5ZU^{>0C{?p7Ef9QH_C@2~VB~=y?6MG|5341#i79cA-KS0dV&fLh* z#TmfP4z}63P-tl0IGGx{SlZi(8M>JA1Jqni0gA>h03aXuA0HnI4d9KvgQt_FxrGZr zT}1<+YH#M^Zs=sn{LBxY$OAC)gp7md|Ljs|f@E>^B2n4mgN| zlRbEbEqDwZOv&Ea#o5@&(!m7)-c?CV;vY^I3qu#k-p-cbVSv3Ec&3THv8%1AoeMaY zAtVfV)Wy)!&Kclh>H&7z1B^@oCYH_)Hin+yy}`j8oGc$PT%EzGcp_j1IGLIoI+@s* zIy-~IfMY{$=joh~rT;m-p@V~s=i_So$65a}Sh_fy+L*DT072kA!AUeSHMg`wVS}V! z+Rn@#0A&BiZ{q6kpD{O6r^gGT|F42z0CO0c*xT870!&QJP}mggUBGt^p#NWFl@;)R zmel`)l>VP2^#3HC|NoNtKNIrQj`UCe{a<9~f5wq;wXsn!v<0X3UrqRbO)<2!wDJ7! zlm6!%4bw+ypjR<9ceOEe`k%wnE{5Q$6|pl1cR4#NxcneBW$7$o>0xT3Wa(mT0WdSP z0XOucU)|2c)XB!u&J^5!kKGMm;Q?1NWXZonY8IBp)^^|~0dR0X4w>4S{Ew1_l=~wz z+rKA!jG+YXOBXdy2QbM$K{e#fHVZ`l>?M)y}4C3Mj7&&;G1=7GAAOM@QgCV#%!Tx_d8~`>$;FHM- zHbGA&7sO_@z({W&3gz$XAs2q5r@fD^(8d_v%a00Oz6;z0<3?9V1VGCl!tJt964ay=409f1o1 z2x9*?AQuD>^aRZHc!5vA;LL!>pMb%M1KUr)To6Fe6Au>z5cCAh1>pld@o_`=Ku>(! z5Wc7B+z`BHvmtcPCPUz!&cgk8c~58Ieq?(#4q@YXHV$FqcseULgbiF$|4Al{sJdefq#K-ekeNTKm5I)W)J{|}k z=Mx_fiYgK5#+(YeV?J1@#}B55fm7sDEt;AGo0YwIO`qg8J8n@PP~JUmL;)E~tNP2p_nh z{R%he2QH|8Z3rK@qW)t8*&%@3Pk=zMaDg39gg~%VfE`bWKz0Zt zxUimLKp?rFAR)~Nc05r6*&&$V+Im_7;RF}glLG<@uC6BsgcMv}|2n|07O>+PDOgj$ zj%TFc_YSy`z<5tXJjAH2-?LkMlnzJ= z|Al{44@eH5JdlkbNqq7^b^<=Xl>d^EXSebwBtZ6OeBgvbRy_j*XB_MSXW=O_`2KY>&fsZl+1U+MZ6dK?&Wd(w>4d!{Ktw3

)odrG$5Ad1N0{I{%2;_Li z%m=AKAovsf-#g@cWPYZ%K)y%jXNn8tdt`p5xj??hI((+OKyV#HB0p<9a3MoH&ngOB z$q>&|MS&i*2>48WL62ete5SvUhYNVsGX;k9JH+!;^N{w2c%JSV^e9NcXF3deR3zXt zB?f_O8?x$&83e9vi06qJ1g=tu=Na>(DgmDJ#vpWP=_B3evy-Mt)Q%;4{$%JxUbtnQDXn(Wqy#4FY!-Xm%_q+z;j@nm5V(&Zk)PcdxR1adaR2_h>c5`G&+hP_$1zx8 zp62|+{OmR!AIK1ed7AUjt^RY;|NhN^x}Bw?tEsdYfQub`72tA){1ImC>f{9ew&d~K z3GiQT|FIvx1u`}DFf~T=hxwcZ1-11FdDKAYms+RA>?qqSn)B{sxUHjJzS_Csusz0Z!Ura%MFX9vHClxQGZ7X= zie8x>%I~+{>M&PbCmUK!uK@8A0_oR#qQ&9)lJ{r|4>+ZZ|MoW^o9ZxYtlc%f zcVR;A>Jkru)>n+*y!cz9R>R1=-63!@rhDlau|kYsw3j@m^?P+D?w^pg-;|15r{{k_ z z$gET;8N{73sji2Y<()}I7H-Ih-Sjw@9`AX$hyMxgo%KIm+$DpPgAwDzKGn29gWbFw zwsG@$vr;?ozAX0JCEB;)EG1jI(?8#s{Yv47YpqwH+>!pOx0S!CJ5F$s(DxZH@h)BT zIXCwP6ot?v?JQr8%A=3K!UoZkLEYxL?iVHF8H#?y1s%LUJ`Zt;&)2%?@r7&KZJL6b z@3}`nF8IXQ*8jp$BXp+SbGdBt!2m~S2kz5udts;8m9E1YY^n>zK^WRl#?cs4&1jMz zNA*L6UOm439g%BZA{Vyl$HY$aUOZL)yPs7XNp0H_%mCn+-~53}ZK<}0TTr6oFma_@ zvOLre(=!wQ0io_U-46&$M==`T=0o=`Gwoy%w0P&@Zu?`Gj;p3I34OiEvkUOrFf(l{ z5i6&KI-_q+yT)*q#HBtOjUH=qFT1?NFyhF{Xh++6F@QqjNj!_F0RzphPK&?+zxWY; zV-ekR%|!vLtW)0Lr1987hJ(QHvxRJLRFL}ydt>D1k9J5{pL!-;b1$nq0c@AUh0<6e zRBxNMJeudZ6eTU(3q8Nryvn({nZ>ech5HDDP?NF4X_3);fFc=>(D(Y~_!q_ox>m!R zBW(_Dv~BJM!O#;B;f=`O-r{=J(TWb#auHov-EjL~6!{OGw#|e59QsIPg_$V+;llkh z*jj+2++QEE^v?G~=~(m>$@DB|UchkCp%;31iE4Zq$Nz+#`V-jfS~cgfE6VjfFqB8q zpS%~B^qnjkX7fiX=|R}j2Fqe3a~iwIAaf9Fy*67US1F*spkE(8_VO&*exN>~hhVp; z*g0X?Pz;4|cnyE&H})?jN^gW#niqH9DCn`EnAmAWCb&x0MtNgdY&@}+rcx9V!`ULL zsSQwMFV=Nq;1sw^v`*w5I6}l2KmmzU`jiuRt*e_srzqd*W@S?o8svmKUGE!s+F#_o zMuW@s{^QNBzALacVq}`TWw(c({btJ$d%?j)nM8wbg{zM~(h;`y0d*v2Ea_$11iT#` zr}R$waZ`Y1sakex#Ti?I973I4ywoc$`T&Yj)!d!=EsxBAE@0;U-$=gszc#4a`ou=e zygCM^8wu4cEgg;A02YB2y@y}C1PUbR}!<8$0JPb4r*O);uR-=L>(;TLO8 zVTcKrvh=yvxn}#6)2q8F;me)Yt3kcIx+O-SL#T~rn71*~wzUunDXOJT1 z+Y6#!YEj;d)o5q6>^wh^zB4E%ZqA4x#^Ar-5Y^ea4RVb&P)WB>#%rNvCwGR1agKj` z8pCvIYtb`-=IDh;5aA~Md+d!v6Y_nvD}do9mL|kc&~oI(8$o8bJbsRnz^zoP53g!D zM<2c})=CR9?a%I|u}WJ6s32hBYgabhAS;uT9p$fm=NMmj+nh73kgG{g$4Kwexyfxq zi}QBuWEE*pskG*(tK|FeESJ9G5^=-(@Y3jk2_uc$2!gneQfkT`Lz+U!k;_LGlVc1@ z*S_j{TT6$S2j!xXCwI_8oAR%6 zx9E@A!xddGu`obMB)?gEY5TbWX(}g<$E=-&O&84BH;2-vN~PLgezNcW_=+p?Za@b% z`GOuO$V5`{0+shTIK2L51c$xgY32NF85e>48@sRTozd$pUDZ0982lG0zqJ3?lJKk>8E_v6p zZ$pxKzUs%s5noe9ZcAdxh|?!nhX66r?(Jo+iKc}HfrqFZq``vBY8(6f^<~L8d{kSe zLhOr`)222B8MaPucb1nZXI>Bm_(lBiYG2~3g7>?LV>vq%!Fv6;=qWUiJ=&$Q4fMrBksZynv+YmxBy zGZO*i)LW~2m|!99Sw}sOlCM};d~vI|&6u>(M;j$M8k8h|0Pb9c>zCN#QXHJdA0?*+ zaN^}Lt>3DS^L+aCLW~Dhj%=Py?@TM%Z9f+3_;dc;2e+$EN98XyGzaTD1;u&CSL~Qf z#t}`VssHio8iUx1~#8lQDD(q80*ZD@bLI#>l#Qz*v3ZOKAS| ztcZ7vP4ih<-6aV0hjCEA45>=z!y!5c&aAU*?V+b1Ch`U-1Y=STuxlE4F_{^U{rP7^}OA6p?Flu5qrhH0N(Q~kj9^eIE>$pu_e4ru;Z zCFGGU`4+ci;_u9b8^;~K9mLxr?rvxprRupgQkHjvA#c!DG4Y{=o z&D9@4#3xpo7e6SiDbHmP(RZyhyq3-vi!FKWDf?HjX}%!h=(adCk_r+89iTe)_6REc z6@tdE;!O1&i&!wpDXLTe3C^R&Zt^qU>3>2-mbP{dvkkc`@mJ+te?xsGSuHVXhxj%) zq%zu~UD#2x`!Cw@XNgwZv0noB{$K4fgD+PKYA9iFn4!Ar;W+T2DLqt24yu&)~Q_>q)7Ur&)U~HyOeBb>lnF&xSlMQT| ziA-l+$pcj!nS$(Xf_eaa0L8vVs<;@<#(qp;#=PNV%RSG@-7iwsxTBxVq|P$NZ^INo zL1fk|1$t56uRcS)3vb3a4>6o?-tINKP9=?}M6NmgVHB!vmq~;(e)}M>fwA2N8*t%2 zyw=eFMW^5vVWcLHeY1Molt8P`ndz4w{P&JtOA-QJ&jCI+-EwM#s!leU@tQfT>$A_I zlS}w5xoCE!0(TdZ=r2YFdTi9>8hz;B1WlDAt%gnb*pF=M4CJ*0T#o|TVJme=3;sZr z3lRzGNRpIGIQf&=F-wp(dnkQWJ?qLLel`9k0cY=M!u}zb`3^l!QqkYjN@esD%ZI+U ziqG^hC5I6ST=7Q7lBnGE^NdA7hbDdmYh8xAMY9gcQ+Y%^sr)k1tx1=&NB z*aMB)3lzUTvjZI2MXV=>NYa-H z3Oxz&7C$I-zjQbUI^Qimb#cA4x2uu&cZanj5)46()K{iVOi`{M`q3dcR?J0sia(M| zEaqmWCY(DDuf@@EmK>RqG)Ft|veux25)6>OxbtQt4XaHe$=BWZbD_1=>2x=ep2Hd> z@qPM)`8!J9XoP87EJ*-wvR{gMT;Pby|C-EbWoIRoSG=Q|zmB*o|Ck^%xwL7}%((BR zs@0$f5*%YMf5KGxho39)_H=f(9QK2|hu_a6(yyf#NpkX!L*!y{%$*|B<9t%2BYdoyz86{WE4_ytvXl><7)A5=iEgr>Yl{T;odCI%(K3N`-DGbNEiZE_-2#MM`4 zjCY5R>$0mV@BAfvIw{r5_3D8#roHLiHw*S(JXvOM`!JRp?t|vJ<`BekONm)os(6#k{`Q=$Lp=Tl zQ{+flRMy+?JhRkIUd4LZF0ubtTH2l27pu4lE=#RB!&Q^tqw5k%ykto;lD-AqdBrn} z5#xHY4-W27pIB>i@lk_PZ{2VAWaQ0qN|lBt*O88m12V-+d8RC+{>uJ!!7XsHeVY$(rF&rh0J&lKA=B zv-qOI2CPT)#G!)gy|Zk*)p zto8fK5EAoO;?ZM`59<7?+3;->=1dVNGu6;G{wB*Sm1N7@@z8D2*x2XX7WiT49=!dl zM`4+`OXo$ZwKAz<0yR*5b1A&YVeXp3`@}qK17*uCeSHfo;uwFw{AgM}WG5Cfo$VT6 zTP@sjnbAR_%ozr{OIg_sCyxma5+AGvmbzsVE&HAQz^P@Y`&ONYg5xn9{(Z4v-pNqL z#2j&GuaGd7#ZHyuo@=?#n>Crfw2Tk4v2ly>u!%sJ2Bl|^h0?^XGJr2aW8C17@bo&yMGoN%16*>0)+U>zH-RHdBnk?9zI`>HylrouCq!3=6EBL-MI5c5Hi2a3QM(iGnLexGpeZlV%f89sAtGYEJPhqwT7XZJ}+1k*_x0^V76gh<4 zCHVKq=OZ6fpq`+h*^3}_Y}CZoejiT0m%)pQ>}rFkf)!&Q>aBHaDsUctUr+{e{$7*& zl%jgij}-+-PUBw3A6FWPX@uUpUzn3Y|WP!CzUGu)l)1v;>MFW-3d8H zbd|Pk24}`=apqC?xTPcTUwft!;G~uv@uFrE3LZwp8y7G9s*C&)p9i|UUW=!5z@h}o zBgGY#1F<@+W8O%2%2T*{T>03k?w?hAR4NJyFfCuwuE{i4YD`_j%hQ^hLA1qbxD7Pce zTji%Sa+$e;Y)$1QIaV`F27884GMn|j=3l7$fT}_*jeGc)qf~^QHr7_fkTd7&nyGRs z-`9H3ETn~27@o+cB$iPE{f(fUfz(xHn6{9jV8%xd*dx>yRJ7oFemeCsP^|%2vrKR7(7~A_exhjZ_+3f&NnPgONEb zt3dj#zaibhXC1Cv6V~Fy-&rF2KIU_|+s9et+$0H81?=kLg60fUVLw6{9ZzNDkfSSn z3fFx(tBiB5vJvw+KFm)gsbCd#-4S7cQldL=oEE(P0uraR;OH))6ck`S8Ip=iPNaqU zED=Tjbwx)Ib8T;DMip~&qOyq=iqET)Mi-;fd`E|*hZh3xQDpwh78Kk&Dg-2t8q6jVRiG*OsVR_#kCRN>!V3Dv6>8;8dV(HT)P{AIr1}vB4E( zkCqnbAU_|h5zQ?vG?aYM{Zrh_GGB7 zeRe)|zvF09$@mTJ2yt6~rY|D24+6c|j;mV+ebS<5##R*eMrHo^{VJk7p@HN5!-7LR zXz7@>x{7Ho0x(wGrKy^d?FxD;0Tdkl4=#R3sb6T#_t$^3SLEf* z5DFyhWsag}S0nHz5jdp^evxZ4%n7&WL_^ytw|zXu}zFg%IJqE8Fw31zY`7kNb67g zxogSrRrFE*E0Iug6OS9mAIO8CK2$HVKpMqsq-?HVxlCP@h=s)6Eo#!=PFbR(^S3B- zXMfO?8hV$zx_d0!rEr@k&|lC9nzH;p#Z7kM8Ae2QH2sU*CT^WdvXz#R6}|diluovS zZ#S&DKWe-G@>icHS=;*S&lHlXgob$eHi}p&Gr#u{r&%S2jbk@dZ!G zNU_&2!mYVpYdhAiSaT-AvF(skcD$AoLlj!V64IG|ywMU0ny}(#x=jrp3ECU+4dAG9 zF_noQ4A*e+d!7O6ig(5GL*)w(h zmCyJf>})REKc{BjP};2Wx*Ok?udu~hXf7;e1l{_}XC10`4!*)zst%%I0m4!pCiXm!Kv*-5e4r!VPdf>S*Fo{lP_d;&NdSKHUzs6*T~yiC+T+ssb^pR3#Dq2H(^LoMqSRZO7ZA2358BWi@Bf z%xLRYiYU6ZC=Q%JeqdUVXd--=lq_4i)Cd2Q&bWe44iY0CWX`mHVa+DxGW_O=oDnu4 z(qCvw&8fO-vly3eHPFdB2)0@TFlBXZv#=rL%)?uDnX9bszt2G|znL(Md^_oc>6ZX`(1eVn+josWTVJMNE7SN4 zIM!AbI`M?8mwoGCw3{-#CYcxbq%g0MvIbK?MJF+ibJ^k?ZG|(G7F*)ao8?nF8)=_M;N9h%KlhnzQ8hYAklW2)wc%>Hf zF&M@$ELSXXckH!_PNnJ+$qZC&4`vIX?KJIaGJPQ5RX@Hj;gQ@}4HRZcxgphb%%KbP z5Q*hyQW{b=?IKCTAl=nQl|2d`hxHqkrR#2U@QM>$?u@kGsrZ)d@ht;uP|~s^vV!27 zC@9ejx}Y&Q7SqHgWP~$SH(>4%<+b?ka#vkb4ZqiSjnYtldo$en*Rgi|{C2!yXtR7N z8SB*LO=i&M3{kEj!iex}H>qFX>AJtbO1pAbycADqY!;+3XT?W>?Y{kLR?~%h@5Px@ zge6?e=6oP#NAaouu0Sr{^W6~gAELX(8fR^r8Q7xmfsEQa4`tC{D1KkgWTy|-P&|$9 zzwXiT_%AHEtnEH$`&oCRUENc2;RyhUtgIDPeymkt)-!8Ig@3+$AK8}PGN`289MN83 zg=EVpc081`GbKVrtmqddY_CWN)mo;6tHW9>NL?S%F>aHX;QEuxqc62l1r57qcq5)r zjs(t3`75O)l_ke2yr_#7wx39)hM~K(_jb>)WD%QCZ zPPNcxGDfSPuT*8uU`I=Hs<4wMxS4)lq%V@$^5e9W@XbdBc5e}KEM*oOfN| zIFztR1?}~edb%M0b{yO6c`VD|QOM3B?8|^5Ty37pZ|wExdYQMFZ>`@7X*4<{c_7)^ zNSSC|QAsL*ND+CiG@3+{eBjW2mj4D#W-|rgkIm*6?9-!`TpADZZ&wI3s!2lyeez+B zsV0)!E6p@^#WRwMJpxorD7vnhb5tSU zI09rCU>7NIC=KbPKtkYUK`-{}y|OTL zrO<_?AtZf_!8>C7#ROwom?OEiO$4CPy_u3lbo>r0YZgFaaZ95!ZsOtv6SoHpp^0>_3!Sxw185=J=H0~E#gZ z6(*!A`_9X$K%wZmjK_bvzA(_Iy+~c6_0r5~x?%U~Ln6ONATQqm{gIeJ2 z8bZ=C`P<{+mkD}Tjn-bh&Gy4{v%niS>-TlkBKyse_w7XH20jgdJVvtTMSk~z_Of0h z$t*W#yn+;er7!aPrM0lZUQHd{xajLzoIbZNbw%0yMYQ3Iq>_g)v%c3szqeDlJ3-jf zhp$tXev%w5OPXkK1W(FtE>bf2ub^W|*)n4jY%$rjjmb(=PwzRI$)1QCr-J*-_`qnl z9P7iS*z2=s5qwVMi6dwx7rM$yAW!ljX7(&JB44eTnj>O7rV6|mAvywHgl5QiG9O29 zi>9}O$WNH{8DAbwAH}8oK@w5+GHTb2>JM!}3Pr_L^7;|AdyF|-tFivt*Je^8#Ckg+ zT+ZfQE~!5TVvh!PVA=#Qqfkb2u_9EzxgAXu!n0kzWJFr0EpQ4S``f{FSv{ZinKJbR z@lC4NJ68%bB|o8x?DXvEgafkh!3RpwQ11@^t5VdD?Itw6@$ljr`En(tbcG*~paW_@ zR^Yq?T-BdjxR7z#0&C~By1hF7EZhtf&`Q|IFNKp#o{Uo=+=V#MaBE5^L%$@1R>-=i zjg&Jn`f_@Z?8bWl)Oq;*1u(_d(rPSs4Fc4dX*jQH&>{EQpef2te_C&6Ek%|~Q#t%w_%jD}__hrAFXMFtd*pLTbot3TsfK z+q{)5Ielr(Pcf?}%qkZ2n_FIGv!;$i!(DbPh; zO>e!|b&BH71mh28fle&d(0Hxg@)LPOD70y6OxnBTy+ridRYvuQ0&~93{bLTH+psSn z#~sa&D|D;<1omaqN;c6zf$WqnhedT?<3B=TH;Q)|!F-2SR4Up7-(t65%o1MjsP{Y& zp>sAgtze_8oWxdNwq6*2>^%M1kgzTEQ5d(=bC>%rBR^*gQN~K^&*gYb!oXXfstf+Q z)BQ4?9pGP{^-9UV-YKI}UB9MPkJ(!U>*(IFDa;`ja_5RyqYp4~ne1mEu%XZkxQh9L zX!8kj4jZvP(t7^=DyX<0;;dUFgXcaQswp_MD_1PE{evI^BHA_rb>Pg=vKIH<X-pP zZV1>Gm|K0q2m;g)53KPG`TuY1_x&OSysY1l4my98MV zswE~lZ_Pb;GpRa;w=z2CW&sUOU{RXd+()np!rk#^0;c&WZWs)OFF9-GmaRyj4`fqqk6u*;2#m@kf(-uW4px>sc3*=_aX)d|PK~dO>WVuo`d2@cL zpmSAb$+X!}-q5!QGsUK8OAW(1`0L3umQ01tBUx%1yC)4N=}~g5<$ao%qyq}qIQ!0$ zD{Yu0Q6)pu^4f9UVO%#Ri9DGqBBhHVY_e(~4K*>?>-N_Qv%|6vR(R%n)IdrsG_5<# zB|ugG>sq^2jJ@Mh8dmWY!!LZRY zZG4oXa5Xc>Fus|p`gEiChpk)4>*Asf!9tb#`$?ayge&>D84~kgvOHX}!tI?CLaNz@ zu?qMt)Fq-2-_rd0+a126`Stc4kwJpaS>bjL;iXVpnVR!8tteL%J{xHyyPRITR=8~N z(al*O*#JP^7K3!;Fa|jmfy}ErPRRd{vbTYdK*6Qv_Xd}oUN#L~p#FRF!s}OX^VM;n zySjvT$IRkHd1M8VDKw&<&M!if6j8;aC8^tHqF1vd@{RQvjiLk?MnbDNmu-?g2Is52 z1b=PN;%mgv{1#m$ACcG{Qm%oFqXlPAJrZOdJ1G(H(-IDPX3;Te0Wi4H!r4Rq|*Z_e}^j{@MDT|Xb6 zW47O`ABf$jq&GI#7MqKH;>6?C-S#Sz7zDjGH`BX=W0c>h8bj}?u3i+6hzYkE@_k{i z&y-0p#nNv;)cEP|P$CS51n+ky>1>9-xJIxQWmZJAiT1Z$_G8C3hj8}@TWAN^#ur2F zfzb(=`{mMmo?HRn!$(c4UxwFZ>YJ|kO~=^{`~7)s{#r@a9ZdjQk>^x)PlJ!wU%L&t zl0V)3`bFzJdGwjM1{+uJ0K;+P8}uWjf$TIfTSjw|NoAIELjKE*;h^3>QQnnxpYvtD zvSo&}5q>mu;$rp}%lq_)=>YSAn~;D`Sy!HrA;oFH`zqo~0s9LlV%n8fqD{<|n)f`R zTIQZs#jt}?W>b5-zB=afs0vr+u$(vZjil^>+k$Y+TGa6#@A5e*$#mKl3hRmr&6CP> z;_m4bK4VnYH}16r-&DCbaycJ;%)F~8BpW0foG)%pXZg!X@s%E((_#1lZykA9yIq7f z9v<%PCScb9Jjb9^jka8K_5lmBKXuF2E1b$t9`#pQtJz&abi3Xj&v<#ZXb6gRR zS$7oGIc7*8bS~1d+DD#6vMk^Y_%}aQ5Zt|kWJ}f6_+dc$;JLaJj$=m;{NlIe=enQbA;VqU;CTd+FhW~ zrw~zccqqo~5hle0c5(OFH}YAfEe8WBi(dQ*@aUWJ)nZ%Pwy3Y= z(mKt0w-~S&Sd9`{)tnU4vVXuKK2jjjBjSzyD!VANcYr>D#uSji^$vTz4KOacOnI1Z zMMB8>{=?vSTn|)fJ0ZG*{HkqyWx(W$A)_B>&6c@h%;3i{i`$+|p6{(Je53h`&1eZe zC~)Y?y|z|W8cN*k^5!lK)zcnm1_6lue)zfXbgk9WS+-!J!Lj=9T}_KK24Nxeiv{rx|f)%Ue-6?6{RQtSyq2&c@at z^J2BZ_L}1peeuK;4TajwD0?ve2tc!4i`teA_1oAF1JiR64qa{HTVk{C{o}%R0gZqv ze>=xY#ZEDf2-%$X8-zB+#vNpitEn%POU^z4yFcAmLpA0;&>In@<3+Wo2U|{c{awu z9kO8{T|ZdVYrJsVjmMdGo8g{^=`oZAzPe{q38?Obv4Q&;51ne1;hgujv4=9D%lNeD zwalFDz_AC;_NPyY*h`pwyWZc2CG;}oJT}?*S+C7-56KqMsNhHxJ8agKWOrU7@F&Bw z?5+{-ZZv-mz!mc=W^`?;_>1aJqo#xnKx2sDh{)IRrGA#xN@RD)Gg}g*% zKAWDdxg(Moeuw5gZ==}R1DvRc7CAgqtOX@y%^;Jo-HH<`$yHvIZh9;pfq1FTgNx}( zG?y;al*X{(*JIkxL$foA7z@|^N<#Rd)h!q9l_al*;u6{eU-lVtCr)cV&D%?~0U=;73bFx!# z8>ofvvQV2?L3_Uo@b3FlNB8o*6m&-HUuOSh6Qn^E`BrT8rBcvV9yuQ`=%~+o&Sf5p zVGX^}Y5TIhO7UB5AEK4YarK?-!W2yvdFS+W%mW-AVf`i0wj(+mCCa~ZV|eS1a5ug1 zRq;!=IocfoZHG)-kE=Uv%+Pl?QrGjRI>php@gUOv_L?a=HpV)el3xtJ@^$#c^#VDs z`YT>|-M&jv5^6G-P@&bn)-zym-+Fc4JFIjSxZw(!nS{AH z(?iSDWdrfqw;{_XAD70u#WhsNg}Xs(<&7kU z^@PS^PF9lvs7bm|c`|W=Ri%=lavo03xmE%04<*zZ`MO7?7roR0M^>N9Qw2Vf-4 z5!jQh224Oj`fFpn+$-ULVzrdcY3zPi=h}4|ogT=?y2F#SgkV#DO2W!K$0s#f8i74d ze&pyO*MU|kbH+Pt{_y6c2cWrU*}tv7_0uzZP40yF9>mh2C9X z)fiCnn;{!ZxFC!yr>CQ0WnZd$k7pBh5=EppiX{4S|K*ZrL${0@kx;^r;tTTyZFz^` z>aGm+b|^el&|WGpNd=u<*eM_V3eLi9;*9D(y9Bvb9&00g7Ne+4;!z?ziG@Q;46lY3 zGG6!3IleFDSwg&-M7um1L3*EGnyU7ahNaqM>aQq;{(}CFa4(kL5KQ9io#dS8ZT(2iQ%0(Zgy?l4Pj;3Pe?XShDH_MJ7UI733?!^c>vIv9!11j5%-3J8*57iwZ zYFPRgGWTTkzIr|&g4Glwt&m%L#K_&H#O`JarcfW#3Vp-4v(Z$dG%h#cWKSW(q9d5> z&s#ckHW?AhxxV^EtI>0kdz#;0o_d>b_1DhGm8RQomHZB|t3^8=8#`t$NphrJ3N7I3 zB0!MIseJ{Mpq@f|qwmpvh;GDpkE|%7VBVR&^eZvq5;nF+lgZ8`_INT}J{J!m_hu26 zzh8IpJt>d%S*LMIQ~K3HB2}>Teq=7zjmP&}=~4L955^`+G;Vc)FC=2P%NEFC;1}x3 zEk@EyXxzLkbiS%05JAn*Pm?i=maiB#T(=L%Pc+ejM&noa5@Ygk8$~uaI_3C3nZIm& zQBOoxD9tAr*d9Y)g`YP&jhp_`s~xKCXauNgwQur+lKH|75E7Kga60qmd!5t{3H{M~ z*Q=@_m-+Yuxtk_Xo{m1{ro*^H-y-9TTip9-SNN`Ln;*@)NawXd3_+Ec0IcCVz`wtJ(iq`oInKEuM)8`j=eim_rh9+YCYUO=!hibGiiT+Tkfr9>6dGF+UPICg?{jbgnu;m39JZoys;6mqjN8l@1?vvJ z%-5{MhoF8c!FpHG@_g^j3?BgacZPa`vSP3X>nR=R9KczIn+Mv(k3~H~>{bW+Ej@Td z`nfUM340&fXWgRrJDOP8&ARv=>Zqvo9bd)I&DIz2-nZW5=ZuCB*pWUQCvt5S;pkP7 zaw7cgm!jn_OHMfcEXUu)5K^~>brnaipt_Hc9(DZNww`b7A_sP$b&llKOy@fiytf|M zaP|RG3$Lb8?Q2ID>=iT@%?Oi%Kj6^YkBDEe7LOhIdh7PLxw5IX%YP3pVmYSYs}lY? znVJ(&#OB13UiS9g(%f7rkv5_YYMhq_bMxWYA8mA%GVh}8*bb+U6FC7w`SSFtA6?0y z6|4;j=j=fue&2W&_%1yy{b~|nmBbF>?6#^8J(fOY$zI@cuf&9x+^BRkS)v$sQyg}h z%@@y;{OZ}RII1_s5bXGHn|b&qTbZGJg=g=o5=wJ-PGUxW)uke;Ef%q|PQ~!;9+%0D zdV{4aNnC~|&++KXb8Jd!B}2VDSl*w1xG8N$Hrn>(I^xx3I*ixjb+^;UiijK(j96jr z`Ax;>V2&k#DWcY-mweln-6dD-1R{)Hqf)%bP>ba$FIPNm2G$Ru*LPtL@DDPrl?Yyz zoep8MHn>Gkfi61 z5s4e`xS#+W+K0s_=FSOTbXOG6+EX_@Mz%J8#esu@tVE=UVvEjQ^J34sF-sB+NcxUN z5QwXmIlEs~sdyjE`rdk(1x4*a|K|f=5$9|%jf+haOr3f)PN9XladIezuLct#G0g6F zWKK29)+67qYp*|hFTfR-*~oA4aX_a5K+*j(3i1|(W2%J?DS3vZrmlFXjPdg$oiKf* zT`ya?>DU*`ard36c&EO`HsKTU@y&@VPMIGY9qKpwX|f>y=q0>DvY^a+IsX9q*dVxw zI#U1lJK1rMP;EnA8}5Gpuhf&&FIw3l`pY#wQEGZ&g2F#IX8t5^F_{zI%bXlk#s>t* z$fjab#WZN!bFfXRY)Vv`Z_H6u^P8{Ne0^OsOTDZ77o)BF_-f6F*1<$^1?xfb3*f$| zfuc#Q1-LxXPPlSgjxS&cXYUD4{H^ zQ3vv(lt-nYy-}x7&=o$0d3ma&d+{laZzuFNO%jMNx*L5lm~*@qmHG-UgRJINi5-`6 z-K)YAJ~282UKw$t_DNd9HY1%c=<-^?fyU&7;QUvb_8!jcP^EC%8#1}Xz%ca`gS1@? z7CCX$_q}C+*zVx;z`vAQidvqtE&K>$X(qg9XY=C-_EZ(nSko@#L;60i`0#%1WV?zR z&qA}!mC3CO6SUdBhfkB;FLXX3i$bipLgGE%ilC6A!L-#I!kasY^jq;^@a0jWMke`U zJ(Gd9QP4^pQ|Q>OEEKReBbsz_78|t^w%*^lFnZ>Bn@@||{I)iz?JR#A>#V_U^Q^6^ zaRqA7TRPFX$xwpzt(aOvwMG2lRa{#3;x)`&u4oVIT$8?sUQLMPZ#VNF%ZX*~Gqaoo zenD3FvZ{W&A5%%0pwb4JCBh^xextB54xj6kPe`XwXs*mDtN;}wd^AgX7T0F*MX}s8 zu@-1HKu%@H-ca)}IfL-AS=;D?yxH+x)UfkU;Z8qAWs*Fqde;ze5K*&+_-7fjNX49= z;_mZG7XA)1us`K(_GMGN3ozR|mZ2Kx;>FZypOPXR@ZLoVm(}IH^uh)`)x2UABM6kNZ)HB2UB(*N48>KcN0tTB z{6bb~i_;f%`Ty?wEs9d56+K##a1qN4EzD~;4y^`KbW2RzSIvExf#?Nk|6GIVt5o<& z7F~MpmIrC@lEA^_K*L=-=2z#th|OUcF$+p}b?4<@6WGFmC>yF}7DIZzosa^?aW^BK zu0Yx3?QCk^BfM^FJuI+iJs5fTv*n3}oSiHqiQDbcaOO$_D7URcHp zU;~o6s_)eg!EN9g7%h}~?-5#~)iS?Vx4|M(=z9+79|tT|Dv|1Wf4+i+@XvqsllWs|tRH^IY3C z9d(7jr?31RO%8VK`fdZ?gyLsTEIB+eU(!y`N&`)qoF0H3<68m7q;*w0F zTp5c|X7z6A<4m^aM~T=V>_Nlf(Z4vyQM#R{{khBvIL%Lrq@kblM`dW}Cd-}n5Wkk3 z1L{*wZ3-=yeS!66GDFq6=qLCE3+`(-;U5kC{vah&D+W178b(>VAVS1!MB`hrH1p=q z^dKzDY-fXEX$dIinS-p5fBR{^+GuC>EhRh>V<$DqoY8S_M(DY2RV1(s(yu9W>yWV>v8Ff7&}gV%J4+5uEdZr4m)qJ+DAmV%11!*dAPBXW1L9&=X|RZYOT%a%@CI1hMN>EUuuKlUuu z;c}y581VsrRO0e~2pdiZsG|ndnM?1(H%kZCCKOo5rYYTBBWWPtfvC+Um{}RBS&yQ1 zUhIMr`O+z~F4d}oRUgFGm+uVvRACk#Y0(A;^j?G{N_m^Dkuf7%#`m$Kw#*HME7h6U zRB5}KrWRq?3i#A+!5*}cS|(8}00_j&I4-u$8d70=lNMd=43N!q2mW#@{3=_LY9sXo zSA~`CbbUQ=%dwDTL=%rORA-N>2? z3cPDvDk}(0?$>nP!17qinhB?sX>n2aK0JX76(pFPdS8f{l1*Al|ibOjoiAP<}_0zHeg$5M*ftp0VqUf zNN?jclj=_5b4>|!QDU_-X~oTFtvY>$tU4d) zzXK0qaCNak(+)gtu7zeE^16id?>d{+EUBYsC5)5B%w(`5@q`?CJx-`>9DdmrV=MCv zCnycM#mQPlINK_P>>0U~*3?#D(vdS(yoOB@XM|@l^ir_d(78_ahfiWbC~d^j2k72)$n{a*l9=Ej3Fq4~vd*6KVCA=dOyZP9TuR=MUUb zd~%1DsY0MBgc%lOI7v+<+T6s_QKJxQO@G>}9vOS%9sEeASsxKux5=tM^t1T;=8;$vkgnc{v z*t-)HWr&*@P<@45tdKJc%RbT!wGX~8x%2Z|YRYerp7bVoqttW0bQJ`URB2DYXC65I zWn>7iVv6*%-a{2=J|InBNDq(6 z6ug!`5)T~~zHZEtr{gJe%(c34U2tm12433xzABMq>57YRVTZH62Ydc2^fy9m1-%VON<_ z%Y9r*Nk$aES4dVYJik{`{g*t7u0Yc zb$~Is>-bs9ahF_i6oj)X21i$5eLLp*G8#SsiNn?T7S_QhQNUzD{n#@UC2;IBey*Q;-7rfMhK1Z;51L2HrgZN!leIFH__Rc@eWATE#MbNg7BZSC<{I9`We_n^fb+NXuyB1ho8FaGjTVeh`XmAsn&_G#ipgKOg8VH` z=y#v6xoO!>m&DGLlW>&M!vL1ev^zC_5!|}O*x&-=rt79Xs-Ac8+!Tl~h9Xy?uzn4{ zB*qByc=;h{YU0LxWX8jMWHAlUgbwADon0D!Byb5C?%#MKTSgLa(eVad=O;=RO2n8R zlc?4UBd0NzIp3Y=&Wz>WTmwnl5vkRL#f`<)KI=pY5H=o*Lqws-9ho?k3Xo>( zH}X{D&2@B;T0I8y7Xv6u^W(j-Sgu5lb7(#r6lgkiowi!aT@U6VP&F)_N7!LpWtZ4T zRKEi90k>t$c=Mo7;HQ@eL@%=T+Ly)rqrlrxxa&KD?z~V>u*^aWCVnpE9fI$?k1*6Y zpuhrMir)(Pvlm}{^6uK?&1a8?D=IFVru=<78T-bYexYl!ZS|I=I+ zD(BGrFKe~^>QCDMc>)L5d0(@-qxeFl&>DUGLF)5TA(6ORWaf3&%=USx9!yQ?B98zQmG?5{IMZD%d4rq zA!~yq9-P$)svU|nJyJKNu#rtVgwwffS0uhYa^>|eTnmCcMz;c+AJ5% z#!JCue}%ui!#e|X@{(P!NuYA^^zb}UAv+VuPJ_%=#GVGJx=mLuk_$o;kukClA3EYr&=yU*;t%uo)~O6+4Uc51!~lCx~aEi+O{#%2(^ z{)-@67uR;&j6P(+D#n3#N(AMLMBRSg=^%$(q@QM zldB4@dsi(N0Vy@g_&fWE9WHp#Y1nFMV1d&g!z1B`9^^rna%w$m!#W(5g&{oJ-dxPys4!9oN{S|fCl5H~g24w>Qk z$3E@=GtD-itV5y=vU$p?kvE9TSImc#gA~tz^dtQJUWXqsgD*kHq}#R_J5CTcdOG@E`+iV?vk z{(TxJE-4)SCYX%jZ%0Xp899twSTdZA5k&UQ+kgc06o^Ph4gH<+PcapupX1vS(`Ue^ z^%-&`d#OY&XT_wB6sbdwoC04A9-3w7uwiC&>-fxOv-18K_8JUmQG?kfHyV_sMCI^K zuf&FycI4sixN)wI$AYr^kr&P0#P9c!{wpTu>G2J*4UFAxxT;^^okA3pT`W_qGtY%SwA}jZ+4%cKLFM!$5+u z>S+>*5w5qCerkLYdCb#S1qZm%kY%WGI!HAQyDh7g+9zm=zY4BWOx}ynlb^BGt%pWB zd41J1HM3?Iw;j<&SE(nvg;cDE#0?msb6POkO#xFVf1#;mHXBqGSV*1EJsP(OXpxs7 z*^B+J;}r>U0yHvmzUOhv)k4(RJYSxO$<-t%82MKN^-&KcE| zbZci-LZcBv8`lF0uf!o8HGw1$aXY4MzcNH)q>W&{gHYh@@l;ba&{+8Ntshb!N2_d4 zoP{F^j!o-EKwuj<-hOVQ@iwTk^4dVd)JCNdo{$L9r=q2r5P(Z>z8zkhO{FQV)a98p%r4QND;;v2+fu#{ z=6Rtvi{I_&{hPxxBBKsQiLG(5bCV!wUg%W*?A!?g?fAPg7hP&b>YuV|R$Q%8TZI9H=~ z#-M zzkRiO%bz9?O4ZA|faMI37VJ0lnsCwHfG|-fQBA*9wiVVD`pZTU3W7!BFT1qp*No5K zCx}g>5xCii`NaiXdXNDoqQ(1^+AVt~8#i(w3p{!g#~d8}FX3SJW1pfPJd{xNMq>VwaSJ z{bAUYa#VDD`5~#pQ*MK^vx9^b9awR37vL5FA+!WF!(3a|4f?X6uz8}iAFy@d3aX;j z9ab2WES-TZwjsn^{os*J2N5V?Lrl_qa|cBJHnQLgNL7vYhSaL*l2&Yk5F8#BE*};iWqg0 z@@3md%M#yFvzVN5U|yRUSsSH<&B|fLL(<4Xz;`wmCa3F%8|(0)rtu2TKh){RT7pkf zxz-|yvn@_dGtknWz)ez7%|=6wS^r z?ZmfJsiHnGwik1I+bn<1LJ|dM3y_+(*4Iu{aj!09q`374TjO8I3)VvOTQ_N8nFvhy z>$8DDA)>h;d=fJJdLPxK!NpaH7sk3E!sf{x6Jw*{OUWy?$NOQx1K(g2;qkxaOFr?`iGQ<-xwlTS=4cv~*c3zZH|-Pvq&z|Mv|X zYwvHP&rPxum5FDm4+_#`frXTzlDLDSRoG9(%BaQPHCd%8yidR zBFUVhuJozgsm**bsMxy!XuvT?!H|jblOg^6;Yyc#HF9%RgtG>MJi}#l14A+JXnKi( z!V(=D&u*ofB0o~jg^iB6{@?8;) zL~T7|-rd z3oR3Ykmw17`&C}cDo?%IOe7#-l+~(yK`hB36FKOOy3V0H-(b!}cR8&S@gh;s&d75fyj z76cg2&?T32vofp_OOTD{qpo6$`Ft*#hIn=4ve;Mz{`*>p{#wrdJzJv1Iv@Fiffj3g zy&TVw71=rmOb=*?GF}3ZUUGAhbnqS9q5mId`)D5WqWjW1_PDQ%c55b-yUsE>xpab9 zoiUlQHsnlH>@*_*H&UV6vL;738ZHkO@t781PqDdzw* z@11y>W{2*baeK-!IpMLc`<@dc>A1diQ1eI*?n?I}yw`w^ArL?-!QW#VB8cg3_}IZ( z-iPwy3hth2SJVo`+6W<5B*$e2PMt4CiT1WZ@ar$`D>+bTXM%Z z+OW2>qK{=|w(T$Hr2P(VD$=CFf4RUpO)n=H#V&mO&N;=-KfWXKtOv%rco#&W1`_hz zO^TC)4nr3{)k$3~4*|?fTr*r0`Uli;9_rLdK)=_B@|8}>BCImwAjb0SBh?X2(m2v@ z@}Evy_BtN}yWY4apEd}?MdB4~(?W7%L&u2)x=u*gXyM<@VRcDVW=9c$Y=j_hVZ*|&EWC;oBKCg2C0 z$rOsDSnAU7d@p7>sB@a>vBrrbsU;MV1S`AgpRa3B)^RD)bMb2leyiw#em$;FAR_o< z*zA@{tSl$JnVN;A2a%^HyL61{0+>~R=(RgN8@-t$JAG6ijGo+$-~?+|Xx7NF|I!kd z6oS>GZm~l$v)0!emhz0|o3VOYQHs^x+ImOg5N@MV=_HIHktqCLmrvvpw}cNJ`~|F< zjKd@X6b4b{I}e?dR`5>yS+2S>-3VKHF8I_=6dSl=#=Sq4jRkL=VKA844(RQ?2|6Fr zW~CdrP7DSkD~w!8;{%R~WR?NrE5UUGWSODg+Q%UK9d=9mY(UpK?rf=iPo z`%}k|#rSZ2XUfvOw>$Ax0qv;9JfLx!LY*tx6yw~fK6-` z%I}2t5{P+IJN2MHh(V8E8H&Jf*)_%R4faI_cs+!H%tr`#EtU0u$c`Jk=UfEZL?8^s z0Yn+CI^ww_=dzAji4iRCNQgmfFmtpTDuGU|2I~&to8p%H%pJb^Su6}(p#1S8e>|%T z#@{$G)Z!zSgO4pEYFF4g=W0s#579hQ*PUgWH1ZKvjf~`bt&xI_EmL#nCfmv-ga$g_ z@hTqN1|1E?GZJ+wOIu-c7lR=ot@DgO#^zprb|uK6R?D+BukGisqvn5+UA<5O^=+{p z$<~jfcLms$3;q-`Q+G}`gsNZoVi!E* z_NLts`g;YyTCEX-%No7!<4k=K0*^|TI?%YNTE1Q|=}C3#$51OsWYKb)mms$-ucFAD zyiGG{5FEh&cd3vq83qi^eh#r4`Nl0tH&Plkb$Xz$UuuT7axuzKlYhW^=NxoPDt9&@ zV~63??V{ZtRk=Oo=s1QYm79sl0#a8@g#|;eMe-@KVp=AfO2!RWBdMKes>YH4XI2O6`$ZnFLSh6_*X6&~3OPL$`X;?nh&9ljzz=3^u6mrjh#sQ%#ETPEt zp)jF*Xn;=SwHW}tAvl){=dm_JVvteRLcdILY|IlZgIpj` z#^hz)Qq^N0x>-7@?qL9_qdy!Hqmp&1E_j)`S_)vS*~5{W2xetzWDP!oWdOgi&g{tG zULkV8==b>im^di0v#|E{GkPj+Bs{fvjJ>7V?;qw%8bD-ctN$J&nX* zAi;FDXYqtm>v7^Feoo~CTlIx{VbNz?c@sOf-8(r!9GGoCM#rMsCFKdqiF)DQ_>i|L zwHze51ISHNK4f$VJ=J8fW#cv6`dK|vUw5d-dSrPupuJequa{CNxT z6d{fMq6b+DE|~Q_c~4o_@~H?Iq+j5+FS4v%(9=mC>07Wn>kNQi#ly^E2JFGUkSUf) zBx`@r<^C39a!)Y{GW18ORQHldzkhtXjsV{!&qEt|2Siit_2W$MkHWiCT3kQ&2{a(w zUXdAMtlNY8Bl?re?zf6Bj#M{4ml%hAr~De|igP_z9p><)b)!AGQ)1k5Ue7(;OMsCC z&zvWDs2Rx;Zj8O8=c}q7&h-q+VKegOH-R4R3QCe{O$AGXx`#0^2RTv2pFRl{earX0$fWU`wJd7dP%mm?wzV?6m4ii5qcd&K#f*OpAPuN?5 z7Futke78<63}U;F_Iwz4pLt87ct?Q(4Ke2YVED(DzR$avd%1jv5Qj$OO6 zF2tkTkR-5LOXSJu$UwtgIB4QD&48@<9q6{mqgR0!*qTROI`d~qZZrq{mWFQ~W{!}@ z=H`xFTewoX53=7w^1issv}V^uIyZQ=vZpM}CU*@Yz&}9NfCBetg0$eKqx~#A03iHu zzH=q6V7~JOt%(~d-C=DTHxF5|nb{1~1-=?=0)YpB%~61W`Brxvdr|t2GW)f_A?4XF z`V=3%(zubRLt%8ZTJDp8jAjZ?A%P={!q@eB^M58xw#u!H^o6CXwO9@9zygWI?G4U; z1keImE4%I$fx6=Nm?^buWyI-Ffau*>2lPa_2}v=_Sl42z{c%|{P}-Zn2sB{)hlp^t zw0_9(K>%7~gD`#sI_QoaN4Q;p48eRbpEhT@3sadsQrDY>Qa}l_a`%XH}zVWs?c~gc*}pzhl1Pg`by&bIgfNI4LpV3S@FamZaNtZPaEP{ z|E^f+JOY+LmlSgG;*lo1;h1Z(R&6e))zeMNE*%yOnfd_Ev~VIe-Mntox&V@*s_hsN zzeU=e>qXwAW;v%?1ZND^mgq|2>u8wM$F)T>T%yF=WtRj`gzJ#*u5xTVr!R(7ZLOSUE)$NTV<(DrVl<+4JZjyvp(Dtp0v*XHy;1Kvk2 zQ3dq+3>~xyF6BBIL)SL%N?e) z;Xcb52`{DCAC~S}zVHrYd;3*{#JEQ&??6$OwgYt}8SWCzaE`Y|o~$6or((ly?D0Ig z_9%kWE6=c!os{)1_d=BWcW`*ReK<-1E^7t5163pzftmbB>jmG-MZmtJI=ezPer$#~ zkKD7q7{7CVnDG>CDX1tn_4&(x5ipu=UtFjwXmNFmMpBq_pWJRL3Xx1 zq!zlz9|mZOZ4J)6D`h|$O?qTW*HMU83ux!m?NfsxoHGV5h49!Lqio&6hrY0f?)~?X z*(|dnRkc6f1E4^F&rb3ALfb@J%9=~Rzvn)g$6 z$B1*~U) zviC(Smg|b1dY1P)^2)7)Y?vH0Z9naxLMkZx_?iHzn(#Ew4P98$LGF)FNm-jKJ!ux% z+uF9IIP^#VoD{?4=7F011n|8w3zAS~{3u!L=0mO2NcN=W(w`)X^(@fO`u@KK&a~`C zdDQaQ4QCnY+2S-LDbKpmo%kK2+Fh0H?$%NvUNmg2Z$`C<*yMqqByuN6k@6SYe%Faj zpBwtzOO4m;omqzq=bv5(B(JcwJ`&*ac}fM~3*>Uct+iiDfHa19bPky$_(p>^a~U`UvI5GNqIw3bU54_ValX5ucBH+ zobHPmj>peRA?a3d^{frmP5R)}W1C@WfwJL)>|-1}kUJ4qV4_y+0FdH zij4pEW*SEKaYJTe>vF5KAU8sYv(#CNvUq<6)d6-d?5>>hi+ z+Gsm>A1a@;ZP&W+7Xryx^e_#2>NW`b3Z+(J(Gqtr*KHoPvx+J$gqG>JFpw>H0{%6# zG_-V^JECsIi!U`rbgroM*JV4-nHh~Qn+Cgqr1w_1<%!D0eR2mdq8Gtghqa#NO(&{B zYqsuD`l#G-%Lk;|weqB73xZ+W9IbPMPLnKVG3*ZE0v}3EiXBH_ZH6r`GMeaRD#W1F$23K+KoF}h21u$ca*18UD`*li;WZ~FGrx;ct6IaflHrxI2`Fmi=`Eeex2(bY_3yq1tVOeSXE= zDU9?05jr%H_2AjB0T!LS@bWgoaa_fuiW4`n9-OZRHv$N*|7+A1XFKK>uNB5>kjXuJ z%gbyz$4VI6R7SR_PC7G5SzC9+=XEzF@b22o$+<;KoBno$4_Y8#~zCDG0D-B zP|^O|R9!i2<2~fZ=7YSgJk~!TbtX{qu}8ke8_$|Q4(b|DECK}x+h4DW2HKmV*1NEb z!D6d#aPZ#GMW0xd=U^dWkwQW-zSUJ9^A%Gw_>VpLZ{Rxju0h(4O5_j>6LSgTVG6CO z6JUZG$}pa8nIPqkfwkpcck*d}IiOh*cL4q0F(47~pOpB$tIhYLgJxkySEYNfssV&4 zx4dX;A4ImhOacb#PcF1T1g_{1z1bfdkNT!7^R$W8Mws!1@m*m{I8!1{(oN&4ew{#a z{H>b_h^LhJ76qA7urw#xqEzGlLG8K}VHo0ee zCJ8^N<*_zyaaudU88ye*bVYH05=K+2J{xNaO2FU|@b@5uc)3K5I z10>v)J{ai8HTZUs@H6s?+P)PwwcYSkIrc7F71*gX(mqZss)Yz*q^?`IDH9d}V)ud5mPsbr+Xo!wYd9R?sp7K-Rp?+LGfA%1*_j$$T(2MWcpcPPQWxP zE$RR#K!;LWf9nbZgBY;p_KS$eVYa_2EE2J<#{-eH$yo?LOxi7vGgVR=iqdiKlaKaf z{D5Q*2VvkdbaWGu)AX{)+k$!ibe|G8%!lB}6)4pO+!DrA&WRrWav| z)lw4@fyY&(wD_b{KlgG#i<1TZDEh9KPg<^EYa%7eRPx3p~VPMl64?zLo$nHkoj0H^kQw#MXbv;3B&)g-6HN|7K z$zyV6)%75)CcYxGbjLeR31MO{-T}60Ga1OdFM%I-6L&4Z#fY2siuI%CZ;xwhPIVDe zdpQq>gJ{1&i+tH%>U42~|xzA`e3Gz%L)SF*s^MjPOicpnBtR*4( zX%G+bn@M)~CrhRvo*hV!{POti%C7%;4;%lncb)?Q5Us1qyEi^^X}_@hii%kb#Wsc* z+5#!=4eMYJa9Q54lxPV97kgsN8YI7_aAo8kB(Zf%O2R%_^j0C?`>VTy5R?yf)CdSB zaoqN{614==zz`3%v6CD}8vA`gII6iHaI%fcqbiCZqXjyAYp>FiuL2MJ^gfqYk8l&p z+hH;(g^J~G3P~CXA8ZK=g30-aii0sa*2aHts`GzS-M#jVb}aJ(5(lnKGq2)a2i@~Q zC)E->r^`jmJgLp(6~!P~!Z`zT{X0XUc*t*>GR9i<7sNUv_w5g|G)Hg=e^fw0UvprH}E- z+tGU5Is+Mg$}dazn_SJKy4c=9vj?aM-L;f!VLSF@f9(qYA2a*4hKJqDDsg8wM>jG? zoC5@$=TEnzTnlo~u_eyW^Pcy=l!r6db9fL~#qzA<9r5&y0t^2AUAWTrVR6m|G5((ckw?Jxu4C8_KJzUwag-ysrT-xb~X}%SI zz^D|wOx{~Wq9*xxVrbA%N?Ta01X>{ZR6<^C&Cx^J{V<4?ZJV}r-PP_U`Ij@I9NlmY zD`}yy$Zk?!ngMz=p^6Rm&olDtE|GPa^gyrrcQ)=cVan};?`Hloa5<35@A=O}-_amU zlk$p<`q&C8WLB7X-t~r8PU>gK@Dm+P&^Yc>c>iD3QB2TiNvJ@!$mtwor3=Q-l3DZg zkaK^HPV|%V77U*9ng5tLj3-QAb zD=%PuzU>UxvT5CEE42IWcpohd)-msNVmZIed|}+txL9k>(JD?FcV)6MMu%m5=2lm; zH%NkSB4MD}2Ps3Y4zDRf7G|4RJtsRp2|SeX#i1y;6L}mBx0B!(RcoC8+l0?6#UrqH zJ$zYIqt~?LIqYW1+JssBeOjJs=k{BK5vU!*Y`y~$oJUMxNjG}3vI2(%$E*_od4Cqg>hUZatLOhMne#=i=YgW|K}9Lxl$-2 z8-kvA_19O(2|hoLEGhlfIb2<=lMj1|ENR3d4C9eurV&cn`cHKgC#nJdb_G{ZNP|*1 z0{|!gyRz@pywV`Md()IyqM;NXcyR_d2*z|#hd~#b$vKWT1;tyb@Kbaz}nER~?S zE?mbBb-d76(*z0hF*KQ6k9-lP6a9dzKVvDLs>4JQ(PF97hV$udn4;$t&ZZ5hp3;zM zJAJ2%lCQm-2No&=aAKE_bE#yzK&o#f{P091T-*(TiBZ#NKou1(?!RsU#KiX4Qc|Jn zC4$EdXMgF5(Z#IeR z`&^=-#7%nLO%2ilD4#Q}-{K8OnJ%4aV!9?aw!_FIy<=+&HyWR@<*LLyBjBjjAC~R* zPVr_7r|p3oqkhyV4#VJ|Xnn_rF&fy+I?a9bLBOvwhB9XQ49Ya~0Ca6R=)_*(5(*vL zAGuZI&xc2^d^Qj!%T^HX#6G;;(NcTd;yzyAMVRqmDNqH=OXlJn>!5U$!2&e*g7R+T z1zIyutxz)zeL-4)NQUX}ZiKGiCMBYJ!b8X5za2cLmo*QF8;RiwYhOu8UJ2oLQ@x^& z%DR5H*a|hfm_m2=J2c$#$WR05#V$v7M*uA?a!dL4-&C-6uB;EPmrnqw@Da zhq;*}$iVJi9Nr8z9YK#esY)Ba(cy_^mj5z)zOV+^e)(s{TF1xjwZFurv7#OcimlA` zb0A5l+&?AMAJjbW!u}loM9D!KtQ$O0$6t@KG$8f zq$d^q4ZAqj_SO(k_+Xyo&4kUS(p(p1dSR<4MjkWtDU?i8xmds6@wB3*E2=YIk}3gk z2hEN+T$!{ns}r_-&B4vc4#qmM=0_#rmAEQAtHu-I^KAZQ0;01KR}}Vk^mw9mmOh_mQBTpYGp8h_ z)MbbmJB~0*PYgYk!U<7QtTk3RmVKR*G>QBg{+c~Zjs0s45moCMkFN#3UF5Ytgm#o@ zZVpksxaiRs`G`)fFDD|^AiCRY0G2--JTSS z+PKR~o1W)X7Km8JMC@ZnS;$rgvkc91+0eYKN)4ru5YQZry_T|*QY zg=;lMHqfB~&!N4a)|~1gECCu_!)LL69t%F)GWz~l(ZdLDH~hSP`(7EXJg&$N(a>s_ zp0Nt~G4pzu!_E~5{CkYaO%^54ZOfJ(jUo9u{`0JH0T3q5_+s0MR`(t|J7HsW+FPb; za30^R;K;k?E7u zEig*A%>_SFCN?O!kJNM8lR;l%i%kG`dT_fzAf?f5Mw%ebJp`n|(%yu}S{cOmKZ%F~Mo-p!iW~6DvcA<89-PV&Fd321SLNwHRd|Pt zm{EW$JnjDO6J*qD3atF(4MtFFUM3@Rj61{BS&WV&e(L26F}xqpSXh%N?oe zGU-~{ovZ=^fPR!{1Yx<#E>GB_1G+@;^WIP9MjUEyoL40mq8+#>*(v}?!)ft53eH=2 z+e{Yw5oo;@6PG3u@lCq#c_fH=oCkf`hDx+QFozXcq|52jcE0dDoKal=Bw zKo^x`v-&8$bD%NF@AR`Ut|?ibUfEjph&eZc12*emCz>XMYY}>q&)(m9AWL(t|E~G5 zVys^oNs7ZYru5mV3N{?6cUn)lyYswoLG{5j=f4Y;(t#{@FW7pmp&2IiTl0zw)7U(F z>)ETF6x#nbIx0A$?)qumpqRo?Xw^eTY3^YudEYpQ|1JZMBUG~ENzcE(xAYFFM~>0B z3y~W(LUG6XrTV|myp;L;-skHAF3-nt;(Ags903~A?_#jJkV5)O*;5WeN?bD5R)$`H z>zaikO&>wN2~x0ZVrYQR&S$c6@lT}}OaepLr*`Jp1Rm#manf>}4Kv-R`LkWeMmj#w z_7KGXa&3fG&4}8%Ui#lISsiET+_e2oMRj>x8X|t_(wM(ZE(EsW_1MF;YN?Ovst-?i zY!%oeX%cPye}qc*V*6sRZUEDtd|R&7NnZ|Tfn2_w|AJ4xO3>1yH_}a!bp(wCHG$V5 zYOK1Ds}0v*Sg5W{EkyAlBqOUG0MIEJP^$#2G#nQ1W|O4E&W>EArzPBH*yp0VdvogE zWaQT%*vqE@w&}VlEyVXoz7)D6kg}2FOPLIyNM-j_H1L##sx(h7hSLTpo{*F(%J@p= zXm0BUp?yf+Ncf1Q30L{C7^tW6g7j#q;Q%bPpl`QMV3GMNl(&)wIV}E`aLNrRd zzo0d0$QkvmjV_YE?5Q0-d5wA~st9a58Sv8dikHwMGzd7`r3F@t@JWw9 z$d)yqJTq)ysigncyHSo@QIP|%FN6=UV3BPOEr~O^WG;QE*1@kE;r-Rn0za4E$<~ze z=*y9$Qi;GDM)Z^wMJjJwIfDj$=9khZ&Qy3{^%jq7Wt=8w2A|B(5pSsii=3w1x`B3X zgY_Jgs#3a`$lv_U?<1nC+8n9%DUHLLl`YW=ld?lJHoOWGg^Y|oF4Ie&1^}RzhZcN7 z70z==L(!s5j}m=N%{4RX)6r+sJy+{Gx#Ez6ST;JJJ@Hgm8`-^1kjnHb0FO)|ihZz_ zM{uKX0DMf70Vf@yi5VZei?i~HO$^P|v_!Aupr!9e{f#IEgZnSFl(0s=`s4tBJ!e9k zjTQBCt{Bmb5Ul&a9r+PJvzBiKwBT(XKL4O@6qQp6Cn?gNHpk8ZS9TeZ3Fd;Nn#hLw=b~(Sq10HXMPDsG(9%l7lwwh{@&!o zwX;z2AijPZC9C8pX4h+uLNTnwog`RiG5gM5CgDK*tC@rxxd_M^KCf8cT2j zM-9@OWj6{R;4vFts?XYPry`f^dZa8cUI&;iUafD>T4f0k0drij(09ni)nq!bhJv1I z@?E8SH%FNYVT+iei=&l%l|T8K+fliz(oMIA+J&$%?PMh5Ylk>XsT=h~TV66XwevVR zhQt%g@`DdW17Fc7Eyni1kS4z99KzFEyM|g5XBSx1!?;I;`BI`nL?StJj_M`Pshh!$ z#L+dyHFAklJKYeDQ9&bd=F7U(f|kcR5@Qs>yd-#h`Al?kMz(N6Cv&-) zhs2*KAh8~y|E*-BSt)|)E|KB5j51Sr_T6pIsOPsjLN+B{=^?avpc?ifo6h!I3i8T) zOtD_Y`2D2Or`JOFxg2P!VfcE6Nt2F?sVYl#$v=S!vv-c-Ba&Z%85dl>tB@u@w@}!^ zFbMKI3=ozRHMj@QgE0L;jwRuQkIjt@v4j{Av#>cGIqOzydbq+;V4V|Ax01RxBIYnl zU*}n~B1qqz+Jq{g2yHfu$VZ4P9S@ZjwYI9=!Kfg#hOab;a!ImL=Z!wng=KWdvbY?o zZ_IJqG@{J>CafG{Wv0_-NlOMU$IO!7moF=1P9@}ndE157rKAu z<@~wk^ew~mZ*>4-kZQR|;MSHHiy7et5U8u)D07@nXgRO*NHQ7ovfbROodEWF`|-PP z9r_2QDupQL^_RiAX-Intn-gmN*Wk=0?VUrLCJKy&>nn8Gwr$(CZQIpl+qP}nwr$%s zy5|0e+00_HPZn9_IZ4h-4W}M*J@5~vYOW*Rwu7mn%q(KT2xB#cABJ6G^LEDmt>h%6 zip2;H8+^+f*G&Gw^;wpUkZs8x8vMRM(^!}P2=&GlVFawh>T&pn^c8t;nE#d&msFU} zI${4LjN+zW8*(&^2VBL8^m?#6-bt7ev65eXO1oC+>Q+Lt4^Q+ zu8;Sv3ysXf`^hEJ0L-o8y&(9Xv8p`KvxW8mu+l7vrhL&ST(-UTC*^ATRjwLTvol+g zzipGv>9+eZDS-RWe8Hwg_lh}V*UE^L{(4S^pR1^;N?gwxmQ2PyTqVsUY!!=`lqt63 zeF4D_PbXV)2#MI$ts}fd^9eD7$TJCw@jK}v0pfGHa-y#3DokSnSNQ%E>P%& z9D*-enX)Ljbi1T%EHjh;z-X=Nb=8UF&|Jb!WoMXumU8;WWmxT1epA(HQzy0h3DT0v z3dE4m;f#&bk76XdhO^KGYFFEF5f}t3tTIxKL`UoO(*ht_x~LMFHt>(tf^1NGK}P;q ztDj)hmR&>6OED@$+rkjF{X3F%OC$oAh5(8n$G7L?W$(5>%B`Z7w`N&~Ze=af^YG%kdaLYb%0i&7{<$I*j5cNQGSoMp zfZ#5Ug)>RLOunTl9&Q#gO*ti`a@ER{!Hrt|ozyIYPWXUS853QHGmwaEc*4PPT|FJ+ zy+mK2V1ca$>YcqZ@rH|ES*l)MK>Im!Yo)|AIYrt;G0n}R^TrTb&!sux1}(+)$5_aB zUtSieLjtimrMtHyP_GP{++h&8ZP&KWpxEGlL{85xXFSpqZUz$@f)-{I9k=*yeF#KD9fx7@bHBQ&?Q`Ui0lB|o^R zg+h@cIToMi>d;NlG^d));7~!?02Y)SCc8mYIgm7)HYQq)-a(~nN?&GgvQS}kl&;zY znu@+WF*Z!VD-8$?ZE^G&wZkqsqXNQE0wlxRS7__X3O>yd9d$dld@qf<$}E5CPkG z;?4L(_J6a%toT-%<8lCKDFz26V+J$MZ}-fvo8^@qQtfnwgxN5EJo zbTQn_(&CPImvI3wxwg{td!U{*DRe7cnaCqkB=!$k<0-nx6w-hSgEVuVW=k;&AdJx^ zuCFV>zEN}-@t+8(n4K?Y#q_8g;BWz&68anFtOWuxu15P+J>22a!+yw-4J@B=+tixd zXIb~g6+f+{yWfBo{h3+WpkDIhHa()6=CLw|g8N`TTE*G%zAAOCRp)Hv^llg7qV74&Er`H=4d&aST(0WT zCSwEws^RMN&*^+eEpIR`gWs<$>eYJn4DK$v1%e*k?}pAl0dr@u<>{pKrnMJDQU&O1%(4mc-U$>m#MBKS9$oPrUVB}^~ zJny}7aGktLV}B!80zXie3C$d^cVqIojMn}%7z5L&Pl4?}Hsi?% zc~*3IQI6#ua-c2Wt)-(6bm@fupe;R&WoxYr$S#ki@wb}Y!pPRn7}00JcpMx5LjAX% zb*P3^o$l-pY0c8nBFqd+jW;!bO3P%dxsj~R^=ovUOB`ax!48L9&gf@fOWHGMEBCFX ze;|dJ!z|He!~j~HE~T$XU^QB~EAZxr2kM2mrCXGwtw3jIc3&hl04-}KXQ@hf9$Q6w zb$uBnD!IHOH93+qTN^S4!QcHJ3I+t=$Fr%I7 zyg^|wllR1K$@@42mGXlt?-f)($vCBsi*Yl!w^-7SU~>v+{-X|-EGCkj4HO^?G8Bt7 zslztHZJoOJ;;AE$$!~S=;F_8o{o$#?0=TNjlBoePvvBNrZfMC4kw_|xGno$lAo7&L z$8D}(4$PqRUFqswhurWe&1oIzNTwG=VlSW#wT3d?HtJW+KhJK$Q5K>q3TFFxF}G^G z-hy`(Xo%QqJ%6d)OpzX<;+hL}ovsQbGD2aVLxeq$N$677`l6 ze0IG9Y=n#g&N{c-0EuaM_E@sp#amxuN?1fyQxg8-$|E6$F@!{BAPJBZRZm2d3NQ0L z<$&1z5>H=1Rh?az6e4Em_F%2b#wUcAm+rXuJzYske*r}+IUtiKfJv2zEE?LX3YG#tV(uvc7_)SbpML-DQ6q(>-=COR zlK#aB8OSSX@+V+x%+=InIaG@5xVll9KKoOVL55~M&|Uw)B9glh`lsDP^yTNfyq7~I zQ-H)|CRV`h6ne&vU4mtj(f`!sOBKHIDObyWc9+M`>x8dr#D?`MPytoSzn+_AviM# z%Vlz34$^%`XRdFoW6MU9X0bh_@S|!AR?m7V0EI$$<`HRkvgE9Uzg*H>uVkfEL@bA` zy}l}!fXyH)K>pp<$fzk*U2WE6i<5@xD96R}<~k{VGIY-w$Okj;Z3SOL21((V8AuM; ze>dp|*~h=^ukER3icc1&IXN(onm56)4HHflm9Kr9g<+`vIrnVU1!0Eji@`(-8J!CCP~!g4b%jGGo9*hKh+0OFE>b^?foUfJAD0pp-Q#TSYiu7>2>ZQ zo9uTN4oXhkqG*`r<7#@1Y!~OCmKUyEbim`A*j~TgdGWJ~F}G5)sD>SY0}r*~HK+zB ze*l+xAAAzmMMo8D_R*{KYy7K3x<9h@ekaYq(!2?J-?=-5qB}1xBO;DsUoIMP;iaKE z!Q_Q{mF;_K`(eHd@ELrr^tV= zlm3Z(Z{7ikGa3_M9e+Y)=>(92*{R2>bwMs+dHl!?90C7uYc|3RmotY(w1_mB|^D&^`r64B!Y`iN)gRrlP|-%UtLkFPaF z>uRhZ-^{9+i>THgnj@OVvazvITNmP)Df5PZ(V~NqO7zvQVZiY0`(x!){)anjx=z;F zs*-we0jXQ*$C1s?x*Kv1MtWMTcwQvZGl)T?Po8gOHuX2;MAh2&m%|5Wp!C&-aG2=+ z^x|%?Q}bdyzbp{fcCs`I%^?ax*2wUKL2tSKcDvO=NJ7!ze5jd{8iV8KNd$KRpMBw( zV}bW4|3^tYp-&vej$=3vq0#KwBB})=!GWMp$P*ulW`&VOR`q;fW&W9@`G=I9jIt_` zScP3uYH?vLH8Q>lbPI=;Hb?}}k_Cv@Vq^$FtCFSV+nrXdlZZ1hep|d|v93j3M04T> zNkGq#r_iRp>^BQt)BVw=nX6Q4g#C9goOLM}fMS`tK|eCRE9pv7kVAToW%koHsXY$zmuHWl1N8-;0HA(&m};Jl=KDwYz*JU&==qfCG7bE%{p7{(H(`d(nEb22>0g?4X}<9_6dkJL-884^S_ z@0*uH%bm^_Xsj310k%1vpEv-EC3NO3iXpeJ;Xt^=+e^Lu?8x`bxYEhlOryht4&sRx zeKs&B;XIRT|HPT!PC|yx)$AbilFA_-)IFWa<^cL)E@V-Xg3RX{F1^jTItF%usK>A!9cP`AF}_myM9Q7PnJDfU+)@9wyz+jGsm$RH&Ysps(94uz~|ii z88mCHxX}GHJbu#ypBIR#0qKh3O;z^CTXrbDcO^-WLV=HV_zXeQ(V@?vc0A7F%x0*Y z7imLI({O(W7bLz|M{obv?Yft13H{>9!~g38?kN-aXe0)v|}x3^~Y<2Zwj@u6($ zNsV}I-2jg;8d&l1eQzB*5rQ}Ye9*N-4erglEnUIkQ$Y$gHP}QzN^FeqcHI`=m4^{v=^Yw&!Pyz_Y%DCXRQ2GD&5JeV1wj5I6U7r*_{ zN`tn63jX8az_5Co?30G;?qy`CYoSHHR0|S9_fChW=;?~291JmO8H9q#JRAc21A)*hn!`JI|Lbo^-}f;R;U=(pKe8@ z$s32f#L(G5HJ`C4K8J^5RS%_zm5<#nN3+!-I@o#MrLY$CetU8$uFtSSeiau^IMT= z<;JCxCN_XZw=pk$J40`-%$opYRw2f5$F@wk>mb9JcklBy9d5Z=o{upfHqz zRoeN?93`a+0aN|rxUJew0}0>zFf*^ppDqXSK5Hgz&cj=60dFv2{*(oNtL+5 z*Kc7l-G;4EAvI0KU_9X*QPOOg(`S8}9(P6J7FZNbHGA5{FM%Yo_Nz}lNKGTSi6af5 zGIGRtm`pE|eAB(ewa}sdm_GdB2M>q%NV01g>Z;^h?`CUH&vMa5vyJoa>RUjd<355( zoz``3u4uPB!$jPa+C&(2@E)6Hf9nQXxD`y_P^Twn+BH?;68X(zuDE>G^NGxC)&A`> zq#E{3v(J0V;a1fZJp52dhA(d-f;@PW10fN>d9fcxO0BEq1Q{{ufX1)K5ltPr@{pgA z53*w6KCWD%inZercxb6X`BRX^w5e{z+znOrm%gcnQmjCi*3=LK^Xivjfi=*_0t^~7 z9YzG*%(?7UP>_=Ch;{X%TG_bcInfY)?T)nOZ?2BjS$2-e$?n#bFjK$6plT|FWGh=sL0>M$#Y#xj0j!sM9( z>8JZmfSdD?@5yUZkH1EvTTmct(k7g3?ntBh@^JL6>>4*KR2pR!i`1z_z|&y17&nb!g^uK>#jVU%!x-Sh@wE3=IaAdQ9#qP+*%Jfyk{QIV+46L zCJv+7KL~}(=IeX8`mLF%qFO`*R%HY$JH$e1qH2n#{v*K5f*QEs(tbsNZAA6gl+odO zni+xTP%`p`L8cS4$%(TZq3xc7r@m0CzLs|J@(U}(P8_gpcjrorvJWQ~C4?FX|EXFH!`h&w`GH>TaoYwy7R_%w&UZrou>3 zD>inyHVt`pYW}J0mct0JWv3zFhk8OjYxIN%$Dw3174=dr))! z?T9Cht{a0{eR1WAP|s6Cvr&>c(xV)ng@GEk3o->LI+U|hRIy|cs+z6lT`0hC7nWHM zQOTf_9mE@Bh)QAV#Dqu}{?)1nwSI=VHoqijyTcPHzIEs~-=>nxW-cEh=(7R0DOe?x zHcH$Izsl>dSfqs+oP)x6@0Bq$Jw>{J?O+jF=70xeNf+d?t=RL`fXvPM+5x{lIAK#N z`|iC(#LUj3l5yO5M8?n>K>vz;FMY%tU4GfN$ojH>9lSG}v#|sID`C9c*o-|E=4Laa zA`q|H5ItwfEnYYs`GIl2`o8RTrPL?n|y%r=gouigDdRBr8-Juz`>jZY z6wG{b91GSV^Ao0b6)E(FeVIYxxw}CNM!TXFNztLF+e(5moIXRc0TkxNm17Mx zN~{i0N@|+hvoYXhcCD$iCDk;U|GK<=#TWI6(}I-PWk*lINAi(|3nf_3IlZzF-}%np zeT^phF=3OuCz9ek=)mcn%-_4&r-+yr_73jr;~^jXNHxy>TM5@Jvt3k81Ju-~oKbm| zYyPHL7>0x>0X_jmyJ$7Bw|ZHu_8o;l^|OIZtuu>R5_^G?53Rdr%Sb{hBXKX?E`mlQ z32Q}z4{ON(@4NjK=|FW;at}^V9IY3}NX2@f^nAdrv-;Z%c}>}+0Mjil_pNCH5u#TZ zsM*(8!3hlMufm_0Cb`+thr0quJyRqhj5;6@+k%d`ssHX=C1w4Pk*@9pncRD+reqvY z9X8Y$E$$~QJIUHUVOc_{iu3ay@vV2b(^E$Bekf9Q*YQURn70?V82+tW62}2DVTR>d zN97*Zg+f5gT~`&7E^PwK)qOl0$5U-6p#QAgn}NyNSepbfzs%8-V_QixHA!Oo$blyh zy1eJgCM2-ngp9?Nc{oO{Y@Zy#ibyQ^kd6%xxaGphp=CwdWFD(XF_Pntk|m5~QN}S2 z5BtFUSXemT59M7$f0B!Mz{hKAEb8|)Y^TE`hM*5(s!v4A+G$#64T}9_rs8omE3>A&6aR*C-N|;4KvC2H@_T96%g*3fU=mOoY0kt|Qwx|t!aO!e zKQJ#Cp3B<{-}L|BfXv%)%#(A!Xh-va9OFD(i+t^6@>Hp&ILlV!tEF5(dPS1jz zqdM=mz9Z6WRv=M6K4R;TS^5o+(rsU`n!>3y)Q$ZG_l@pt*u%y?S>T9eMye9Wk$4ws zX(uI}=XCDW>nVC*_b466*_;}u)fZHg`lhOl-wmO_c6omcJ%=~2%7xki>xW~d`O??c-vGW>100q;Vx91aAFp#&)@-pTqAwM zG5J|6|Cg=s)huT$ZS;a3B1 zfa_=DD@zj9FQwMIhU>{!7chhl4h3c=#gcj8)VMU9Uez6l?NgKR87+RaIM~^QOG75f zz(^Pj1IK%R3%Cb(ho4MnMos3YCseU%ef*ic4$LlHv^vI-4IXQi@Fb=uFaRMMun+^^ z(NVaRPqv?jswITQm%Y?mgZ#PlJfo}pK>@#yiR#s_q#HDS`GwQMg^{KwkhswQwbH7M-wjP|HbO9kZ`nrQx)1)}dkFvlH zopsa64qHoC&e!~HY;?M<;*5eC-fvIDkEnVSq!f&<%ew&*U8Q(;S(EIY&(rmIxEWUg zpT=tSVg&hG9Oj=ldxTABxwr|vI3nDSTtEi<4HB<}ykhkKP_*iWebFefP!oAp(RYrZ zhy~+kVVsZr*ArY1){=#BCVazBl_@M$)d38z%uu(uSv&hzLla7pW?NC|*4zUGUmtRL! z=;vN`E`|&E`yC0%RWdq{8KA}9>RMzf@I4}UN{az2MKEn}&U8?QB_x={?bs2SYoK-M<7%m5S4dpo`i zDWJ#QLLj(;rFx41uLj00Uthv{+WFfNN+*yh>{tto1h9*;JdUK=X)7W#1Mm=*-Woy| z>0zuZV)sq{_%qEV9L3FWdB>zt4rwz;-9xfP3ckJq@;MDo+0AMJGJ*;G2|)|Qu~jJI zDP&0f0)S@aX4*sR4|Dk;3Gd^zO~U_7sQ{$w_#xoH0*2eWgT0|`&@_CZMMMM^6y7*j2z{eWWLjA>OaATMlMb8H>&RJ@P1T=6UVa zyxj(pkPqXf;`-O8Dc`$WbL1R--d-MQ6Y;u)J#BCgfUjsC`4}!FNEf+r`;F$7^ws<8 z@aK;4W6WP9W^30EnKYCUX$NG zrJKph3FRqh4+5ZY%VjQ2I>a~kSdtCXnE#X4I9;kup!2;u>5Uu)u*uuHbDnYKTxaH9 zPM&V$y5ZG%8UOt^j5c(`8#-_}kWz1Unt-lAO5Ip|@~GX;omQDhSYuOaph!AgC*Ofx zBr2Ej$>duTRC^d^%u)^06`s$X)&9Y3*!AL>@M>uia6TyZs2k2tB)e%I`&S%)s}n@l z%F>kt|DB@PNjk?9UK$fwE~WXXOrjnvMt>{?*F>b$#i7`tE6CH*r-AiDOzeTiG-ldg zUGf4MM}GLWJP&CkPjwyVpFeK1xkE6IhudqLH7B+HQ#H`Led zdR%41Q`Ytme*&yK#_HI}$T^Q0&OC%mn z7vC_i8MOl9tl${~tK78?%^+c(k4E)wX;qoTUs_t%5SNq}N~4qa0n-^+Qd!+#_Lh~t z(+TbIa4Px5t5E&S7MY<3DS^N9e#=dD>FD@ve1mHyo+Nf?*y%2?F2asaW;UKaNUv)P zYPN`^LL{nzBI7U*pCf=&nKUEAt&rC@Wf$xyEwV_pl951Cs^F$ z`nZngTyUO|fy53-`(XxHkZ61+D3FwIMD~^FK%;I!q%0KLuxHkh@LL>r;4>j@&V+Y) zcYpeZKJ(-&Lb(4NwJa46ME#nuLb^AD-&S{{)s4caA>rn(EpU&|2D}QE`p4#ct5Yrp zX*B%as>q>YLw1@2@2*!va_nH#O#J~Uz(7C@|I2{=U*lzsc2|u z|6B6U5rC2Be`&rgoh{An0Oa2bH&YvX2U}A+mv4ywYeQvIQ-F(wDZtFq#uOkTub?R< zCjp?8kW&RnnA({-8QK68T#aljjRCTj#-?`8rc?kkdndrR;GYe^*xt^>@}H|Y(|-pc z*O7iVK9O9vOgw^s#G@&Aa^#lq0#AK%WF-)exp+4o5k zdt=vsa`BC2_z%pt*2U1$&Kclh>hUeK2N;FI9dKH3|D7MJM;gJ zfEM6nYHsLcVq@y;{0;Ms{ZDrO`=0-p{@3jd9UN>t|7C6euT%d!21^%bQyVjS7$)X# zpT;iVzRfM|U>N>s6e&A1djJ#Tf5=T-9sWz_X6p2>1X2FeGgRL}7@FAI*?0m>OwC{z z(`Ttn{U(NHsLyNoG*vJ{$ zemB5>5Deg(VVnW7fPXl~#?a~ib==U_(#G@uVDRq;)lL6{bpAhZq+ATYJ6*`m{F@mV z>Azd{pH{SV7Ps^;HBqp1F}47h8QOf4z`x|Gb|$7yHkNj#-y{1kMgY(;u`&IdPQ}8~ z*xK%UvH)!V0cUDw@^7vF&y4&lbcTN?(|@^9_?~GO6;Frni2egx{fGTGf&Ay@A7f!* zdk=s&9TNvDfR34y?R(Z3nE+gDEWZB-NB;u)&mjM?{bA_hWa$CW{=V(E(LZS1aO9{|Gk6A0)u271|`pr7^z`(?v2op?Z7o9)6XpDl63R%N_HFNx-9 zY4hienM{Obrc0yKR!*$#3)$n~E!gSJFjwPxS@;F@Aodpx&6a_7>^`~NrkN0(JkhZ9 z5OLSLk1EK^z}=xH4G$o3o;Tz5Vs0TjqP)G7c~1a>{#U*NvtkyOMWCH%$Wbp1oot$K`Y+OI7IWJy{Q+LQIJr_Bx7Y}hd6lU78|_s{bEuiQ05quB;W{U zHKCJxqTtRB^3%mR!d$2k+hXUB2OfhG9`xMk0~EMv*FhkK62G@&a(|ouKpn;W4RBlp z%CpAH`RRUwG%s^80kUg+%DKJ`ljItkL|9O8m3@(8eU;F))yb*s`{oXPG2hD+li=U* zgliyIZkr6bPVTsskjN!YQ^bd zC=X{b+Az;Sz#@c9ZSXWWzk>WP+uI|hDc z8kbnKSg5vEp0o~~hTC4>4oJ9p&k$HN3;@2s&$FsQ$$CKiQO+N0E_@f7a1?&Dk3Q>qvO8k9eo#zN8pihw1 zQa5mz?^m#@dI7VqzVdmpSQGT~aX9ZTY8<*Xx{3 zYPfB%6HR=$*a3p2g8wT%YKz~cIx;H@S1R-_zd{zZ>SweU?#-Lc@XDmRfO+`1S&`mf zBjoq@&ji)T7H-a~uid5j2_w4`XM~7J;i8Y}hD{#XrE665o#0%YxEoB9-N9i(qX-_% z9pH11p}TY%ZBc4LlR*LS)fb$zwzL?_QNQf9`7W)4-=Sm1rMcw$BI&szWTmIvC%ScFy%_&hua35oc~Z}=j793P3CMhqK6a-?&Iqry(+E|3^PUZ| z7q^JQ59^fh?h|Mr(N`o^@Npm$-WYtOQvnl_4m9YEQT}n-h=p)6%2unsn9Nf&R_;~@ zORFb#_-BgwHO@v}pg!`B?tMAq5OKNskILoQ=zTooO(mbfaZgfo*^b z+1gc4`bR*Et*6A*Gh1#|i<{}?oJ%Mi4~%QU2xd8W^5T_N5%r|Q7;c!ABqUTV?EOkZ z&7WM548%jgCMdgdR?@rL=ADq|(n&-*FHVs=DaBiG zFs?&{vaZ722#>~nX9C|=4i6Y`<_^XCrE>ITKz)EkfP+YJ*b8voA4p*(($Yx2`&kuC zGv@#f=wXEc&Re~d4r#&Y%y7mypgiR+%9dp&CAO)|KvG6?Nud*B!&%e6;@&{DoX)Uk zTqsXhdm;4d}2FdO+p&_J>m~KI3cvFeRCu*F|(0f9n)7+A+*A6bUiwAN6 zNDm7uY2?fv$dpNuM6qk3z&$ytbEu9dPvNP@#BJ3L_Qu6e+#!pail8d|;Z(4Z&73ie z@AM>@29xhgHdmjT2t=j*!zL9xjB937fu9R8Wzah@f|(3f_F*sDQ%HS z=s8%>m?xQw6m7$kK@*JNY0HRk$f`ZN5||82%xLl~VDMaa3|$X-Kfsf|)TB<6`0AUUR1st54`FChr# zPO;E17*dJ9#t+H9Y=0eT9dYWw4Di~dQ5=-A9S~%Y- zMN-LlLIcso8Xa1C*z)MtOv~;2%lnR18tNT69!TXK(UG5!Jd$qW)9ndM2_J3Z)O7X* z2tF5&5rm_VnPX*dLF>Gv)Y zX@&L)<IvBNP1B6+v%2pAYT%69&uP`@PcMzhCSkOWaZ(D%Blgo^Wqw` z^o}?<%*tL+7Y#;mVZaClhsO3K7YFi{G9ckB@sY~jCcgD)Atmj}j)LI!Tu5CEbx5v@ z*86b|Bsq)37gdobK}9*8S>WbbR4{B-7JV->T(`-YCBv`H7%yxHmF4AK#LvoZ4I30X z$(Q<(;v83Eup6GUAKJMk0X&e4at3_iM0iXgiZc3KH8x7Su<|88rXcPDVz#rwX%O-^*t}khCYFd#1n)B+GZmo8hr2J zV6=r87;s8LXHZD~*k5N+*CAKSRNIPP562T|(TLn0TT16KajJ~?S@`jgrQ<7PiqIMU z@TT?T9PR_3#M8yVAG*XsmFrdml&H4Vd<&zmqO4W7`{7*ExXMp{jDI1+F-b@|@;(*5 z^s8no!Wk{M_6na%ykVv!YZZ-A@yC$sgGZ@)_GTmW}5x z4vINPnkSO@)uQkCyCuwz*K}9$fY>~_?iODP+Q!WCT+tf`SQvW45lAs zHn2AHiWM|UuAsNu5gwJHj=|TtUyo6|f#W?dLrTZn>*j-|`<-CPPhk8&AiE?#1I#ht zf;8Qgs<*F>tFjDQy3WX|RHc#^C_wDs@L1+Rd2C29K_ zc^&-7W+93~c06rVIfB5M6HhOo2CrGxIfF3R^cqUr8k@!|lLymuPsgoPoi$HtDqW)7 zAN5LPYs+Aa)K4aN_nDIfm&UO8up@g3?wo(G@r_%Dm_0mm;~Pwfl6=s@;e0OqeS}_+ z^m_^?H!G5}XurxA4AnQ%plFPZ!~|vl8!GnN#rr~FB*28YDLG7G5mH#^r}eL(XoV0N zkBBO#eO)m(kmvLbwPTe0=}C5*UD0@A7*Y=$>%m5>0CVdHN0E5TxiVR$*I~JCW`%3> zx!N6yjejS2cC!Ru=$64cOXMC5$D=I@PgZ8hKOpUzsy$8_5Tf|mFbw)mjp{!(SlioL zjD^2r4vpS#$;v;Hl>akQxX~?{VeVQ{%V-_&$8_A_58F|t!){#@T$-Z>g`-AAw_T1Z zs{|%eGhDa1=N?leWV;phxBix6bMYQo+8@l& zyEy+LMP!Tx5Pih>kmQwd;Z^a;RJ!Qt5MMWA!x6&$C@jwER4rU6L1t(yWVVBkku!;9 zY&Cyy7U?R5He%IZxO!I67@(JAJ3`55R-Hx<1U77NScyyew6I62!%-&?Cydq)>LbsT zr(wc?{<`0SH>@0^6!2ILTKgK0$lf$b6htTl+C9v7FsHY|2k8?# z_nO9y1e00bENI~9-MRN`r?it-c7QN0Riffe?9GLp%}{0OnAfXueHd5&4Dd4}?;~Rb zRo~ac0>_l89PjkjVWE2OSxK5*D=9_YUsJ7x{tMQ!o?`(=cBvS0#EaHcW2TK-WsQ#f zb6r2T-Y-_qH+cx7>ujHH!JNUHABcSG;3B>z1pvbcs>d1mX@w%wfmP_^>)cuX?w1GP zwy@^xY{msW+CurIo-n8}NFif`7#1PRYUs`0de%edz_TADzh%vK1NDhV0BlLMG#Ly< z46Hb{Y{OI!;9u>@L0fZ97Lf?nE7ZeSqbJ;00-bhyBE<-tKg%8EAqs&temXsELO4+s`H^F0&Z*Wt90D_$RfS z_2!GcWeX3(LK_seCng2=lokzy&q{lCs)z39Yo9r|;)LE80{_V5hkF8^=Y#9p!5lr1 zK2Z-zQ=uRE2K333YF}1oz{kNTjufD3%VM%Rp!Vze@hy0p?-4kpUqC30Gg^v+ZtV&& z3gHXYVFV{Hb~ri8D<-U5Xmg{jO>tWgtoWioRLfsjyB4n}adXBEoSs|P`m=1AH*aYq*LE*J6LoF9AvKhNT@=&@By?}P)7{B766&@6SMLybR&1=$>1b5 zhpnX)RBqdI^JBQB{|vrCN)jRV&HdT5NDKB)7Pt7y`xFQ*;*`!s(fJt)!VZ7M>t8B} zw2)gPz1*f|8hFNP%)IOQr$J|iO<@WZP`yq`h6@Da7ucA`Txg%tlptsK z^LMPu6C%TTv<6z>Vp&}6P4xra)A72 z*S|@_%55VBZl}8bW|~Sv&vK{72ON;fi1*?TurPK+T!Fj=BP-NGs;^Q)X$4(;7C)L& zs3h(Uxu7@3fX^hwL^(Yq{@Q}rm5o8B;EvW*+{(cUD_vjb62+w%bGuRBIxgyf*6$+V zX&ebnw^U7sQOkn(ZP;n`TJ~q1%dA1UTbzrQCYIo{9Ok`d*wK2iOFugE7>Q$n9kjFn z>~2FBmZ2vP4yNyg>eiZbEO|-JBt@-_-G{k%!?=dblK+&q#yep4OQ1-o+NuAVP<+3z zy$ksZrpk68Z8gC+{nlFU#Qb{)NL-+~8-w`y?X$1V$9n58+R_^iua_^@%JI~BOEw@F zF{+@q6I+x_G1?jjUn?pbgdiY@{zjv%~EB1sxO!%0M=!9JJ#F%AF1h z`h`u&9kkzSZ%_7v`tixdyq~zYpS=n^#ISJ(PBf03hxDOcRX{D}${r-!6kZaZ2$+8r z`n9DKRh6}ct3!1~4&;7`tQ1<(BrP0ynus(7Cl8m(m=HkA(Woz>M6=4h3NccNn&Fou zl<7*7fUqic41@+9Mc=XNQ_7mQ*sQQskXP`8hv_lRIL$s%QDFJv1KkmJmA1ZbLu(oF zgWg8_q3`v1Rj%@Q5ZG&TV7}9zKySv3w7r-)NLA#|N|q<3{NUb+%z#xQ%2_%;ujxf!=a-Z`ErfHD#KBBd%;{3pGxCNuC!CF-57_4 zs(0-pWL{~wOmdQV@LEI*k4XZCEHeY~V8{60jV#dFF2GFZ41&)aJv{x4TYap$!GyEz z2grkA(nL#jilmn>A>}j|?$wl_8(?o&zwlR7)bBsqqBhCmkvu_KtwL*q=1B$PnGe&> z0)Jwi(B6l5_Ixf6EwBFko;Ch#2sG_My@2%-0|)Tr5$x2tB;-;(%~TH~Cyo0y4#)3n z-%*PwrAJ5tU$Op{2hDfUHL&h>p_^hmA*7zUG0(xAd$5FrGrH1g@Ey{(C79h045R;` ztOCDUKomGsnSo2sJ7p^laCm=+OgQ{YatUK)aocN9ejI~$IqHjigemjd7jr)3pe)9t zyeIdbNj~bhs!9EcZxa4y#+xQcm6L!UhydI)Vvk`#mjmK=#E5iM=$8?JN12$sIv4DE zl#@geNYAtu^JjaTEs$pwa+dfGm=i|=uC)PV5N{^ zss-H)u79&qHB0VR%Z@CTLf4=(;#99Iw4v>~jL?W)jmhdo$AK_m30*oeL+Y1sf^GL8 zWeY?eW~e5sF8ik1<&)3Jv_05n2Pp0JW|{voOQ56_MFf|XXv81!!G#jdzmj<1?SDrR zDVsxKWqCM6$|IYSeSwMzhbQVJf!m4pjqpwlT30RWEuhv?taMRwPJ>6xra+$dRqxS0? zHFUjcK70|ZSz^9sgIMX6)QPwXiU-^at|o@~IM^WzYrZ7W^Z2un(t;5#ONuVim56{mPOm(%cbHbyjwsyc+@@SWE*lb5>kEp8wk@@i9KEzj&rj z-5Mdn3B-PGpp2S4f6vP4?)cl*9%1?M!luDbg?zn*;4cz1ka{mFG2P^aw9xOSP3Krc zKw~mGfvv&$1zScUPmcKWF=a_=-lrf=Hb*e`M`K5Mt&jZOeKj`D_RGUMqWgj&`-FIV znefsZ=0-J;zajh4v@WD?`GKExT>%2As6UrA5?97`eyqGos7d>H&#HbUH3L`0|9W{ZM&vg9oR)bGaJJr*%%#;x{rXb za*|J1hIy7{PZh+N3P;g`JT&9c9Ug&R?;8{Q4;LC}NjI=@EEu|iZ|Bz^Ind=D)7p3M z*>{gm@V5HabDJ9<5?MTtm|m%~V&oaFI_6W*@50@kNMGaQu^BMwz}rF7B_yN`oWo-; zyGllBuxD|+s^s>p$bxccKGmgB`g&a!E75W7Sn$&>&juM2#1d1adB=4oBHDSKZ?SVk zM2HQ~AA~TD`k{9Lnq_TfdZEbmbMKwD!3AOE>SqV&{TpUF9sp$74w3 zoUZ;9rV|bVa%wJv@mPL~4W1gTD#`H)0oAt}<(DE$X4a*x0YTP++LZnSIb$pQqj ztG%tl$^~xl;`UjN%_gXg^@TC%UpQ?F03Dpeaj@ z2N#EPK!is}p-WisG`kCswGt%n)(WR1W{s-XLa{B)IV_6VE&@dKu-i4OBCp0&>J@ZQ zU2zN?$mbfc+yJj_MOpOX+NJLsA>wRF?We^NSs&<+q!h|H3dt{zclI4{uO4~W(L_6< z7fn?mv|T|XA#`5bT}T;mlZ{7o@;ELpsJ0a;r zHC31E73knL^wrUCFnPT>e>s18{M3pILHCB;(JJ5;_&I$!kn%`1r&)D4hv+ifrsZeNv;YxpYhojZP zs?7S((dJ&)Ett)j!A(pyGUqX1_fZ*j^6_Hrhq(dGF|B=>(v07$8+*;SAZ9m6$Z!Ug zbHADb_~n@Ab(qx;bV{lBSR&i3WjFDN)F2vqPuQHrzkYsPcnl|Q`|DJ#lcu6%Q3iY5H`^A(_ z;dO?c@IDax97` z=jcI^*3{Zx8n>8mVqQ;s#texULH=sZ=`5Wd13j&nu-aZ%jI0Y4B9zL2o{B>;E4Yrgkup#*=Y;)!OI3y-6gbV6%o+8lnb$$>cB%Q{-*jn-cgK< z=u~6RC3NBeRcQ#=SeExi5O#MEl#N1V%8c#jsIe{%wbFTvMStAI8R9J|h*T~N1C*vD zu<(>pG7+(b##=IPQqwFK|yzFQ*^*t)J}FjVJbVnLYg zibRuUKPkq6FU?cw3}~GdD_@ez-2bLWhtxvOqUwe*v&=iz(*zJmKPO^8){aMzMHI{R zf?%E%5qb@92PXMfH-eQ!Et{6U2Usr5KEmst(r_d4?MJ~@9b1cA1o)6dA!FRKmTtx4 zQ2y6D9@zcUY04f0FS7iGb_=gLjO#*}7c#Dyd%roidsHwB`E=lIEO1Ek{;aYK9PahC zlbeW)elpI}8mI#4lyn!BP{TX*!i+*16fS5~9Tqa{M7V?P{dN9&hI?gN%mTEvcGlo*UGY zJI-P|B_VBk;bwyd`*o3GOAi>3(N5}5 zcL(1;q7#LVy9@AdS5E*IntAP@7UBe9aSW)i1h;aWM^y}Vw9@C4XKM68;~qhd|1|TT z+2$$&pQVn!yZi#qs$h(PH+(rwuh(4kJixL}#($Cy0w_7)O12W}-W0mx2%U9!VTfv& zNO5SD8-zLNmD!b~ww9YUCO(u+=%SY*HY=t zUEN+lRoAx=0*W(FnXSK!OZ4{HxLkEh$`vQAiI6>@0U+7Y+2h?}v8dH=RnundVK&k? z?@jn`cLFH%FUuGE#kaI27tN+umkb&y@Q8tG9n?so%^1T)T&9d1sgLrA2Q+rC%$GpT z;-0(upJnp6YVXYiT=0Yg-_x zuc8|Co(>)_CYg7kAyr=Q?D*9TpSo39xs96njYl~9CfUglKGcUYUT;4d~S3PDZ5lKt!*$#z8wLRRFEm>=^24hSVsLKdt!XQb-E zI0?1|T*hWX34)%+8HfEDH8~4ZgVM&T7e%QYH9yaXV(#zls&94??y_;ez1WXa zN1&FkMJJ+`#>f`-_%J~J1H_e59Z+#cmZx4dtg%464-s6V6V1b_SI=%n+9mXIn|j=q@`25OibukW=1oC59?vu|gQnKn>_xtoui;LTNG z&+sLAy;_n{dIY9_8CXb)iyu6HZ{**JIy1Ne507gMGSpcz>VrgWPxF zRuONy4*P^-j0))d(>%LLiwi~nJTZ}(kG-!CAEt=B0dTL>&>Ri}-A;(`&Yfld%vDeu z+S{&|BRl2FiE2?kO!_wzmGa+n-|wYM%}oovZ7-=@2!t4WW1?K4h<29LdQgGM{;h&5Wmy~6k{*J4#C4&I$JU; z@DkbI`rUfEDMnl|Jk9sLPK`e~SL|dQsvF7eM34ML%(m~;Vv6c@is&WDe((!*cjg}E z3wj!8jfrw22nK3AeHASh`54BGWXp)w;^ofxm+QyjB8*q{9cG$&u6(Rai8-H%3JAZv z)4^olMPouV4Tg7iS8D!PYD=PX%6$T;mM3JuZc^2I*xin8b zo+|ANa-*sU831P1-r}e)27`$fp2ISbb?Sa1H8yv()7d(fSK%QafpOvOf2R}uV0Mvd z*Z_Sgq1K5t|+_u#VuHR2aSai_r#-^F31 z3Nqgo6W_P+5vW~UV&e{d|Atf8mDpT>Fw-gN3tI`-^~*H4-I#4(K8a%CwwzO2q5XtV zyO;hr*_zxwW^P^+)l8BhnxoD@$DtvNTS-fetk5Qtx@^H=#enK?r|LO|v%`knA`^_t zRmVO%@>X9J>HRMfxmfp-@yh0?0TW_PPS5v^*}qv&5?)w{cZzC-u8@)Q54s!ysWZK2 zNE4003}>9`z+|ujL${5??(|l$e_#V8l{%{Xf}G$EO4V2KZ%mw)E0WB%rFuz@Ssb)e z=C9n*^O41ry!7V3T3EJDk#U+VVXFJt_M|k$yN<*{igdS`{Om-al;Sn%o3(gsx@Dvy zt}jJv%&I7lSF=eE@kk<5&VHDPali-=z#QW`J2DOkl9lIr;vx$k1PWARYW>vH5?aoL zn6e2R4_C$n*s@!Q)+oHt56gF(w9xKez(%r?*?W{MBsq0Tn&Ys2(GxZi_TVf1CL>pw zxMCFn^V1?85Dvz8`qU!Grg<*I9{a2{0mSA#dM+mKF{}y~FVX!r3%e&7ydSzgs{<+3y^YCUf8|Vzpp*Z|) z^4JvDs_#>z*d6ZL51z^X9oprk_&H~y4R95Ma1}oxs204RXSS274~r;799_6}hl~Q6 zo>`GQaqYb8i6c)vFI4R*C;>Skp?Y$GZmESveF&p3Pc^)28+)I&VX9fZf3syn=Mw5v zU}CwVIneWrg;$<=p%Nvcp1MPl97rP(RFcdS^!Thfv z4lp9hCfRv3!F*7nf~z|+O%MST6j3s~b7YE_(G(V)Gxsx&}CiFeuT#lT0JVSK$^&xURdro1~xB` ziSdKB^hq3z}0)MqCW+sClD+E*+%%%VEoyDMNz1g>yGU?bluPPA{Sr? zJsRN(d)Q?v(hcL%CB!CB8CE+LTDC7cbe_53S^?n&dZyjP&*YE!!yD^$-e78csD?_$ zNX|>CnR6Ylj%4!7QoX31ic2-;cXlS{dg(iV;G!Am;0mX1UBR_xh zZR0u(+CAXozKLkIzft8d@=&{Uj;AKcf}`_;Lc?k6RbgI>MMsM=EJers>k@^(@f3lY zA@Z3rckez(YAq^JPqy?#=lF}ok1Uy~0~hoqrv%ea@8kT}?%Pu3ta7Ama-_kE^Nq7> z>r%MKly{#hk~i-hI2K5CfRHn?;7|E6wNIv|yIFz|ik3Zgf#5q0D(dv2bZuC-+l~>9 zhnBc652YqX-3Z8uW~58#d0ppew&C#cVMlRdDKk4imqC1!h+|fEzyEJFNPUuK(8y(> z@HdbNL(&1_M7nu?tC^@oU&i!(+Y3g9^vz{VjI|J3 zDsSY*$MYcrqMK!IM0r)aj<((IksaQ#_m>;vH0_CxA5p4%XGK~c9343&Kz%GYCV?&{ z*1W|(*!U?aF6^)hlvDGCZn`C=U4FKkk9^waPPi>TkJ>T;1~Y5uN6>5FF3jfSzzVY1pu$!mMm94YkSw6bus!^ppbnnoeNWx11bU9x8Z`I z{N~>@H~W1#s2Fh^eeo8sUe$eDmuNq{*^pzgo8VQ|s~| zZOPZ!P}P#FQ-dEr!B!tTwPf1Z$UQNzdgkUFPmidO5fRSne!_PXH=d36;64PRSZ)Z$ zqF_Kd7-1{831mLm3)Imuq5r&h7{YH_c4pVTwfjW^i(Ohr9udM~AIOQa*cv)*|RN&-Y(4; zrR>)$^fCeZO!7^~xLXBLw}C@drJdO~aMF2h4T@Y|`fUeQcLGgRSaZ?qvtdg?L^{Fd zW!O%*loHo;X|}a6iSswv_fv=i*Z2};35!A(^nUpMqOgX7UlF1#$~V`{U(q^qoyjp_ zqe$uXkFBz0*)0RG>Dxb%AMk!T>5Eb=gdKHXOdq$5O!Ysv@$J$^M&h)CF4US`?f*8*Qx6?*(uyS>By+mq|JXvdf^-a{0U$*rkf5aka zRn49$tuUdC`uk>on(Jmqk?JY5HKv{}19L3Hx(WET`84#5eZbf_NJBEqLXfDRbXycD zjT|F7-MsthR-`WOesHQy_%ne9hV$A_NR_)p{Jm5gnji+QrZTXgOR{GVTq3TvJhm~& zk>sjBYWbl1Fg`^Uh*WS+w*i!97Di&EqnCMo)ZpHBU0>d%ha+rwD26Vvd#%$)LYYR! znx&VD4OUnjN+eOb3h8H=L4t%|VfM;+9z9ec(OGCIy&=}3s)M}g=UyQsz+OPZw>-#FEW#8^LfMb6Ezi zHtzC~W6z}~pa33Q(qqzFL+Jn-2Adjg*xpHe-kBiYqEnO6CyHxISQDqTv~G{a{v$si zjkk>b`{mdUP1JH_th5y)*c8(+cMJ+*+-gji#e9|k+ss+^D^ru7CPYeSpx$CsD{Xj!g=~4?N*O>u41S)xBOOBZ;AR-EZhmetRgbyflwjLq*AMFn=ms#q z?=-=+z~8JaGGRpa4lla8M*&4!7h_bQG{5#|(69lA#k2$Mu4l+x-EI$*6wgNMS^NpjJ542c#}U8j1CPxYxj9#5=4wQyAm=v7hzl~MjTG@q|4vTW zE>w54oxsFjIw}ebByJLT@;wUM>hHZBKM_5(7%#hXFi(a8#^vD5bp(HmX$hR9+;SL>@PlP(0N>rgjXSY#0&ghn6opBXjY1ATX?Mt_VFcJqTb8tjb>wtjY{J{GRM zCLu9!$Q++&I6Aa}@Y^o-8-JD)+dv01tqykOLQQsfXlr>ph@_Sk0na`ekZaPv%CLOW zeYNT>wza*66BNJ6KINox0R7Wb;6rU-_v8q>%I3>NRNTKach3fB+IKR~%T^P)q8o%L z;G53iUl;7`@T?l~%gEr39?B%M+*&tE$kR8r6g?sLpB7XYDz6DA-Ajv51R#&|UR!QR zHw0lPiLFBd@#c#e9WM6>N(ya+-P;UJTJoAI)OC{K$2cPzOH`;|G)M`u^*sR`MIb_8E_v<_bvSP-?3(GzGGMkGq#Pm0+& z@K7J^*R1c|cqo9%d)6?oDg7c)>WAG{~#AJQ|zQoHpx9SDAKcf8pWG?bR8ofLos;0K-Y(yoWtjMp@k?|pq zy^J_+A`xFkAbNRK^*-R}-;R$W!G?Gm799$7;_F9a)~1pV(^XY?h>LG9)TN=9F6kSo z1X1+))`U8%u;ID|`zMorqdx)p?6F7|0eZ2}s)a;(Fntuql<*1oVDYY#O=gGhHHN|q zlwXHl@fOj(A6o`FfwrGckT!Lvdmn5cXlo$XQUpyH+XQ4fsI4FoE9MbDlQ7$Pm^3J%?VlBRKOTcd!1%>=Luw1Od zol57SU6dtWD7ggpZu%RMOuezy4WuPR=`Xkd z!q&bDwicPOYnC`mf6UTOqm6rF-$?%IP0SI>9IFcI6$q;9n2*#?!pNJM-=w;-GD?_Xx%g_`uE zu@Y0-436_3HZU@7e!3neOcTx0^D}~QGT5+PrPyWGLRky;+o$NChEz#QTpR+G1qQTW zY5dLgmhrP;v{!7Cb2ERV6r=WsYJ1eeXn)o$u zHYiZ+FCG<|ibw7w>Y*ByLFW2f{x;FOPZV>x&I?PHsAP=B`ckStv^7K-k!z|SE9N!9 zf|)m%vCI}>=jI3Na3%Sq~B{>>ftZ~PaLTP3|Z%`xPuLV zCyX`U+Yz5mpOd#uat_mQb8izCQ5!TrS*7mOLN{H5KV^Cg3ZmTSgRT3Q2H&UbFF0x; zi(sqT@XdWz#Re>TB0OYs*Vc6rEa2qLp_k}DHq~SGuytx`FU#Z&t1rQkR!DumAS+SH zib$8-FmN+IrZ&~YMXV=v+xvcQ=(Sasb2k;;LqsKR<4DiswGRaaHAE(WibIf)7%Ru! z$3iClz{zm{+$N`eZE`I6aK*xenwtlg0VlO$jrwkg_B>;oorn>A(%~Sd{O4(pJkS?~RwqPP6IJ^nO>+io?r*tK95$ zM4?R!yUIA6m}TzK_b!{EBo9})dv1t@rW{e;hK&cwVBN_mSIvG+TXYr^CF>Y)L|Z>4 zubl0VP3^C$Pa_Onyaa}E9Sp&qE+M>$nn#ce3^|QWcHc^X1_6{ktO$}M>sbuAZ8)qaW`i z#XBmiP-6K}(h}QXlekf)ClwT9Kqiyn{oTR$Co3Sb%YS_LpkWw|*(hOq=oc(^(y7W< zr?*ql8+dEpfM8)sy_rdmP^uEXlZvgp=~hYFK-A~M@fR$9Rx!Io(K;30Put>3@8Z@t z{M){E_G_Wz5QDy?3*Vic(NrgYFUipMo^3m%F4rrcx-yjlgk~=Wr5UO(4NA=qT@En9 z)xS;u*TB)hD~zw5V-yddgDQmmWUC3)_5=#OUe59d0>JQgVbdAa1m+r87Cxq78|e0%Ik!hc!1AhMIdVg zw@jM9N7IiajdY}@o_^QMV8@sMS^D-4E&LWFr?9*@LQXGQAAIZZ^ioxk459B2^WXq( zu%C&quz5MgNu(HSY{+|5MG;;OgGB;n3fFD@(?Sgb0I@CxqJ%iO7F&!M-1U654A8(x zeTtD5hQ?d)7Ma?M<9bjk$uh?U+lOzT0uP(ARgWkPyQ z^zS^N7urYb)}n?+!FjC(2SyfAjvF24cJJDHIT%?pKk@%o6-j1hof*x+)rt+C**UA#N||bGz6YxMY-%ghQ^#5i5*FOcolkOb z54F@67Gt&*wwb{rx~>=0x&L!`**0YVhBb;I5spFf1UPcKALb)+BU&>Ul7T-2aD_I@ zy3%naXkI<(Rsj2B=8XcS%SJW$e*rl_#=j4SfhKcRf_*p*u+{aI)IaAW5;b!x0Ob>I4hg^cPv!SQ0gpaA0=UFHAu1Fjs9HBJU5S z6`=O2dVrBaE}1)5c$J#99(5^HRE&E^ed=Qce|`(^IG&Un%O(5yDfE!Zlc@eI0ZUn3 zneS@{=jil_1kAJ+=y5n2(*`zu_m-q-ApX+Ffv{7mQ_CsDC0vO=cS*!XuWr%&yTGiF z8NR3Ob&PuU#SdenSgtOJQytf?mBE;chZm?LIX+3!4+Rb}9B_^t?<59yR~%)(LpILOf!K* zVTi1kP-C$=t>h^cQ4MR{Z7Z(99J`*YF3PT$>6nQXCTCigVvsJsBvi!`s4%(iIDVLCMTLOK#E#@;8qwK%XHYQjJ2tCm4YHMu}}Y$00-C1484hJ(S4i z5CCjiimvlo8p4BgFgj)mi9ln6EY;cfIqSVJEfn&rU4!mB5`NP3q7RW2ggo8xlPV^* znWF{I4DLvfKMhsS=L4u807(QVxKGSe$;s5=cC`(;gF(m|W{>I{?Tlsx@84iDRkf%p zYTu~9UG4*<1qDWUC`Q90_b1gxv(+0oq6irfuAPp-tO~Z1K|30^qnaQv`Pox5$gu|A zK-VW8pEo~q90bdJ1|}L*PODr5z)}a0W>pMr$gki$i2gyv$k@4$7=O-DtB-OE$w2#C z4fxo|6z1j`ijVS}9{$SzF_Q4{BM-}$1`C4ZeZhd&+Ex%^m=e5w&$-5hLU#Xjv31s* zQCT4R&!7Sr%FCZynkL)>Lb6f};^4PbJ1snLin-4*!iHc~b9!cSWBc`pnNQtywT2Ss z%>rjdG!q~^Xh345oHtT2?!D zVFfbAp?=K4P)&F{1rrbMKBA^8>MSgr?4VWJR1I6ET@#uEph0Bhw(-@9E$!Q&Gx2%(oWLE+J90y_TsrnZtMs*3w9SWtYmT#v7 z3yv@I`@wMCPQ2X;{BCH)Aomp%Kfsvlin>&uKW}O|eTN~w_G;iP;Zeylx7sy|*63X5fThoirE@aM1zfv5&tT)2ENuJT8)*O zjkz|a{7Fh!K8!u+nDC$Ces24Pc`kV99h~4yTs95RD4w8!F6?=$uB<=jKfFB$CqWb% z?3%u^z2WwSq7IIQimNUl#KWS7-}MF`G>nup@)J{CLk_v!cm>;;E_?5&d!8wfsBd?? zJoa>`IF{xqJo*5TC&b;L>{iqAw;VXS61WbsD-nXDQ^T0|LWfs;`>{e9irtEuT-$x< zW22M;fL%C#?5zU_Z_)-{X6%AJ(=ppwxQmS4u-MQl!8QkdH~eF5GcZ$-tt!i-FxQOTj^YJD#|~_hmtg{ zVfcnNoWJneD?*|8s`NfnOiF2gdT_>3vOL2JR5|3Y8V(aFc07utzGu(MDp-;>R1HpU z{I#$zLr42cDLjrfPs(*^?aXvY$X$xF4Nca?d;h~WVo$o#m=$5EvA)8=-7g^~AZ(Yj zQ4DmsUE0g679hOl)`9ALn-Z`~#fm3F@ZSZ&JR1C2VKXFq*h1X4Q?nxDsR!g( z1ye=!DnX=E<|M|-?f8zW+L%T6)C9;FeHDu=v^2z4FX|7A9fP{a6XlB%pHH{}>OR48 zEhFfX1COcu3>v8+UY_-zGc-<+85~D1Jni%>V{*7d}X2yux)6fr*uAtZMmuCD+qb^a0-V%ik;1;891d z-gZpn=4JACxb0i8ZT6AEQ3l#N!u56Zsd@hd@m*V8r$Ax;#jt?I4&4a=ZUzeB#%U=2 zB^1G$kP9w=GbjlF(k(GsN91iAq5>|G!2ZlDShA0WP%~|zOP;}JKdS`0dQvTVBH$f` z?T;K*2#0)MW~W?sk+&+;LcM0wHaQGCrHFg9&ui$WiWk{2b}MilCoF9=-@2UIU=gL$ z{Gv?>3HFQaW+{xPZ!i+q{(}QvJoS!EECTL;UXLU@(*mIGGU;z}5Y8lL6XWg*nuioi zqBDTj(!;_Xnm~jShpt}FKEoU^k*+}}v>>wgdc#!#xv(wevYFrl%hP+2Nz<-k{*)-x zg>emy?P-m~PRBA|3*sEyymB87a~O^7v$j z(5<-6$-2Q$GryOIu^9V|LWe9uBwi!@XI^NX3>_br*+93e5|qp|r0C-$zC^@v`CZNH zmAPI%lz!lpVB2u8Wx@h2wfQhLbn^2olwxfW_O>f~h4YcHn)4k*@60&L{mFWOyG&X%d zfwsxGc#wX!U#CM*v7~fPlKs_7-Hd;PNb9kLzDv&^U2RyNxo*9?12=oSz?m{mZh?{U zwg3F&Y4n!C-sRAv{iG0=Nb*%HL9s@PC45as|#NwOzxx@cyUt)?V6IoL4fU#9NH~O*UdOIq5w-aPTE^?-u=wn z9Ti?!y9Tu()j9S8QGDpNnx)Ev(Nc|$^|UkdK;sL@hwi4Zh*aOh(K54En4Dph7$+zz z<3HX^{_=J9E^-8&5UV%4FDUL8?f*kikkpSoZ(m!w%3Wm1Pg65KZw+me8l>ePLD&q1 z`Ag7JBRN!nP-Zt>uq|GK4)gg`e@&XC-I_-iiH=#(#)V#$g6u_o2(k>9;Rfpnb3^&_3%(_nAiJ{r=E}n4Cmn> zVrJEJ+21lP0!<&_0j>98^C449NH@hEHVjF*%!bncIr|IUjH@aIEBOh2%&KZ5y@P20}s?Ybd1?>ldrTyGf&FiZzz$7Bsow0Z9CAZCaP zA1O_|ILKd_7t%6{TZ_oMr0l1VtM3YxGc>TYtiY|mOfheUA-oMxXM0CPG|)^k^pHOG z=-5we>eC+S8HzCh!%xwGvp-~1Y5YfPG9{x^Os!bxoHtN_k1h72wrCt5;%&0aI)GP= z2PLHn+9<-@HBWqU0_$sd2-#vbMfEXHWQwoQte27bVJHyWOvj_lH26}crj~)qo7Ozr z&7RN&u7z`}rHT?UV>{&FS|l^QX^#8yrdvTC?-aJ)q8*^}m=X(@6gMi)fxqlc#@f$< zKgH2&8qpOeryMZK$T}3#U%+jRB8D0gFzZ0T9NMP`9!*_ND1XeON|d3mtI?l?!qVH# zTkry09TYe2%MX@Rd^)x8Lj`;f=Wd{gz$@Gcmvu&GLn0nF1ao(lo55EwF3-8O@%eI6 z+}#NQ3UTuX33soL&q8Dmy*ui;V#2K|_I{D;FVaISjfCSC zC-GkSCkZQC7LIrZukq*cVF#xcQOa&Rtb8g1&-JN}xl_m){U|dD=>}w1q*hwJLMsBt z3RDi(GP}f0&OK+lB6ZlR5wnoxfasjvF-}BbJ2#S>O*#;KxCFU7hZTro)Q60n53 z#Tr@Cra~~RZ4`q+V^qOPg9W!E#q?05xYv%45{mEE|LofY=U4F*=*JqR4>&3Laa>Xa#!4na1U1W$L# z?-R#=8H?Nks3_hA!<&ENKQBBcnIsC3WE!hb_1{h#jIn()@2;Dhl>+pjA5-|Zw(7BNq_(laQ&@To z(L9h1OWs@peqZ|MXcL^tDl&Lvtc7Hz0EU`ihBDbM*@VO@SEY%H;Fm|!ckBu5)fhS= zl+6mt8NNEFfSJP2k4i#fU_W~Uu)>et#JbT73g8*41c7>-GKIWCe~KpZc{b6P8mnUKi_! zJ2&0%VF(#;`^w9F0jfjWlV%7mnq-0#^gHTg9t4_eYWLJ@heds0oniUCI^lt?;}HiG z=HnnqGf)DAL&oYHv2A7N!24CxDuYk3rmA+?YKq%m41UYa28y~n5AJmjFezhh_!o~$ za^43W>p6F&6N-3OsQOQVc(5qS8^i8Aetlv84c36qQq@3pguSs()>6LYrXC|66G}IJ7BIKK=k9woZ9neF7yiT|KA5jhBf}utRjb#0 zF#A%aBc`M{YjTu_cPo*;l#68M?#t9If%5);s&R6tVVw?MIH{LtzT&yRK)`NGS8s3_{#5`O zmHHe-RVTZtP~~be_S8DCgqC*uLJ0!_)!lmt((2h&d$p^hSZ4oOajL^}CRGud55%d> zX3BeZDC94P6o+G7ek$fwbG0vdz< zb9tg?Lj3oI$dmvGE*g;Tiwn~5QH1TxwLG2?Zpkpe8QJFkY9I4^zgd;3l_wnQ(n>j*i-_%w&J8ZTOS4pXb-GWWlW`nd9|m+4*pU8N)uXK^N9r>Ev>ajf zj!4)`Z2#i8BH1M7dl2z?dPat_f?xjbx7)Z~ene!5bJkZ+7RgGEh_eFFZW1f_XQ~TD zjgIt!L8r^Z5jT5z-&N)#nk?t3=Z6eF?8d|F_0KDusVDp;cnvo6X2kk{hokh3-s75O(z{F#r+{s&nE{!D_j=1GTwn2e zF(iz~Sj0jb6OAl9mtaoQ0j)o&;<%$R_B!%bPdd!i&HPO}#fj#}yng&W2+5cFp7&ck z8aBz9Z}mnc&{JbRqvgVYs8-+Spo9`jcxnZxmtBif7RQ_#`eeC$7&q%n!39GFI6QJ!?Z@6*;krInLQgm%GEz*$bC@N z&ofDtZi6}I+XH~0*}?Z8S``{c3kR-;fpadTh+Q!$7^h8yT+xrK?Di!-{^IPxqbpQJ z?RWbxn2%>h`|BmUzR_dqMCHu{qsP%yO!OEHzeEUXK3`L#tZ~)?z*p%Z9VN#t^K@u) zPNQHOd`85-0`PL{+%r*ZCV)_+Ceg&*ElAiM<_GN2mbWk)Ch|rkdX#1ar#52j_77=69(+ZdR#o0 zGse^rLN5ZL&58Dnkux2wc5xivQrWgGL;~@l;18UmKz9@{?^LBy?I3Mw%0joEQuyl5%{m0SapDFKd=_}R{;m>H~d4v@{E0#+%-aO+VSfU{gyCc&@6K)Ijo zKx3Ef|L)#0_p9s}B$p7v*yG`vpx0JouUr>5$n#!>*t&n;0;WxB1t0iiU6ImTu{EKHLgMSR_DuF;$m17wD!!Sxkn6)59)=w4@3fQ}%Va_}zc)J(Jxe!T+EzX( z(>DW3{Q@%ZwETckFeD7NA6E8OzOpyo&7HNX$3p?}F;*u~wLr{EdZqzIMazXaa#aqX zLdt>l4EiM+ioAD;fd$6z5DbI~U$4?0QAl?$S+ya5n%_KM+@Xuwk@hdFFD@S`@6uX$ z7+Awy4xbpChkXUurZ;2G41hVx2(-sPC#GmbFI^36R)3va6;h#GMGjGj_YO0?-tf`@ zAP5o1fj+Oft^I=a&xQCr!oK#)0hgiY-K4zwE|OuRC7&!5@@{4e7fUhZu8%@>J#{LN z-2lz&IzEVqBzHKb_kW5m)GVQ!{%7=v*ptUH@)@igF6~6+wBycRVL!``c$QwA)5SO@ zM-jb`!<}2Lw%>jM8J?avH{3C3NOnLXxLh_t8>>BXd{s$^gK#fiYbkj+Q!NVs$eeEx zdnDdN?mnPhwUBHKeQ7gJ02-p_S>sBlyQ|)T`qz9gF}1m3vO30{^*z_Z!va5q92Ww6 zw(aJPw67h}!Z_i`Usw7Sr-{BkB9Y6@U_s)4G>3?(xyq~E%_6%!W`C+oY@09MG=Rf+kQNk z87$^q23l2(=Wb2Bn0=DWNh-II@T+Aq$MHq^FlNGM6`@;A2JLlk7xr^gG%#Z72`JEw zED`rWbI1$2w=gHBES z=J<}9#HMn+W5*6rT>vs5uzE1y4pReyIxpXbsxY|0_u*BD^Q^)30$7wCJW4fx(x9v?lj^I#pK z`3*-IQL~anb}mb1{@2uTJ^n$UFuLtO*M+!N{-&|DtA+Jel(>se*D=ndHAOj#o~|8r zj5RKY^)j(^`*oqN9$cl>`7=z!a7{5|^DE5%u=NfE%c-J~5;`YuG=r;m8) z>;(F=-awdxWS^nBHDJbF+VF&09a`yQH?5YvWNnQ4)Qt^}LuppS$htpsv~pi{celMH=ZkJLOt?EhR>7GU z)kO_pa(<_Up8je{ZhUtaIt*Zz3~8N9dzs}WN`u<~!??l-6q|qm&oI43>wWjgG5tEy zHD2%B-Fv%Y092z@b~;1u`WN7R#s-~M2f*c^Qdx%8O6k6Avw6*g5fpPuQ3+3*MY?LH zdV5-zx4(EIY-%+)8&E};Ir9X!Gj;*QS`cWkX$3l}Y(1Dl0vDw+V`T@;#}^&D@J|>r zP%tH^O%Tss=5E1uM0iG3uO5}^J$WdK)7P9MDLnHC-d<*KbQ&9KqE1k+ z@bb{hcBcGUSO7SH&}zr!=a>1>{h3Yvgkl=|2c@0C9LXD%wbS>XE>ODMh9-AP9otN! z=qcqaAWTconcaoBwe9NCP!bfmdAc=uzOYe6a-R9uhM&Z<*s&=f)e@hgibGT>Zr8Eo z&mQxxlzLhGAKSGzH8h`vX3!sk=bicwkeEMgzv4u(slbEK-qJ!I%pKtD!^JnSdNil; zr70chzPsu|;`V|7i*Se%o<=;y?6te7L=x7 zXwGI!%wC?vkF^J*5qj~$p<$a1*dRo+#OO?Kb>s&L+!RVsia{JLpV7osN??gAxd0QZ zv0;hijPcXSMaZ?vOKfiEKr`03ouJ|@@@uI`sKQ{930u^l4`$)a&>}&SZ{n`a6lICq z!xyEed2~gZcz8y7>0dmmMmwwoGxj=Hiv(h!C>Wsx#d=S&!pcsG_OyG4EBbf^rC_eB z7lrc3SbNo|v#l>dwP^$Pjo@av%AqKb|k1Vlm=um~3xK&39&|cY5a$1+9~k zKCmObLINbCp>F;LWHTzCT?Blu-3WpKazZvV8x+xsD2wH?L8zoXX+HH9UPaFaIGQgx|2j?ym+Vn<}ZvjV+4mmBYN9+H3=h! z$*yyB1eEQ0^#I6pb9QY^W;K0$c;U>&vE2h1s%FQz4lZ0AB#0n}9@RJ3kd-=|3$rN{ zuo)up&UJOfXR~;4%VuII!Y!P~{nB>IBXM5s@Q3Q^LImA;=t2jG#lzdtC#u}{<5HBj72e>Q`+hsws(r+P_nA;d|&+WqYAo83#t?hOkU}9$?>zZP?s* zw#^;Fy`myptBq8(KBTZ56MG>Gioh@WOo_J5A>F**lX4ZGO=B6u8rsy{yjdu& zXh1s0((C=+e81n2Cv)kaiCW=QE&00Tn(BD#;i^OY-kxIF2`f3d2W_1a1>wvj4CBwhaLdoq)-47tOI0(e3++I9oS~=g+r6 zP?fgYBx(NbQ@_Pj5~A-10B_+Q|M1?v6=nv4K>i+Pye_9W=eIBV2-#zOL6po(UGFlE zkY%-eGuvo~{3sS810oF6X&a7=+$M&cN$)foakL%SQQ)WNC04ut%&WwfA7H%V6`srS zF2v)bQ9`@2oNR4avc^Q(uqGBN{@LQZlPqJLn%sQ9v)vURDma%$2X>@n9MsBCHT*@O zZS+@5kRSC(JqU8kx4X_w8Abx4eK>nSvkPjxa>tz~>o%LNshRR1Kv7B~v;6*sIg;bjUL{Vwu)kz&Mw!7qye_mzj@00bcPzghu6a?Y88|C(FS9%RG!u;w zu}}y8DX&37biBfZUD~RyXlQ^H!9jq-M3`t@TOQ*UV7Fo!60t3a{8saw&$H`Z-H%Kk zWS|Jtxz9-42fcFU22?@&>DNu>9unhH^wv4B)?BZ)27G83D-VVYQU$^tYw$?_+ zQ6h$JoOx4~bi%}*Uj(FJ7owRBh(>6^ZdXBu?nLzbGoGUG5Qy{bF{IQ}AiWUT&sfJE zjib~@QFpxsZX;b%HE3~EmTikdhmWBsk=l`~hjto#2M(uEK;Svei{u@%L^;t1T#Y(; zkoo$>R=`^Z2d6C*EQCv{4KDXG`qP2ZKc4u!=@PV zu9S%yDlbqvA+zulZWomoh?q$*Ly>sQ%2_jmx}-`W1C{HjUTrACH-hoTQK;y&*MPST z%TB7^Ce}UU7r_d_i<2YnOok8U_E;hrCA4u>X$K&lft0WKnN4E|bh!8dX;SHXC;X~T zbx|h66~c~r0#+R&3*FK%wecZ#*pO^!((24E9lxN`a{!6NPUY#0eQ zZtF|U7lqMjg%kx!^-~3&)&c*n1tU@E{yIf!ETJxa(WmkQDm6$S zfR<a`?|km%F=mps-;DaTb6Phg*3eh_`P3Zfo*$Y)p@IRyKsCs5Cjj9te~) zoXz{FT9?FHq1lN>OQIa$QY(vc`oyJX+Aac>*|!`J7WF%IV|N{nIk zU5}Mh=^bGPBCN=~_#yd2=iUpyj`V(k&4WNT5cOs})cRDA~HDk~m zAO2$*4Pz(qUq>c2Bt?t-1`34V;2I+e#(xwf1?_P=H9gOW1%bcNKWFDV!EzqEy?dI0 zWtdFKxpw0LUvdBu40c3~EC}0Y3d2iyt&Vwdu3MTKRB~J z>7;7OaS+hsE^nn~Xr_Na?Syxh>q~gK0~D{7h~MZ9qBo%x1f2wqRY{C3_x>?5Egp>% zeGHQ!LyE-6>*vk?X;aaP(ZW|V)B{l#p5h{3%_3T{`~=tT%sS@o&_u=~ew~PV85!J^ zmyW7B9<0ko2WC&vDAkWh&q>ohzskqGFvP7CZDceu_nNI#sYNE3}|&%TnOR}0zdPm!6y(-s}~02Cx6e+=myU6KaNZfR+I=nAhTtAdfTx)S$%bIIt9hszTWf5LNJPEa&tvnBE%M$!3-Q zP%)L--wc=ZVTrw2{AoJ^Iuyg;h^0YaG8qlou11@P)0Gtt!q8X}fWIA^ZCW;IlN(al zg`jZivOht9Ppx0w>@wEZ#hgqZe+Yx%kY;SK7TSQrtNLO|0zN@Sf0!&&0hJ%jkAdYd zfTF4KDZJ5+fU*|Cb0^>UTE*8ywXk7&*AM7|x$DV!XU)B?9soq?62%&iL#|7^+LJ^Xj#Yz>F7UZ!{GmAy^I_&zQ0P)|E9OZwBHQx4WWSiW@ zq&dx)l|N^}n~wM?$#kc7sskt+kW$5vyC6)KzDOmJNyzqhRqLYh3YW^)5TG+} z#;ah8T+>RQ@ATi>P2VmAZhU(+hC4fx7GaPZ@@$6>I%r6p?e85l9of3vYhfi}gEJ2y z3yTl!N;yDxuguMY&%!gt50_~obLzkL8OgKv zm7D0AL(}lq*{mI;`wvOpX7C25!%46T-FAdF_l}#v(jp$z7e5ENDEV$h6GXi1AA7pA zfzVuO2#OA&+vv8UeF!fbhlgRtiXW@8Y9VtJ$1WC5i8K@28>3=mV{33Zz7y9-W=i~K zbUQ(l5FieKyFWf)!f{vZpl(`#4+%mw&jJ^z3{CY&H0X7Y-yB%{dny7b)B_ z%imo1?h1ze2{!26WSOryNLh6tUdq<#DC+1sRUK|n#E}p?Y%NR_Igc`u!s8AJ z8w@?Z%I)r>CgP+$zsO+#{+Uk_%Vp3+l&qkquwh&_ol<>=(+o}+qLLz;V&V36bi6d4 zm%I+~16F^S`=uQ2Q2NVBjnG_oCj}z$L{^ur#x~Tw!}U)QVOObH9uO*XwPLd(`NL{f zP`Jl^BpGCmgi*7pGbD_Vr_R?=#p_`$??s>3_``;=W}zcW-#HP2|2(*T6I3*Yd}Rqg zw`Yk3>ebYE9cxZ5uL*JiamuNf?n|Te`(d#e!ZH<0KT7M+uXZXi9%$0@Q!a(KyE^Fr zvjF|RUU%$46x@-E(ITH)*i@9lro53@ubIXln9GpI5+j6URe8vdh>mXcIbH{ILA4np zY-=o0;kD$q`&_1Jic(@XUWWOe4ljmik>C?EHUoghwBuNd?tL4Rvf=&vtu{l+W5*n6 zd#jBou`nXOtgOcv^^jf^p2*3Bfs1CzieRjjq}U_!t+cC+2B#0m&iJ17-Z^)Mwd z0HMXnfXzXxy};-)L^smrG*WmQ4O&4WBd@Il;wP{0NI?t|?rTER?s=tUljHGORthvR zEuj0r8oleG6;w&CN0I#rEv9p~JP2|9<%cKlq^o(wXIE;IAGJZ9q=+`{z(ibzTV=b)K;T)rAYVu4(7=?0(ug-F6r&a_jw9?KBJ z%q6U0-IrS-mCyKQ0LDZJm>ZNWBJv!p5IKM|J#+ZDDB0Xvc?u;4lMVkOv>lD`PR?#5 zn?y-{7Di71X{X%;v=%3Cm~fCs!)DOq1skzDqWX)QtA0%vtyM(R`MPvvHTEVbaI*7X z%qxMM>>92C?XF>2n1ZkZT_tuTv+i0jy$;oR0)gI$@Fm;>KIcMG$`vxQRB#;8(`DjQ z958ApX9nmp3vclIT(dMS=>C;+SfgIJO}A2mxLY1X%&d9Clk<;rTo>Ost!K-{7)HO` z(v)uqUxsziJyRBt|MJ0oWBCaZMzUr}y4Dglcc-lC^tid9iCXDt#rRmQOruTLdMQ5m zSvi&jOTqRgd!J6A+)t_^bMLI(x!bN97$6&-;RMlxN(RL+;p{8G*I?Rkt1tN0P|iH$ z-y+XI&ULreodOy+$D6jVx%uj^VjNrXAejV!HS>$O(}x|rV*nQHU=OJu1v+L149v9X-E+k11Yyi zapfzssn(}iV;WWGR548)05yf^zCOSXI|-C_XfHKsF$!WIwtKTn9!1yF-aK4md#e|b z!#&Hk1NwxQi*<8Z3ICZ^yyP-$n_(gFDcpFIcb+^sDfMW48WPP*{y zJ;SW0N>d&>tbB?gfDl+Za1Xxr;K!(nugCG1>%YL9UUQKj5fTD*^a$FIUg%gAu>tP4+lC%6NP$>#XkhK;-o2iKq(!%2d9a~i#+3EVi~NXk?<_dD%ht)g_|nm;Qe|ud#Q$7^z>JsQo&fZlZ3?Hu1-c(Ec*AVtD<& zT=y+Y@UM98Osq};B zk_IQcX(rJIsG2S9Hj!5p6&)$go$W|DD|_syn z;=|;<&Gh^RT0BPLUmtz3w{vqW?YEP86P-t#hN$Sg@yRIBOb^V0%9FQyuqdX?XD2iG-WM{M4#KVQH&^9ds1r$I+OMDk z%;ff)oOr$20F0{wxqlLx&G^;N2!4EIU9XfGJWwlK+m`tU*RAQ_YY=TMlbg(ucK%PQ zfyo4P$Pd_&n&?l83OU=~@V;Rfkf|$0*`t029dR^y(mpg;zy8pIKO` z)9sLc&0QaXY*<6(_0f&V1lN=)`T=~erTF9FVI&~6oJl{e<)GS038hZo4X^?|VAmu9X{M?8-E*CL9J zTcY{`e_TJN!!_x~<1f5b$rGXJ3+93AKP0vdJ*Sq&T|c(zdc=uQ^&Cj{XgVXAE3N~T zRc`XWt|7t*E0$L0V@!yF~M^PUz!Avq-Y7W&TBOLI`516nbsckW%j^yZ^(U>{& zkEub11(glzVs|27aIIy7A)jbHaDklQ6tdM}a+y2w9jQ4rPrL3jMG)RR%Ad7Qa#7vG zQxb0=iIxMW9t*4QwsWV%NQ~nE2g!YAk2dU2XN)JYO8o{z_)NJzC4EF|N6dY_+|6eB zv`zUxQ)Yz7L>Qbd;UF)iB1@-<_&tvOVo)p`B`#LFJ1Z{4<2a{UZ+aoF+VP7g-R)iR zoIT3ZOA(#!MAV~Fo$={^94O8wjS78Sd|rOB<+=M8S~+!qbSiKH=v;#b7}UilJv{80 z-URzByWo)7?uFjxDtmYXd#@l#DBj8=AyJ>m5d~&i3=NGf8$FeA(DQiUnsa~6q0ym7 zEQdd^31@3O`ak`r>!vFjqu%jnp^H2Rvmwu*2z@BXg6B79M#;~gcbe~!8-euyG#*7$s8gMv4qb?E z5M!3ei#!QimKV2#FMI9kY)d}{!nXD}sTF|dtTV+>y$51(?FdBsQnk|p2>{qhqvDNa zzF+1=Y6znp2bagt-;FKj`z`brL%>jElf-1QL{_b*BAnwCVb3u#vtm=?rB{EvMTFQ2Lgg zKE#H_w@d06^ioGbSa0TQrY<$A)_hSFt!$gK!&dVKF6g!WqX+o<{xRLZL1Z4hhx!ba z$86osssFMgn>)NpVFIX)AOgxomjehU$2#c1&p_C;bq^qzq(?B^eZbR)~;HbM!S4OF*D_xthEL20ganwlvSp66h^8?TkcmWf=P zuU)t*!_8>=R#_3zPeNQ*le0LL^*ow{;KMxK#YRP%qkj{poJ34F!V>~Ur?!zpbG;-7 zb&FB4-@k53xiPmFLES!~!nYt4MZ|>fIOrxi?p|Ur2l#dT{2w^e6x7zZzVpBZ zO2&XsIQ%fcO`mkS;-h(WO=o>3i3}1rBkAOnxbRA?bqTr9joyvRnj!xKf^$Y~a6U{pxj4WjZm|$o2_5zmtVF+$yR5O- z8S2uL1;FDhK$ntp<_L`wTSgi%b%qbQFBx_vZ@>h zRq2dZSynvfJLgkkUDj0uMdD9PEN8$d$cu?Mv!)BLekqKF#>Oav#Lq}=)wb$z1>z3L4n&+V#Flzj-&cx zQF7D&Hqn~3X|3eZxtt_Kb54P-xU&AYMSu_F^f07mdQBZk><0e72QIz@1vdd52fFh!R^(| zdYFsMOdT2rcR@@w52|X&5N5Hk_%$Nti0W<3Lpl`fA^cw zC-SM58@6#k!Pv`9kALzO`NF2K&zNu7B!Tx5S)?Q>3Lv9)Gy?b|0wvF7aq$--7}a&V zFgVUzNX_e9!588hq~oMdtY^CpWyz4rQe|J9{lk5n%Hv$_7XN7Q=&yeRDOPXv3w2LSPyNZ1z(Q13cDMH% z&=N}2?Ib7b4h0TKPs5cug~T&a;cW%J4I=Dq89nni{q7el9r45P4=xCfxcmhB;FgS=*TJAe&eiEvJdHmUAFB4h=E$#P}#ocOKn=nAuiH<2w7K3^+>jc9I) zT6(#FGBQ_6LZC2z!G?=pJr-;etu?zT1raupYPBXaUD7KGfPfsptHTj(_sJl$r*m%( z)f3-ENQ`38@-47ZoH>2C*fNQ1(M$-jblUKK>vOV@bF@-^QdxN-Jcv+Ut#0p9a9jI> zWIDkCGkWF!#q?rS7ruyXs0n)>J?xTYnqgh{#mXh)%IqZmMMP!TK4{Kf{b_Gr7p_sO z)d7tklKh@nOl!!3h#v-alzjPa*LCT;PJnhFeC%^2^oY=OB54R}Rixss%01j*Gp;%q zJpKx}kGe`5X4qrN@Z>i2HV*YO4zMQ)Q>M&kx*yw4V)$`CP%8=kK&)f zkFX#?#L>gpe_&3adFT5qfBK3}z*bjJ>milq# zQ&BO(V@hH*HKR_A?4C7fO=5o2trPlIn|s2jdzeSGHbMkQ6B@Ga-eWKLqUpV{VBH((7b#!$lZU`#9J`K`(v{B=e`>>YIv^QL(!` zp=KTQV|;8Nv|YUXkC_(D=VMBnonH^*fMezn9DCHLsT<)7m#4VaP2gk9TS+;pg4K+% zHwQD$M0KXrZ8hHDgJMI#QWOF-jw5ON&$m2%QKU3f)1_oIc}DR2+xOZSemQeH#34$HPE zq&b2R{Gz#AxjuB`_(O8oZ?(EuB+E(Hct*NbSYe`M)K?#PqIs9C&cIyW(7JGt{@@v) z1~{@fEQrN-9Z;cER%i@2Q50S8>dYesjkn))-QZ7LE+fUjs)UGI*;^;70^?R`qKB1s zDY*pfiy0i=P$yHMhKL#JTkrDmNoG4;ko^PWhi8; zpiZ3wI|S~DS%WUy|B<#^7^WVN&ws>AI8?x04zaR)XU%ZqoiZEnUloVvacWDOB6(ENOuu*B~TfJ{k~{Ep&625H#1HW6BB{O&wA-8*U6rBJuS$dn=8 z2%X_K1$|$zrtP#sbT3Leq{wRz5+kaCmidWCbc&vx3?ORB%smEg#rm#SahpOfGSGAN zmHQ~0d!|N%{ZCl$FIhrzV&i=17EF2!iqI!mWXO}WZseQEMui_ze+Ko`jLC9r4**{Y zp0hD0yP!E|k-a{r*Gy=UQ>+Qky1Mt1bE55JYSC2+PO6Vi6(bom$8Jm67X42))Ng`b z%DE|J8E~48?N)ZWIRL%b%;~mYuN9CVUx{#aUjn5zTDN89^QhMH(xj3@R(XoK)|arY z8^~Ey4c+v$ZxKLuNX9#=U>4;8PM8A(Z`OG|$dP-OtQc%=kcbiHE+DQ`J|L37VLAJk zUb>ZjY-GZddVvI+2`>qh&Q6o#ii5FuHfhgXA$0UpR}2}y7v&p8mK-hExg3BdPu_86 zaXR7mF*ynMBboM<0Ssgz1yFCsbs!WH%xX!qicn4Vn!$`+(z^7i-HEoO!c_h^B_Pox8 z>|!ydVxL*kq*iK&+jZrwFZ2Z&Eh1;$Cw@ z7{~VCNe;~8SFuvnzeX5>($+t#aCh*l{OM_;`&a`&d7C!qUX}6W!gZY`Ap3d!O5n!w zelND}@VRJN0sC3f9mtP1qhXQHi^GyCcBI9!Xv`-k*r0`H$B?gTS1KrjXM6RbNRzg$ zpe&7amy;pUPrys3T^qaPoIc}fStUaP6n zz79lSmP7{3&dxm~p>3@p(}X(f`}GVEePI3)J_tyETs@(eqGj9v{yrT%$LIktU*|%u zopC%@q&~|MGrn=vM$x~~TfN_<*VElHfg)G6+)QFoW$uCV@O+riz g{x_rWH~a8^0q}pq2E=PY{?W0K;r`Ji*)++&0GUum-T(jq literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n019004l.afm b/pdf2swf/fonts/n019004l.afm new file mode 100644 index 0000000..fe41636 --- /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 0000000000000000000000000000000000000000..aec380a3310caa55a85897adb78fdaba1e405a4c GIT binary patch literal 35941 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 literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n019023l.afm b/pdf2swf/fonts/n019023l.afm new file mode 100644 index 0000000..0172d80 --- /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 0000000000000000000000000000000000000000..876cda876dea9c970f07f9be9041d581e0d13568 GIT binary patch literal 38314 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 a$o~dF{u_4i&d$Qr+11hB)Y+CW5cq$8eA3JS literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n019024l.afm b/pdf2swf/fonts/n019024l.afm new file mode 100644 index 0000000..9433a32 --- /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 0000000000000000000000000000000000000000..479904083a9b7ee14e0dc02a5662d402f4087f2c GIT binary patch literal 39013 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 literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n021003l.afm b/pdf2swf/fonts/n021003l.afm new file mode 100644 index 0000000..95759a5 --- /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 0000000000000000000000000000000000000000..cbae7ed157e14e2d693385b5d23411107f1b7534 GIT binary patch literal 46026 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 z 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 ^Wn2D0Pj@uNZ+8Sx` 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�KK3g+wF}(^1)QdLQsZ zCj%H8cnKGwC&ehKT6KD+WcGLgLZ)S12i|XgnyaYw_#Hm%ikyJ@N>VCZ)K(x1i9PZqIR7eIDpGs_ zk7SR+biWf(H5rXdXc*GQ@VOIGy1(>QwBD?hbY*fPA?bQgN{#Fx#v-SeOwIF)@+8Dn zuKwujW2*=KQPT_DN!HXtm_n4B#8*g8X){yQG9xy~7Y1;h_lCw z@L0}y({kS4$U?>3rOPiZM+dndZoY0lR|cGp4XLQj2hV_xux#nH24QeGIVVjUm7nNi!&D1R)bazE)BCP7o4kby@v z#fB)-u+f^Pn_k~+4jpi%tqxc*$?yAEX;7=o|1A^2un)JS?XpcsXm7_UK|UO7Z3U$R~)%l z=kRQCa7OiJ)lPfQ_fS{mk!FrC!iGX|MFBK|JgGZQ%*wh5?gb)2=i{Cv*}(*Mex!&uKa@+JnVXz+2a=$CUZH@wAY$=%8@$a$lYh(9vOYMc+}t7nm#c`sbf zIE@1z)%z=sohCttzFl|))q;Hc9o%YPY3BfkP!iNUhc(_Z#nU_$T_^D?*GbSWRQ

2lUCHo`at_#(F>h@<&0 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 literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n021023l.afm b/pdf2swf/fonts/n021023l.afm new file mode 100644 index 0000000..8454d36 --- /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 0000000000000000000000000000000000000000..aa9ff5f8ac9238dbeabc25462d610ad0baad72dd GIT binary patch literal 45458 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

6p|h1E?l1)MzqN8Ao1N`Hl38+ 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 i4FAi4{a@-C{(k|({{;_>ZA=ZFTCJJdY@ literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n021024l.afm b/pdf2swf/fonts/n021024l.afm new file mode 100644 index 0000000..0833e4f --- /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 0000000000000000000000000000000000000000..2d19d942eae6feb71fd75ae412ec9f2b7f73071a GIT binary patch literal 44656 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

~)`2tju2REF~mgS3Y4+DEZmKcU}q{M$$&? zJPurN@0cVTNPvQ+Q)a>ffy!@M)w_t^&F!R;ZB7>nci)jw8joSiI-XTmb9&;YcU!Cd84r4hr7UW89mbHmOHZ-^sw zQgXdUFi~?=_9^{BM`^N%LGqdUWg9uRm6d?e9q4&jmj{c{quGm?4({)OC zHYD}0|8)#qD@*MwlX&& zK5UvwUv(~;eCZ+}|D)<`np!u1YasMp6DZ(sRB1)rAH?&>T4Gh=7U7fEIU$h1&Uasi z2m})os}JA>>`KshB||)fU%P5yePYc!C0}xavS@I@rAfWA<n!C&J>Yxo`8$Gbs zzgboJODHrGyNNJzCqzA#?Y=FVnAcWBP<*Mstj(*0XI~}l^x6)(%R|~An+y_6x1uA) zI*DKAZWPc0*A=Zy{Oq3terRM#gx3sRWCD8GunRNM*9V%H_)<6CY3)w{(4-EXLd-{@rj8rzolT~VA;Oud z*@}6akuC&OpcuvL4#%HMPcxpph@80^>%S6o%owOBw~q_CxrnQk18?9?to{R{vmo5E z&Web!hh+^col}0)KLdrZ+37qQ2Y2{B6s8DICwJo_oc?=mbCeL(67_eM98$VdtY2-! z!WzO~Wha=4yuOSiCd?n)p|sWttYKd*kEYxn?? zgXMCq1GI<&DH#!Ia&IQ4<`vi9XfP(irie88&l=IbxpDedW(Q_Cfm&9OydHas2Pcbz z#D^ow{F7u{55B1rV0i5_geGNuXex ztBnKs`*556hfbIy%_0`_n$ujzO5Mouumm!p@sK19Hg@AQ)_l`FmJOz@KSW((-dJtP&TN@j zu}h6vhv(t~?>4#p8ppPaL7d|{PFv6vL1W})F{x{N2=&HR0r?5rx*1IDn#(P01;i)i z2mkOz1G%n^6_-bIx+=KEeN&?lJ{|_})NIGnr`pp@_hT;u<2`k&4l3EZNeikXkg^Cb zncld$3RAKG0YCiN4qoztQYThaO{(Os@LRs6l*Usq7o)K~DhM*pExX86bHdmoDS3d% zMDY`=^;RKhs1}_Swe&Hu2v4H?5yu$WYEL+)L7ug2$?=v2)8|e>-+XV**=srA=);B%3nicV(|L6 zLS;c+Mk*6y$M8MjdmyvR&F2NuNTyp!lO8gNBoO-M2!{Pxb=Kj|iV-`rxTp`mP?P%jSMwj6nG zldF!lz%4tC|U&n3Qjko<}!<<`v*d%{BSr-hv{G*@%N`(E;`)|C{oT4{V3#0y+v`rHv>NReUPUZ+&x4J?PTfhz)&^j>8Z_VPa@gorR6*a9%Gq1Oc2LZoKi&o=6KWP}C;AtcRk= zhF-~W*o3l6FhZyt<6$m+NFf-d-#B;%h3yRHVT1&UFG1SNIMA_ykw^L{bk;gDg>1rO zqLgMN=RMUp4iG{nSVFm49`CHy8|{tcfJNQzO8`fq?_?FwXqdmg0)gG7weGKh76~ds zCFN<9$F8a}f9}cBf|ECL-uL&N$!Z*;X?mWeI;P^OIZ9$7wr!nYG4xNqhMP1F*^k+8 z4In})I}2!I*gcunXDjcXhY?F>{W=|}*2!O26c7)l;+JP9xd98HWqTgkPD#hlGQ06* zCkPkIBigR#1g~U>an9Ju7Ke0^$OCz{#j{Q5b&uRN1rn&pLrk)2s^uZUb~ccGJ0-$> z5KHm*^GF7^0yDD^2OXBaaE{dG3$opir(NcKrf4tdH)et^^5)&XVAHmis_na5X*y8(r4ldYkUjO-YCFC-6` zL`-l8!3Q?{+0OX{?d*OQoKBU(pkzuV zc&S;)xdpLhnb??dT8@V^QXFk>8HaqO-xAAsISf`_ugM*^}-G(odusS5kL4>x}tUhl? z=;kLq&&s8Iz!LC8rWpk9Zat^`!z?Xs|EwYG_{cvsWEkTL4JXTkNLHexZG&`3<6P6( z{TLr?wEbcDdr`BX2BY%iQ_Go|-#bFY_JAKoJ{D^pP!dwSf9;(^cO^i#hSTARZM$RZ zL>;5U6Wg|(j&0jc$9BiIZQJT3Ur+A+1K;EhZq0WMYOTFi)!Oww&&)pAG`x2{&z2+z z{qv=Py^7*UYjE6DzU0h5&FoQaq;T`7r1o$0G87K2hg!iN0@7!33?jo9UMXEyI-%oP z{g0=V&du5K#^)@tP}Qxe2wr1)AHFC@->L~X2Z(W5iQ>BVIDS;PGpOl$&!TR{v6I%@>Dhx({joKG(oNC6H19X3I z>?)g{49d$+7ul?=WLZEAWXxPIuV=O(7Dl7thAiA{r~b?L2ZpxyLCg9su5b`kX+3vd zEIgD`d!MqqWpBr@O8ruA^VNP3(l?xGQEi=M%s8tTx#Th(73!l;pX8v)#?e*dT|-g= z<5dfI@id(LXQki2wkvw&%bFCS`@gT=jvu>`+z6JyVkz%d|rTy@=9K?ab%dI zc((1yKJPN?@Afw&j$qc8;cci*PgSOY3wJmGUSH7@sF)MBTeCTCIJ+^La!Wcn$6Uo{ zrva6rWZh=7O^)rId#0?hWLf**W;H+IIhzKrzuFW}3C1K*3wrZpZW%LLlnXwf3)8~T zXep#c%X&a-SSp_9(wFfiAsIsBR=7;(a(||5AW$i=qEuW|TP#4?_=U3=>6mB%q4E`Ms)d?!Akcv&9Ki zQF}$>BM1KI!cMqBA@Huj&c}EJ`FyU{MhFrrjqiB$?OQCLVuwFCpQ?*kH2Uvzd;j9` ze$W*FAnY}>1dkGH4r<}8(9NNIrBxqD;}wTmqabyLGQ37VLV|fwKS6VjDq@bR`#p&;ffBD;m^Ubn=>a7jOwL z=ZQq`&-smKV(8&NoBP4QAn9Tb1G@$1-^O#;f9%Gk%I4X$Z%->{^-$_#tHv^&;F@cc z@JQ2z_V3?(U+q4rcb>iSCZ*3=26;PGfet>Zm!X=sB=4*4skk~4yu4Vj$afV*Sc8qN zQ(<|v-lm2|FZ5-?(I$p~7#;~b>kle~#7E?&bi0x>QI@e9s79V$nigh91+dcq-!roD zJpQbK1U`a}bkXJBpY1Y(TLzKegZv%R+eSlqXb2j>$iOmle{!FoI+T0&1glnbLmzyX z`sQCQXo$wLyCszB_Um8t%5m4quLPi;w}8yYC((9odP^d#DNZ+KFMs^fHh96h@a?jx z*b}{;>p{r4h+&k@!Hk9WZsq`Qf|8tF)YZv9OGn?g&XR~P<@q%!z9$AjRx8;ZmRRYZ zHwj?Bph?;9JYzp)v%uE8HA$_L+SSdi3tYZ>$`ugV?dJ}G%VS)>_w}Gb2xo1iVTE{3 z*)LUzlf<1S?tPii4V}#~X=uZW+yr{VjL7qVIaB-{0_yI01TfV@lgI4nNEu zJTsWGPQqw_O6!rh^(d^zb8L($4Pr`ex*|XdIikMi@Flk#u2x&kT2MeCU+Y4wFok_4`4|)a{X)uOOeJ3C!3h1~^zfB+HX!9mFP|iG zUEmenZ&)I6Wc`H)y13^4YvSXiu=j4rc3-k`keblq?q(`ESI*RQ7sS9k)}0JhyiEUQ z)s|StD?{EP6r4#*tFq{u+xO8t@tsfsjPaK6aLr9;*`JMETn8z z%m#!PGWr(%R4OaQeKvcUx?56B6e%E8g2n7vSQq4mnm&%j6$o>?#WVV+wku|dc>ejB zFSK|44W>7Ln9wyjyj9DZ6ohn$;CEoTUu~q2nTXJrTA&FgvkY<#Dib8Qb1&)NjDnw($s^g*U-li2u_YbzauQV* z(;YI0_=oF49;HV(dWux#PG?KO^fkJ7AfsNc2EPbTL);_#O}C#>6Ojl8CF71pNZ2n| zWO|`Yx7CvGy^b;%P0mr;ZDqK3s-_pr`U?xOQv22v2RSAU9I9h<^lN6ASV!G@w$o$b9ft8Gpp=*!V}E)sLMJB!kQQ$KPO@lW5bWwqwG;wb2= zCW+>kEbmf=xobyYAaZ?W6`Ff1t4fK#>br8Z+WaE`A%5A!Y2=UwZY`UI>ez~NV##5B zW0Y9080XB)_32nR0F@7{xY2Wh8M`@iqV;=6*{(ZYDTOYoxp}b?6tg<~2fyO}LXYEh z5{h{IL5!Sgv`9m~-gs`j`%0J@4Eseo6q)IgAy>wL=8n|M*(Y%)?RqnYbo+y0U32Q_ z7QAQsfnq+T95NpG()5T*13cd3ll}20G#=$=U6PnsMD(Y3Wp0R}7BE-8j~2aGA|XM3 z24X>RlCW3kJw9H#M9Nb9qh>Q=P5GqDYEc{rf-y4DzT+C4;7a}5v z0*5}M8LZyI>Rb?o2{!InKF(-Ys>^5|$K}JWd3Z;6RP%uzwcx}vh4UN7_13SDtGmDY znawwk}H zRfjb40^nj9A`xmK<`f5Q9(FxDA zy75=;16ZnK0-O^Iu9H<}BC79qXkvMHllwS!9LdQZ-!$luUl)}?eY;%!&2eIfBfF4L zK4U-2`Xz+F#|3mN#YC_)iumGMsK;n)EA<5{N6&!4f{tyy$qdR3^KmK2(i%T7En6C_ zS2u1$YjIeWf)AL@uSxFjzScM)fY$ss3K4kFy5kO*1K%KP4EG}8VvM##x4DV1@dUGR z+p}!DmsJ=a@a=#A%mG3`%u#@i4X;8`i)#~d z?wgMU0S7__0nK@KqM7L9p)0Gh{9qBM5!jVaU4BZ$_deq)@=InYmpDC(wA+PZqQ3%H zW8wkm0kROfrGb*sNjwdsbqQQ`d%!!JnaY#G3Ce|V=_stDtz>^f#hy+nLEMUF zOg090V2SzXldp0dIv)-sa8CSt1>n?Q9lQQn7c*mSQGwY2Jw>$*31r-CaDF4gr&(YE#Ewh6B+3-vPV^5OppeDb0j?uFtYL>XDB2X*iX}hG?E`9Y2mcKP= zcLtzNdjT0GB5+s(|Fnn3^e{$;=_$4wD;@t8V>;B2oA>;yFaQmHjh56a5X$Q|`}b)` z5EX_q%V8J+FBK;cHsapkUz)Usre*i3NB$1UtnwcB?4dzOMx*V7E2)3hN}Y#~7a5fk)WZHEmvZ-)kIw%VykuB;5q?m{nI&GVrUdcd87$YRnJ zGdzR8T0wlorB2qqx@4Lv($vJKp1a0H+odel^*iFea(fcIRzl^6spubeAjDy%8ZYO> zq^)$66k2!gq9WajG3e!EDAMD)qS-~in{ozCxZ5Qx|NK=%2iYGk17eg|0=pgux1rM$ zXxp-qe$(vf<-nG*q|C^K5-!5Z7=r3m@#8|OHJQPZ$+QUmRL5A@M6Y%O*vva>FuYmg zZi2*xevU^HOX*06CtZiw{Q(s*(S1b}Qb?s;SZ=Gs04Nypk9^h5j4+Adc7&M5ElJED zPr#@pR1qd0o+Ljn{oJGY@peePPBE@G?ex?nk3ejHQq~3GwpSA8qj%R;`lYKF%=glEC37zI${Xn}Bojry@s3M-A=cwar8Xe!Fo3uy@5>RX^{=htPLc`M zjiJyp4{OxLIBo2#1Yy2qhN8hc9(P8-S2`Rd#N9^OmUuWG( z;-$f~!{Cu5Iu zg^-cQ*H}qyi-g%y0$8>8z~YasSKRj*y$oPN+CL1~P?BIgO^v@!ahB9Rt?*9((YIhO z6q*}dl_aF1$3whtE$|SS3v_1mqznL8S^+e886_kW|yBGVyVVf+AE_TO_?Y ztLp|`Tw~TSj*S>RJ0&j&epDLX`(AfXo`!^=b z4n6d@7qZ3{;$tl8meqhTUw*cHKC~=DtvLMbDxt_X_zwj@dU_OF|H+)fpb-h`{Cqxr zOGE?z&7KGRZwkDxpsKkc_}kYV_Zy|qmQj4-(RVr0^v5T@>i+$*W#%!qc3`*(_aB+X zOXsZ6T(&KBJByW}qjRFf-+qmCbu#w3$eKZ_YIA<}9^4;qJ#6n2!Tz6Z>CsLkT%y&a z4WzUJ-J!i-UpQVxUCuE{wHLgZ=Bo9pBlXeqWGLE?NEM9Ed3yP2p>xl$%0CaD(d7Wa zoJ5O_=vz*ZQ$N|rJs+sj7I=M%zc=S&KDK4NRlPI?2R(lWhaGkxsF3W|rllqlGS1YhiBaDuWh z<84)sBk`wSp@TrHU{H<>8~zwBx*?eIKfW}ugGYr}h5HRy+JXUN3`rp*LACly#WFF? zS1I%3JW|Tt!8H06^$ag+(B6OT0km}`_hD8)_(9goW6o#9q#Z*4YqySt+$_#v*_-N3 z8VPxk-2?B6NAqwz978NVN89NFt7_G_0(`x$R9&3Q<*`|va59D=Vq)U`h>hCU=|!}6 zpUw8uv-4DC{*qU`1_N)GlLR-HRhRH$$r4>P_%o8H3Yn37X51GAHR9G>5YB-M$5`;! z!^!ujhuWy%GzRFUR2i)|B^HOz)P^#?g|kasi(O|5Ck=D5;N-CcBJGvkvxuyzvzP1O zvWX-c_a_ahI-D?I{|k^jNS2x8$st{p4sb}$OMkqupe z)*c(W-1%`x8Md^zb zxt_C7vo-h}5TWM*jSImu51H9;1IwPW8z{$CMY=@SpUiM%@U^=g^6=iS$6RlGIw#uR zm)aKhRDMMqN`C}cmvjutKvn%7>*m+&dpQv87&$UAVPPZWWUAbbch_M$*5Qy-`pZ~% z?TYfd#)cr@D|381dY!RjiyYC4(uUq@LQqIEloxAcpNaClI(aIr)z@qJP^?H(? z;!A4rDes&!OP7HtZCE=b_(e9Jl7M63!kfkrb z!v}bN4{-JdN&HR9!H)xUZ#KBeo$9sR(&&uxXM0*qzISo!K;m`}U%>ObhA-M%IIUV zt!#Sp3@kiqE8OWyTa|cWH~Jh$zK@gG)!b*%e7Yd6RA`@#_zmhCjm8_#LL6e~Ra z`1&5TuPoXBymve9iBFy2Hfd8EFH$OuC7&BM_Sy}|u<@aj$h-BHK}+`-E89+fG9(l& z@I;i$llgOk9S)ghQD4HL#YXD2O{VJuq&W3s{C-IL*4aFhxr!9fqS=}1c&^1~h7Sk4 z4IQRK&GcTGs-AE{Y-PvaFqynMd3ej1fwT8PjSF+U8F`#iaB$Wd2~Mbua1S}O32PYA zK!;bNYj@Tj(uWsO8)SexSX|R9?dsKF-vT_d{uTGh?PiJj>BJDW)`Iyk2DGZ1IcbM9 z=Zvel;LDD;)M#t7H^8y`vKw+y(yaNYDrXUlZ-GEgLlPP9w32v&?ayEA)Ck|hE@X2= z-^7g=WN1KnHTKLT*>~#2GE!SK4DM&6=IjnnPf+Lbc~s!%247u=Xfn z*E*#tv;H-MUc`K!@l&&CMYwKft_Vc){ZHbP$>g!j5m|}{&)mijD|!Lw+g>R zjvE(YEIV03)R{5-#+d{>E=bt{8yLU_bwrEE@OVR2ogBEj}}{>L5UVfAXlQ-9n6Un`G)wdO++t{c;VF&vx4eMns3hoehqItsBX<1& zd{mjAaE?P7;iENwf<@URKIHARZ+{6s*2g!g+xq}mT7OT(aQjKM_1Ne)LX6GV5Mr*T ztL3l2C;k+fc|n^}mMerdQ4+LW>DMgo&AI(7NL+jSbG#7X>s5MVX14wfgvuh~gafmM ziD)s!2JVB_FYfY_$nI?7v~Hbc72iQV?iM@Ar7M~39=tZY-rkSDts7jQF;9dSHK`iG=2eUD;TIjF&Vc;DcNN#IUu)@Fv1NNi>7+FKik z`(T1y7<+oTuHNDMBE?AuN&L3+Rl{tsc>$#X0WyX~%3LBrj~eJ{x)%i&lFUk71uAhMc1JZRTyuuIC@$1>aHdD(XglRe(pMYh~2T%G4V2Ka4vXdO0h(ly5gkbkw|V#%;J=;CJZwRoL--hdEEk;x8_iluy6+uC zmoLzO+L378%V@Ba>I`2>B|8OEXiiI}MdIiDf^YZ?w$dFdJXgootslGCoyQ)uY@tIMnvYt-ouQ#wxKQ7G?e1l=3C;gtj}Yq=6L6J z5TWmZs@@i<&j_%!(ujvagr!Z}+6Tq5v0#F2!9p7Gcdqvx@>i;pGm8-mUg zi7-Fug-KY^IsT4Tp^uD?{2!S8V~AdbqprWgW{$&DNPtXNo>a=^fCVnskjKWR3C?KR zsS_zw$(y7Ur$g09IbX;=E|$&pH#qojAD8ZAbTwwOf9mCWF-;Cj@M9~$+jIQsFf{qu za@xL&TkT{`_PSF?&Jxq6+q#?gYqLepai$F#ab-}pLq>t&@U&ZPMq2+2t;<_xW;|DJ zil_kAkLjd*s-^hM*@$%?d;OSF`aY@n!)>GRgF9ud)e(xigC&+gV0(~Al#-3sMk$xg;3^ME1?9b<-EycEkPXmR&l*0+M>q1cOQ7ML1I^Fosh*FE-Fzz zNg$7gp^MmSECpULX!wu-?=e6K8B0QczduBw?s1nDwUpn&OZQok9jl+r+~G~HkjkkG zVC1~}?O_bBZWT9dtI*1W&A&(bqn(q7|NMhrcs>q-kkHF|R)&y#TF0@{5bD?^; z zkS=H5lmxbPr5VrITEnslAfD}h)~)tEriO2Z5!H4nF}e^E3EPJ} zfo*RPiz92#HauLU`4L{nouL}pxukI!gI9@Gx;IS~C=1k(DwW~Ox9$8nW37rQck?m< z9o~5xZ~2;gLC|;a67AVRQN;rj58IN>CLZ*bRq%K^jH50%Jv_Jpa-~is&vMx>N#wUO z4%stDl~`1PByG%9tWxqti^j27KmYt=>HWebe~T#;KJE^^2qd_sfOblu|ALGaL& z-5a{AJ?)fmb~nEcw+=;gyJsJP?OE}6*|d`-t8{l@QWc9CzdZz_8Nt-wOH-vYMC7y} znJXa^Zu6WoQ)@XhJ9&{D7d~~YsvF*g$$#Z}HL5!ZiZHRA9>LJO7W=)wX#!yS`` zChSEU!5^C{8mdHwRgw52$0dU6Xk)Z6Q>?OF$wH_Fz-8G2hq@QQqAshbVYQe+Jnvra z+(xc@Hfh24&OBE||z^IeU$FOvHdDmdRF>oc$EBZ3Ly1pg-rBAoFB% zed^T-M1;~!>!5P*WK5|K6v;kpAG^m}pYKMY9xlU{QU;Xcd{7$m*rVKI?7O#)7G3p|C%B0y+R=hVoj>8)Uaan=c*GcQOnIU=r)eHejukU4Br>XU$v&Es*G|-ebSBNGCAR&>kqS z4(Ujwuj5`hSZAwoTKdNJsk&JFPM9SGrBnUDbA_xI_GyzPm8!xaiid8T4&)}xGYXC4 zi`~HfGI++Jctp=H#F6s{kY9K0|IlkT?}n{yXa!Sq-OtO5f~zhv2FZJR#Nr1e_2fdh z2FI~I4(Y4=3D5?;&qQ0!HJ3iS1UDjqaJEE_ae@ z_&oJ-1ke<`HP9s)obfyxK>s2oq}q=JdR;`}jH!rhe-s4^NFrwfezh3$bT)*D+`Fb& zisHILTLW8bLN7Z_c{JRfDHiqNn-0S3=5w;KRsFtUfP;ZC|CbB#zpQ8e{|%V`FPwpq SwTXeFvz?8BqZOPV#D4(I!TaKqM=XL!% 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 literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n022004l.afm b/pdf2swf/fonts/n022004l.afm new file mode 100644 index 0000000..0bafed5 --- /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 0000000000000000000000000000000000000000..f1da6121bbab21d2273105b9216fd10690998ba3 GIT binary patch literal 50493 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 literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n022023l.afm b/pdf2swf/fonts/n022023l.afm new file mode 100644 index 0000000..718ec5d --- /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 0000000000000000000000000000000000000000..107a513372db39ce5cb8c7a685e9262b627bbdac GIT binary patch literal 44404 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 literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/n022024l.afm b/pdf2swf/fonts/n022024l.afm new file mode 100644 index 0000000..8e614b8 --- /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 0000000000000000000000000000000000000000..8b7c24ff3a4fb9c650b7cd17761344e3b84a141f GIT binary patch literal 51527 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 z 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 Z!KeWSgCPu(b5awFO7e3Pi?X>Im;sA*muUb1 literal 0 HcmV?d00001 diff --git a/pdf2swf/fonts/s050000l.afm b/pdf2swf/fonts/s050000l.afm new file mode 100644 index 0000000..d8c1936 --- /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 0000000000000000000000000000000000000000..d0505e46cd55172d6307cb0dcdcd2e9030280e16 GIT binary patch literal 33709 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 YOF0De99%oan$)~pXgt}QEYWn6~%i-{_-Z1|* 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 literal 0 HcmV?d00001 diff --git a/pdf2swf/pdf2swf.1 b/pdf2swf/pdf2swf.1 new file mode 100644 index 0000000..f17bc61 --- /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 0000000..0d81796 --- /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 0000000..a0aed8d --- /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 0000000..8636bba --- /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 0000000..9792fd2 --- /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 0000000..947f9a9 --- /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 0000000..9681b68 --- /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 0000000..ecf2eea --- /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 0000000..815cca3 --- /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 0000000..b0f3143 --- /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 0000000..c642660 --- /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 0000000..ae9b732 --- /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 0000000..3ea4374 --- /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 0000000..c9f4fec --- /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 0000000..cfc64d3 --- /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 0000000..485a7cb --- /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 0000000..f651678 --- /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 0000000..bf12577 --- /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 0000000..7c81153 --- /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 0000000..777b56a --- /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 0000000..ec625ef --- /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 0000000..ee85b95 --- /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 0000000..76428d0 --- /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 0000000..d746083 --- /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 0000000..7b8f271 --- /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 0000000..4c3b95f --- /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 0000000..0096d4b --- /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 0000000..34d8f99 --- /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 0000000..16b311b --- /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 0000000..0435d90 --- /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 0000000..1abf9a5 --- /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 0000000..2056c4d --- /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 0000000..4ca8cfe --- /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 0000000..70144b8 --- /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 0000000..adb8c97 --- /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 0000000..7e00510 --- /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 0000000..eca0ce4 --- /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 0000000..a9f18b3 --- /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 0000000..f9c1067 --- /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 0000000..fa4f740 --- /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 0000000..eebf460 --- /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 0000000..d7de97a --- /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 0000000..ae55d23 --- /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 0000000..e679db9 --- /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 0000000..c2ac6b1 --- /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 0000000..a144d2c --- /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 0000000..35adfdf --- /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 0000000..ea8536f --- /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 0000000..6ad0c5a --- /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 0000000..6e61844 --- /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 0000000..0db033f --- /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 0000000..1af8742 --- /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 0000000..0afcc94 --- /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 0000000..50345bb --- /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 0000000..d70b9f2 --- /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 0000000..e2260d0 --- /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 0000000..c09d8f5 --- /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 0000000..cc0324c --- /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 0000000..28289fb --- /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 0000000..cac386b --- /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 0000000..732726d --- /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 0000000..6593267 --- /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 0000000..2a959ee --- /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 0000000..6b50cee --- /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 0000000..d87977b --- /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 0000000..a5699df --- /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 0000000..c9ec238 --- /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 0000000..a612006 --- /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 0000000..d522771 --- /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 0000000..fff8284 --- /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 0000000..255aeff --- /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 0000000..2f82afa --- /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 0000000..8624c44 --- /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 0000000..da73a71 --- /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 0000000..d1e484e --- /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 0000000..77597b6 --- /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 0000000..0918cb1 --- /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 0000000..fc9fda1 --- /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 0000000..0ab12a7 --- /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 0000000..2bf1d9a --- /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 0000000..a5b540d --- /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 0000000..9788f70 --- /dev/null +++ b/stamp-h.in @@ -0,0 +1 @@ +timestamp -- 1.7.10.4