OSDN Git Service

イニシャルコミット。
authorLogue <logue@hotmail.co.jp>
Fri, 17 Feb 2012 12:26:42 +0000 (21:26 +0900)
committerLogue <logue@hotmail.co.jp>
Fri, 17 Feb 2012 12:26:42 +0000 (21:26 +0900)
WxWidgets-2.9.3でビルドできるようにした。

81 files changed:
BigEndianBuffer.cpp [new file with mode: 0644]
BigEndianBuffer.h [new file with mode: 0644]
COPYING.txt [new file with mode: 0644]
DefaultNames.cpp [new file with mode: 0644]
DefaultNames.h [new file with mode: 0644]
DefaultNames.txt [new file with mode: 0644]
GenericEndianBuffer.cpp [new file with mode: 0644]
GenericEndianBuffer.h [new file with mode: 0644]
LittleEndianBuffer.cpp [new file with mode: 0644]
LittleEndianBuffer.h [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
Physics/Makefile.am [new file with mode: 0644]
Physics/Makefile.in [new file with mode: 0644]
Physics/PhysicsDocument.cpp [new file with mode: 0644]
Physics/PhysicsDocument.h [new file with mode: 0644]
Physics/PhysicsEditor.cpp [new file with mode: 0644]
Physics/PhysicsElements.cpp [new file with mode: 0644]
Physics/PhysicsElements.h [new file with mode: 0644]
Physics/PhysicsTreeItemData.cpp [new file with mode: 0644]
Physics/PhysicsTreeItemData.h [new file with mode: 0644]
Physics/PhysicsView.cpp [new file with mode: 0644]
Physics/PhysicsView.h [new file with mode: 0644]
README.txt [new file with mode: 0644]
Resources/shapefusion.icns [new file with mode: 0644]
Resources/shapefusion.ico [new file with mode: 0644]
Resources/shapefusion.rc [new file with mode: 0644]
Resources/shapefusion.svg [new file with mode: 0644]
ShapeFusion-Info.plist [new file with mode: 0644]
ShapeFusion.xcodeproj/project.pbxproj [new file with mode: 0644]
ShapeFusionApp.cpp [new file with mode: 0644]
ShapeFusionApp.h [new file with mode: 0644]
ShapeFusionDocManager.cpp [new file with mode: 0644]
ShapeFusionDocManager.h [new file with mode: 0644]
ShapeFusionMain.cpp [new file with mode: 0644]
ShapeFusionMain.h [new file with mode: 0644]
ShapeFusionMenus.cpp [new file with mode: 0644]
ShapeFusionMenus.h [new file with mode: 0644]
Shapes/BitmapBrowser.cpp [new file with mode: 0644]
Shapes/BitmapBrowser.h [new file with mode: 0644]
Shapes/BitmapView.cpp [new file with mode: 0644]
Shapes/BitmapView.h [new file with mode: 0644]
Shapes/CTBrowser.cpp [new file with mode: 0644]
Shapes/CTBrowser.h [new file with mode: 0644]
Shapes/CTView.cpp [new file with mode: 0644]
Shapes/CTView.h [new file with mode: 0644]
Shapes/FrameBrowser.cpp [new file with mode: 0644]
Shapes/FrameBrowser.h [new file with mode: 0644]
Shapes/FrameView.cpp [new file with mode: 0644]
Shapes/FrameView.h [new file with mode: 0644]
Shapes/Makefile.am [new file with mode: 0644]
Shapes/Makefile.in [new file with mode: 0644]
Shapes/SequenceView.cpp [new file with mode: 0644]
Shapes/SequenceView.h [new file with mode: 0644]
Shapes/ShapesDocument.cpp [new file with mode: 0644]
Shapes/ShapesDocument.h [new file with mode: 0644]
Shapes/ShapesElements.cpp [new file with mode: 0644]
Shapes/ShapesElements.h [new file with mode: 0644]
Shapes/ShapesTreeItemData.cpp [new file with mode: 0644]
Shapes/ShapesTreeItemData.h [new file with mode: 0644]
Shapes/ShapesView.cpp [new file with mode: 0644]
Shapes/ShapesView.h [new file with mode: 0644]
Shapes/utilities.cpp [new file with mode: 0644]
Shapes/utilities.h [new file with mode: 0644]
Sounds/Makefile.am [new file with mode: 0644]
Sounds/Makefile.in [new file with mode: 0644]
Sounds/SoundsDocument.cpp [new file with mode: 0644]
Sounds/SoundsDocument.h [new file with mode: 0644]
Sounds/SoundsElements.cpp [new file with mode: 0644]
Sounds/SoundsElements.h [new file with mode: 0644]
Sounds/SoundsView.cpp [new file with mode: 0644]
Sounds/SoundsView.h [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
config.guess [new file with mode: 0644]
config.h.in [new file with mode: 0644]
config.sub [new file with mode: 0644]
configure [new file with mode: 0644]
configure.ac [new file with mode: 0644]
depcomp [new file with mode: 0644]
install-sh [new file with mode: 0644]
missing [new file with mode: 0644]

diff --git a/BigEndianBuffer.cpp b/BigEndianBuffer.cpp
new file mode 100644 (file)
index 0000000..e8edd84
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include <cmath>
+#include <iostream>
+#include "BigEndianBuffer.h"
+
+BigEndianBuffer::BigEndianBuffer(unsigned int _size):
+               GenericEndianBuffer(_size)
+{
+
+}
+
+BigEndianBuffer::BigEndianBuffer(unsigned char *_data, unsigned int _size):
+               GenericEndianBuffer(_data, _size)
+{
+
+}
+
+BigEndianBuffer::~BigEndianBuffer(void)
+{
+
+}
+
+short BigEndianBuffer::ReadShort(void)
+{
+       if ((unsigned int)(mPosition - mData + 1) < mSize) {
+               unsigned char   hi = *mPosition++,
+                                               lo = *mPosition++;
+
+               return (short)((hi << 8) | lo);
+       } else {
+               std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+unsigned short BigEndianBuffer::ReadUShort(void)
+{
+       if ((unsigned int)(mPosition - mData + 1) < mSize) {
+               unsigned char   hi = *mPosition++,
+                                               lo = *mPosition++;
+               
+               return (unsigned short)((hi << 8) | lo);
+       } else {
+               std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+long BigEndianBuffer::ReadLong(void)
+{
+       if ((unsigned int)(mPosition - mData + 3) < mSize) {
+               unsigned char   a = *mPosition++,
+                                               b = *mPosition++,
+                                               c = *mPosition++,
+                                               d = *mPosition++;
+               
+               return (long)((a << 24) | (b << 16) | (c << 8) | d);
+       } else {
+               std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+unsigned long BigEndianBuffer::ReadULong(void)
+{
+       if ((unsigned int)(mPosition - mData + 3) < mSize) {
+               unsigned char   a = *mPosition++,
+                                               b = *mPosition++,
+                                               c = *mPosition++,
+                                               d = *mPosition++;
+               
+               return (unsigned long)((a << 24) | (b << 16) | (c << 8) | d);
+       } else {
+               std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+void BigEndianBuffer::WriteShort(short v)
+{
+       if ((unsigned int)(mPosition - mData + 1) < mSize) {
+               *mPosition++ = (v >> 8) & 0xff;
+               *mPosition++ = v & 0xff;
+       } else {
+               std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void BigEndianBuffer::WriteUShort(unsigned short v)
+{
+       if ((unsigned int)(mPosition - mData + 1) < mSize) {
+               *mPosition++ = (v >> 8) & 0xff;
+               *mPosition++ = v & 0xff;
+       } else {
+               std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void BigEndianBuffer::WriteLong(long v)
+{
+       if ((unsigned int)(mPosition - mData + 3) < mSize) {
+               *mPosition++ = (v >> 24) & 0xff;
+               *mPosition++ = (v >> 16) & 0xff;
+               *mPosition++ = (v >> 8) & 0xff;
+               *mPosition++ = v & 0xff;
+       } else {
+               std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void BigEndianBuffer::WriteULong(unsigned long v)
+{
+       if ((unsigned int)(mPosition - mData + 3) < mSize) {
+               *mPosition++ = (v >> 24) & 0xff;
+               *mPosition++ = (v >> 16) & 0xff;
+               *mPosition++ = (v >> 8) & 0xff;
+               *mPosition++ = v & 0xff;
+       } else {
+               std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void BigEndianBuffer::WriteFixed(double d)
+{
+       WriteLong(static_cast<long>(std::floor(d * 65536.0 + 0.5)));
+}
diff --git a/BigEndianBuffer.h b/BigEndianBuffer.h
new file mode 100644 (file)
index 0000000..5646bb1
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+//
+// BigEndianBuffer
+// Utility class to access big-endian data buffers easily
+//
+
+#ifndef BIGENDIANBUFFER_H
+#define BIGENDIANBUFFER_H
+
+#include "GenericEndianBuffer.h"
+
+class BigEndianBuffer: public GenericEndianBuffer {
+public:
+       // self-allocate data buffer
+       BigEndianBuffer(unsigned int _size);
+       // use a pre-allocated buffer
+       BigEndianBuffer(unsigned char *_data, unsigned int _size);
+       ~BigEndianBuffer(void);
+       // read big-endian values, advance position accordingly
+       short ReadShort(void);
+       unsigned short ReadUShort(void);
+       long ReadLong(void);
+       unsigned long ReadULong(void);
+       double ReadFixed(void) { return ReadLong() / 65536.0; }
+
+       // write big-endian values, advance position accordingly
+       void WriteShort(short v);
+       void WriteUShort(unsigned short v);
+       void WriteLong(long v);
+       void WriteULong(unsigned long v);
+       void WriteFixed(double d);
+};
+
+#endif
diff --git a/COPYING.txt b/COPYING.txt
new file mode 100644 (file)
index 0000000..dcfa4c2
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 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.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/DefaultNames.cpp b/DefaultNames.cpp
new file mode 100644 (file)
index 0000000..3eb923f
--- /dev/null
@@ -0,0 +1,648 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "DefaultNames.h"
+
+#include <wx/textfile.h>
+#include <wx/tokenzr.h>
+#include <wx/stdpaths.h>
+
+static const wxString alienNames[] = {
+       _("Marine"),
+       _("Minor Tick"),
+       _("Major Tick"),
+       _("Kamikaze Tick"),
+       _("Minor S'pht"),
+       _("Major S'pht"),
+       _("Minor Invisible S'pht"),
+       _("Major Invisible S'pht"),
+       _("Minor Pfhor"),
+       _("Major Pfhor"),
+       _("Minor Projectile Pfhor"),
+       _("Major Projectile Pfhor"),
+       _("Green Bob"),
+       _("Blue Bob"),
+       _("Security Bob"),
+       _("Assimilated Bob"),
+       _("Minor Drone"),
+       _("Major Drone"),
+       _("Big Minor Drone"),
+       _("Big Angry Drone"),
+       _("Possessed Drone"),
+       _("Minor Cyborg"),
+       _("Major Cyborg"),
+       _("Minor Flame Cyborg"),
+       _("Major Flame Cyborg"),
+       _("Minor Enforcer"),
+       _("Major Enforcer"),
+       _("Minor Hunter"),
+       _("Major Hunter"),
+       _("Minor Trooper"),
+       _("Major Trooper"),
+       _("Mother of All Cyborgs"),
+       _("Mother of All Hunters"),
+       _("Sewage F'lickta"),
+       _("Water F'lickta"),
+       _("Lava F'lickta"),
+       _("Minor S'pht'Kr"),
+       _("Major S'pht'Kr"),
+       _("Minor Juggernaut"),
+       _("Major Juggernaut"),
+       _("Tiny P'fhor"),
+       _("Tiny Bob"),
+       _("Tiny Flick'ta"),
+       _("Green VacBob"),
+       _("Blue VacBob"),
+       _("Security VacBob"),
+       _("Assimilated VacBob"),
+};
+
+static const wxString collectionNames[] = {
+       _("Interface"),
+       _("Weapons in Hand"),
+       _("Juggernaut"),
+       _("Tick"),
+       _("Explosion Effects"),
+       _("Hunter"),
+       _("Marine"),
+       _("Items"),
+       _("Trooper"),
+       _("Pfhor fighter"),
+       _("S'pht'Kr"),
+       _("F'lickta"),
+       _("Bob"),
+       _("VacBob (Inf only)"),
+       _("Enforcer"),
+       _("Drone"),
+       _("S'pht"),
+       _("Walls 1 (Water)"),
+       _("Walls 2 (Lava)"),
+       _("Walls 3 (Sewage)"),
+       _("Walls 4 (Jjaro)"),
+       _("Walls 5 (Pfhor)"),
+       _("Scenery 1 (Water)"),
+       _("Scenery 2 (Lava)"),
+       _("Scenery 3 (Sewage)"),
+       _("Scenery 4 (Jjaro)"),
+       _("Scenery 5 (Pfhor)"),
+       _("Landscape 1 (Day)"),
+       _("Landscape 2 (Night)"),
+       _("Landscape 3 (Moon)"),
+       _("Landscape 4 (Space)"),
+       _("Cyborg"),
+};
+
+static const wxString classNames[] = {
+       _("Marine"),
+       _("Bob"),
+       _("Marathon Drone"),
+       _("Possessed Drone"),
+       _("S'pht'Kr"),
+       _("Pfhor Fighter"),
+       _("Pfhor Trooper"),
+       _("Hunter"),
+       _("Enforcer"),
+       _("Juggernaut"),
+       _("Drone"),
+       _("S'pht"),
+       _("Cyborg"),
+       _("Assimilated Bob"),
+       _("Tick"),
+       _("F'lickta"),
+};
+
+static const wxString damageNames[] = {
+       _("Explosion"),
+       _("Electrical Staff"),
+       _("Projectile"),
+       _("Absorbed"),
+       _("Flame"),
+       _("Claws"),
+       _("Alien Projectile"),
+       _("Hulk Slap"),
+       _("Compiler Bolt"),
+       _("Fusion Bolt"),
+       _("Hunter Bolt"),
+       _("Fist"),
+       _("Teleporter"),
+       _("S'pht'Kr Bolt"),
+       _("Flick'ta Claws"),
+       _("Flick'ta Projectile"),
+       _("Crushing"),
+       _("Lava"),
+       _("Suffocation"),
+       _("Goo"),
+       _("Energy Drain"),
+       _("Oxygen Drain"),
+       _("Drone Bolt"),
+       _("Shotgun"),
+};
+
+static const wxString effectNames[] = {
+       _("Missile Explosion"),
+       _("Missile Contrail"),
+       _("Grenade Explosion"),
+       _("Grenade Contrail"),
+       _("Bullet Ricochet"),
+       _("Alien Weapon Impact"),
+       _("Flamethrower Burst"),
+       _("Pfhor Hit"),
+       _("Marine Hit"),
+       _("Bob Hit"),
+       _("Assimilated Bob Hit"),
+       _("Enforcer Hit"),
+       _("S'pht Bolt Impact"),
+       _("Seeking S'pht Bolt Impact"),
+       _("S'pht Bolt Contrail"),
+       _("Staff-Bolt Impact"),
+       _("Staff Impact"),
+       _("Hunter Bolt Impact"),
+       _("Hunter Hit"),
+       _("Plasma Impact"),
+       _("Plasma Overload Impact"),
+       _("Plasma Contrail"),
+       _("Fist Impact"),
+       _("S'pht'Kr Bolt Impact"),
+       _("Major S'pht'Kr Bolt Impact"),
+       _("S'pht'Kr Hit"),
+       _("Trooper Hit"),
+       _("Lamp Breaking 1"),
+       _("Lamp Breaking 2"),
+       _("Lamp Breaking 3"),
+       _("Lamp Breaking 4"),
+       _("Clank (melee hit)"),
+       _("Teleport In"),
+       _("Teleport Out"),
+       _("Small Water Splash"),
+       _("Medium Water Splash"),
+       _("Large Water Splash"),
+       _("Large Water Emergence"),
+       _("Small Lava Splash"),
+       _("Medium Lava Splash"),
+       _("Large Lava Splash"),
+       _("Large Lava Emergence"),
+       _("Small Sewage Splash"),
+       _("Medium Sewage Splash"),
+       _("Large Sewage Splash"),
+       _("Large Sewage Emergence"),
+       _("Small Goo Splash"),
+       _("Medium Goo Splash"),
+       _("Large Goo Splash"),
+       _("Large Goo Emergence"),
+       _("Drone Bolt Impact"),
+       _("Fast Drone Bolt Impact"),
+       _("Possessed Drone Bolt Impact"),
+       _("Drone Hit"),
+       _("Cyborg Grenade Detonation"),
+       _("Cyborg Hit"),
+       _("Fusion Dispersal"),
+       _("Major Fusion Dispersal"),
+       _("Overloaded Fusion Dispersal"),
+       _("F'lickta Hit"),
+       _("F'lickta Glob Impact"),
+       _("Water Flick'ta Hit"),
+       _("Lava Flick'ta Hit"),
+       _("Flick'ta Lava Glob Impact"),
+       _("Flick'ta Claw Impact"),
+       _("Juggernaut Hit"),
+       _("Juggernaut Missile Contrail"),
+       _("Small Special Splash"),
+       _("Medium Special Splash"),
+       _("Large Special Splash"),
+       _("Special Emergence"),
+       _("VacBob Hit"),
+       _("Assimilated VacBob Hit"),
+};
+
+static const wxString itemNames[] = {
+       _("Fist"),
+       _("Magnum Pistol"),
+       _("Magnum Magazine"),
+       _("Plasma Pistol"),
+       _("Plasma Battery"),
+       _("Assault Rifle"),
+       _("Assault Rifle Clip"),
+       _("Grenade Clip"),
+       _("Missile Launcher"),
+       _("Missile Launcher Clip"),
+       _("Invisibility Powerup"),
+       _("Invincibility Powerup"),
+       _("Infravision Powerup"),
+       _("Alien Weapon"),
+       _("Alien Weapon Magazine"),
+       _("Flamethrower"),
+       _("Flamethrower Canister"),
+       _("Extravision Powerup"),
+       _("Oxygen Powerup"),
+       _("Energy Powerup"),
+       _("Double Energy Powerup"),
+       _("Triple Energy Powerup"),
+       _("Shotgun"),
+       _("Shotgun Magazine"),
+       _("S'pht Door Key"),
+       _("Uplink Chip"),
+       _("Light Blue Ball"),
+       _("The Ball"),
+       _("Violet Ball"),
+       _("Yellow Ball"),
+       _("Brown Ball"),
+       _("Orange Ball"),
+       _("Blue Ball"),
+       _("Green Ball"),
+       _("SMG"),
+       _("SMG Ammo"),
+};
+
+static const wxString soundNames[] = {
+       _("Startup"),
+       _("Teleport In"),
+       _("Teleport Out"),
+       _("Crunch"),
+       _("Creak (Inf only)"),
+       _("Absorbed"),
+       _("Unused 1"),
+       _("Oxygen Warning"),
+       _("Suffocation"),
+       _("Energy Refuel"),
+       _("Oxygen Refuel"),
+       _("Can't Toggle Switch"),
+       _("Switch On"),
+       _("Switch Off"),
+       _("Puzzle Switch"),
+       _("Chip Insertion"),
+       _("Pattern Buffer"),
+       _("Destroy Control Panel"),
+       _("Adjust Volume"),
+       _("Got Powerup"),
+       _("Got Item"),
+       _("Bullet Ricochet"),
+       _("Metallic Ricochet"),
+       _("Empty Gun"),
+       _("S'pht Door Opening"),
+       _("S'pht Door Closing"),
+       _("S'pht Door Obstructed"),
+       _("S'pht Platform Starting"),
+       _("S'pht Platform Stopping"),
+       _("Loon"),
+       _("SMG firing (Inf only)"),
+       _("SMG reloading (Inf only)"),
+       _("Heavy S'pht Platform Starting"),
+       _("Heavy S'pht Platform Stopping"),
+       _("Fist Hitting"),
+       _("Magnum Firing"),
+       _("Magnum Reloading"),
+       _("Assault Rifle Firing"),
+       _("Grenade Launcher Firing"),
+       _("Grenade Exploding"),
+       _("Grenade Flyby"),
+       _("Fusion Firing"),
+       _("Fusion Exploding"),
+       _("Fusion Flyby"),
+       _("Fusion Charging"),
+       _("Rocket Expoding"),
+       _("Rocket Flyby"),
+       _("Rocket Firing"),
+       _("Flamethrower"),
+       _("Body Falling"),
+       _("Body Exploding"),
+       _("Bullet Hitting Flesh"),
+       _("Fighter Activate"),
+       _("Fighter Wail"),
+       _("Fighter Scream"),
+       _("Fighter Chatter"),
+       _("Fighter Attack"),
+       _("Fighter Projectile Hit"),
+       _("Fighter Projectile Flyby"),
+       _("S'pht Attack"),
+       _("S'pht Death"),
+       _("S'pht Hit"),
+       _("S'pht Projectile Flyby"),
+       _("S'pht Projectile Hit"),
+       _("Cyborg Moving"),
+       _("Cyborg Attack"),
+       _("Cyborg Hit"),
+       _("Cyborg Death"),
+       _("Cyborg Projectile Bounce"),
+       _("Cyborg Projectile Hit"),
+       _("Unused 2"),
+       _("Drone Activate"),
+       _("Drone Start Attack"),
+       _("Drone Attack"),
+       _("Drone Dying"),
+       _("Drone Death"),
+       _("Drone Projectile Hit"),
+       _("Drone Projectile Flyby"),
+       _("Human Wail"),
+       _("Human Scream"),
+       _("Human Hit"),
+       _("Human Chatter"),
+       _("Assimilated Human Chatter"),
+       _("Human Trash Talk"),
+       _("Human Apology"),
+       _("Human Activation"),
+       _("Human Clear"),
+       _("Human Stop Shooting Me You Bastard"),
+       _("Human Area Secure"),
+       _("Kill The Player!"),
+       _("Water"),
+       _("Sewage"),
+       _("Lava"),
+       _("Goo"),
+       _("Under Stuff"),
+       _("Wind"),
+       _("Waterfall"),
+       _("Siren"),
+       _("Fan"),
+       _("S'pht Door"),
+       _("S'pht Platform"),
+       _("Alien Harmonics (Inf only)"),
+       _("Heavy S'pht Platform"),
+       _("Light Machinery"),
+       _("Heavy Machinery"),
+       _("Transformer"),
+       _("Sparking Transformer"),
+       _("Water Drip"),
+       _("Walking in Water"),
+       _("Exit Water"),
+       _("Enter Water"),
+       _("Small Water Splash"),
+       _("Medium Water Splash (unused)"),
+       _("Large Water Splash"),
+       _("Walking in Lava (unused)"),
+       _("Exit Lava"),
+       _("Enter Lava"),
+       _("Small Lava Splash"),
+       _("Medium Lava Splash (unused)"),
+       _("Large Lava Splash"),
+       _("Walking in Sewage (unused)"),
+       _("Exit Sewage"),
+       _("Enter Sewage"),
+       _("Small Sewage Splash"),
+       _("Medium Sewage Splash (unused)"),
+       _("Large Sewage Splash"),
+       _("Walking in Goo (unused)"),
+       _("Exit Goo (unused)"),
+       _("Enter Goo (unused)"),
+       _("Small Goo Splash (unused)"),
+       _("Medium Goo Splash (unused)"),
+       _("Large Goo Splash (unused)"),
+       _("Major Fusion Firing"),
+       _("Major Fusion Charged"),
+       _("Assault Rifle Reloading"),
+       _("Assault Rifle Shell Casings"),
+       _("Shotgun Firing"),
+       _("Shotgun Reloading"),
+       _("Ball Bounce"),
+       _("You Are It"),
+       _("Got The Ball"),
+       _("Computer Login"),
+       _("Computer Logout"),
+       _("Computer Page"),
+       _("Heavy S'pht Door"),
+       _("Heavy S'pht Door Opening"),
+       _("Heavy S'pht Door Closing"),
+       _("Heavy S'pht Door Open"),
+       _("Heavy S'pht Door Closed"),
+       _("Heavy S'pht Door Obstructed"),
+       _("Hunter Activate (unused)"),
+       _("Hunter Attack"),
+       _("Hunter Dying (unused)"),
+       _("Hunter Landing"),
+       _("Hunter Exploding"),
+       _("Hunter Projectile Hit"),
+       _("Hunter Projectile Flyby"),
+       _("Enforcer Activate"),
+       _("Enforcer Attack"),
+       _("Enforcer Projectile Hit"),
+       _("Enforcer Projctile Flyby"),
+       _("F'lickta Melee Attack"),
+       _("F'lickta Melee Attack Hit"),
+       _("F'lickta Projectile Attack"),
+       _("F'lickta Sewage Attack Hit"),
+       _("F'lickta Sewage Flyby"),
+       _("F'lickta Lava Attack Hit"),
+       _("F'lickta Lava Flyby"),
+       _("F'lickta Dying"),
+       _("Machine Binder"),
+       _("Machine Bookpress"),
+       _("Machine Puncher"),
+       _("Electric"),
+       _("Alarm"),
+       _("Night Wind"),
+       _("Surface Explosion"),
+       _("Underground Explosion"),
+       _("S'pht'Kr Attack"),
+       _("S'pht'Kr Hit"),
+       _("S'pht'Kr Flyby"),
+       _("S'pht'Kr Being Hit"),
+       _("S'pht'Kr Exploding"),
+       _("Tick Chatter"),
+       _("Tick Falling"),
+       _("Tick Flapping"),
+       _("Tick Exploding"),
+       _("Lamp Exploding"),
+       _("Pfhor Platform Start"),
+       _("Pfhor Platform Stop"),
+       _("Pfhor Platform"),
+       _("Pfhor Door Opening"),
+       _("Pfhor Door Closing"),
+       _("Pfhor Door Obstructed"),
+       _("Pfhor Door"),
+       _("Pfhor Switch Off"),
+       _("Pfhor Switch On"),
+       _("Juggernaut Firing"),
+       _("Juggernaut Warning"),
+       _("Juggernaut Exploding"),
+       _("Juggernaut Preparing to Fire"),
+       _("Enforcer Exploding"),
+       _("Alien Noise 1"),
+       _("Alien Noise 2"),
+       _("VacBob Wail"),
+       _("VacBob Scream"),
+       _("VacBob Hit"),
+       _("VacBob Chatter"),
+       _("Assimilated VacBob Chatter"),
+       _("VacBob Trash Talk"),
+       _("VacBob Apology"),
+       _("VacBob Activation"),
+       _("VacBob Clear"),
+       _("VacBob Stop Shooting Me You Bastard"),
+       _("VacBob Area Secure"),
+       _("VacBob Kill The Player"),
+};
+
+static const wxString shotNames[] = {
+       _("Missile"),
+       _("Grenade"),
+       _("Pistol Bullet"),
+       _("Assault Rifle Bullet"),
+       _("Shotgun Shot"),
+       _("Pfhor Staff"),
+       _("Pfhor Projectile"),
+       _("Flamethrower"),
+       _("S'pht Bolt"),
+       _("Seeking S'pht Bolt"),
+       _("Alien Weapon Blast"),
+       _("Fusion Bolt"),
+       _("Fusion Overload Bolt"),
+       _("Hunter Bolt"),
+       _("Fist Punch"),
+       _("unused 1"),
+       _("unused 2"),
+       _("Missile 2"),
+       _("Trooper Machine Gun"),
+       _("Trooper Grenade"),
+       _("S'pht'Kr Bolt"),
+       _("Major S'pht'Kr Bolt"),
+       _("Juggernaut Missile"),
+       _("Energy Drain"),
+       _("Major Energy Drain"),
+       _("Oxygen Drain"),
+       _("Drone Bolt"),
+       _("Fast Drone Bolt"),
+       _("Possessed Drone Bolt"),
+       _("Bouncing Grenade"),
+       _("Seeking Grenade"),
+       _("Ball"),
+       _("Fusion Media Backblast"),
+       _("Fusion Overload Media Backblast"),
+       _("Fusion Overload Self-Destruct"),
+       _("Flick'ta Claw"),
+       _("Flick'ta Glob"),
+       _("Flick'ta Lava Glob"),
+       _("SMG Bullet"),
+};
+
+static const wxString weaponNames[] = {
+       _("Fist"),
+       _("Pistol"),
+       _("Plasma Pistol"),
+       _("Assault Rifle"),
+       _("Missile Launcher"),
+       _("Flamethrower"),
+       _("Alien Weapon"),
+       _("Shotgun"),
+       _("The Ball"),
+       _("SMG")
+};
+
+DefaultNames* DefaultNames::mInstance;
+
+DefaultNames::DefaultNames() 
+{
+       for (int i = 0; i < 47; ++i) {
+               mMap[wxT("alien")][i] = alienNames[i];
+       }
+
+       for (int i = 0; i < 16; ++i) {
+               mMap[wxT("class")][i] = classNames[i];
+       }
+
+       for (int i = 0; i < 32; ++i) {
+               mMap[wxT("collection")][i] = collectionNames[i];
+       }
+       
+       for (int i = 0; i < 24; ++i) {
+               mMap[wxT("damage")][i] = damageNames[i];
+       }
+
+       for (int i = 0; i < 73; ++i) {
+               mMap[wxT("effect")][i] = effectNames[i];
+       }
+
+       for (int i = 0; i < 36; ++i) {
+               mMap[wxT("item")][i] = itemNames[i];
+       }
+
+       for (int i = 0; i < 215; ++i) {
+               mMap[wxT("sound")][i] = soundNames[i];
+       }
+
+       for (int i = 0; i < 39; ++i) {
+               mMap[wxT("shot")][i] = shotNames[i];
+       }
+
+       for (int i = 0; i < 10; ++i) {
+               mMap[wxT("weapon")][i] = weaponNames[i];
+       }
+
+       wxTextFile namesFile(wxStandardPaths::Get().GetResourcesDir() + wxT("/DefaultNames.txt"));
+       
+       if (namesFile.Exists()) {
+               if (namesFile.Open()) {
+                       for (wxString str = namesFile.GetFirstLine(); !namesFile.Eof(); str = namesFile.GetNextLine()) {
+                               str.Trim(true);
+                               str.Trim(false);
+
+                               if (str[0] == '#') {
+                                       continue;
+                               }
+
+                               // parse into three tokens
+                               wxStringTokenizer tokenizer(str);
+                               if (tokenizer.CountTokens() >= 3) {
+                                       wxString key = tokenizer.GetNextToken();
+                                       wxString indexStr = tokenizer.GetNextToken();
+                                       wxString value = tokenizer.GetString();
+                                       
+                                       long index = 0;
+                                       if (!indexStr.ToLong(&index)) {
+                                               continue;
+                                       }
+
+                                       mMap[key][index] = value;
+                               }
+                       }
+                       
+                       namesFile.Close();
+               }
+       }
+}
+
+wxString DefaultNames::Get(const wxString& set, int index)
+{
+       std::map<wxString, std::map<int, wxString> >::const_iterator it = mMap.find(set);
+       if (it != mMap.end()) {
+               std::map<int, wxString>::const_iterator kvp = it->second.find(index);
+               if (kvp != it->second.end()) {
+                       return kvp->second;
+               }
+       }
+
+       if (index == -1) {
+               return _("None");
+       } else {
+               return set + wxString::Format(wxT(" %i"), index);
+       }
+}
+
+std::vector<wxString> DefaultNames::GetArray(const wxString& set)
+{
+       std::vector<wxString> v;
+
+       int size = mMap[set].rbegin()->first + 1;
+       if (size > 0) {
+               v.resize(size);
+               
+               for (int i = 0; i < size; ++i) {
+                       v[i] = GetName(set, i);
+               }
+       }
+
+       return v;
+}
diff --git a/DefaultNames.h b/DefaultNames.h
new file mode 100644 (file)
index 0000000..1677108
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef DEFAULTNAMES_H
+#define DEFAULTNAMES_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include <map>
+#include <vector>
+
+class DefaultNames {
+public:
+       static DefaultNames* Instance() { 
+               if (!mInstance) {
+                       mInstance = new DefaultNames;
+               }
+               return mInstance;
+       }
+
+       wxString Get(const wxString& set, int index);
+       std::vector<wxString> GetArray(const wxString& set);
+
+private:
+       DefaultNames();
+
+       static DefaultNames* mInstance;
+
+       std::map<wxString, std::map<int, wxString> > mMap;
+};
+
+static inline wxString GetName(const wxString& set, int index) { return DefaultNames::Instance()->Get(set, index); }
+
+#endif
diff --git a/DefaultNames.txt b/DefaultNames.txt
new file mode 100644 (file)
index 0000000..c92facf
--- /dev/null
@@ -0,0 +1,256 @@
+#
+# Default names for elements related to ShapeFusion
+#
+# This file lists names for Infinity-like scenarios
+#
+
+# collection names
+collection 0   Interface graphics
+collection 1   Weapons in hand
+collection 2   Juggernaut
+collection 3   Tick
+collection 4   Projectiles & explosions
+collection 5   Hunter
+collection 6   Player
+collection 7   Items
+collection 8   Trooper
+collection 9   Pfhor fighter
+collection 10  Defender
+collection 11  Yeti
+collection 12  Bob
+collection 13  Vacuum Bob
+collection 14  Enforcer
+collection 15  Hummer
+collection 16  Compiler
+collection 17  Walls 1 (water)
+collection 18  Walls 2 (lava)
+collection 19  Walls 3 (sewage)
+collection 20  Walls 4 (jiaro)
+collection 21  Walls 5 (pfhor)
+collection 22  Scenery 1 (water)
+collection 23  Scenery 2 (lava)
+collection 24  Scenery 3 (sewage)
+collection 25  Scenery 4 (jiaro)
+collection 26  Scenery 5 (pfhor)
+collection 27  Landscape 1 (daytime)
+collection 28  Landscape 2 (nighttime)
+collection 29  Landscape 3 (moon)
+collection 30  Landscape 4 (space)
+collection 31  Cyborg
+
+# sound class names (from AlephOne sources)
+sound 0                Startup
+sound 1                Teleport in
+sound 2                Teleport out
+sound 3                Body being crunched
+sound 4        Jjaro ship creak
+sound 5                Absorbed
+sound 6                Breathing
+sound 7        Oxygen warning
+sound 8                Suffocation
+sound 9                Energy refuel
+sound 10       Oxygen refuel
+sound 11       Can't toggle switch
+sound 12       Switch on
+sound 13       Switch off
+sound 14       Puzzle switch
+sound 15       Chip insertion
+sound 16       Pattern buffer
+sound 17       Destroy control panel
+sound 18       Adjust volume
+sound 19       Got powerup
+sound 20       Got item
+sound 21       Bullet ricochet
+sound 22       Metallic ricochet
+sound 23       Empty gun
+sound 24       S'pht door opening
+sound 25       S'pht door closing
+sound 26       S'pht door obstructed
+sound 27       S'pht platform starting
+sound 28       S'pht platform stopping
+sound 29       Owl
+sound 30       SMG firing
+sound 31       SMG reloading
+sound 32       Heavy s'pht platform starting
+sound 33       Heavy s'pht platform stopping
+sound 34       Fist hitting
+sound 35       Magnum firing
+sound 36       Magnum reloading
+sound 37       Assault rifle firing
+sound 38       Grenade launcher firing
+sound 39       Grenade exploding
+sound 40       Grenade flyby
+sound 41       Fusion firing
+sound 42       Fusion exploding
+sound 43       Fusion flyby
+sound 44       Fusion charging
+sound 45       Rocket exploding
+sound 46       Rocket flyby
+sound 47       Rocket firing
+sound 48       Flamethrower
+sound 49       Body falling
+sound 50       Body exploding
+sound 51       Bullet hitting flesh
+sound 52       Fighter activate
+sound 53       Fighter wail
+sound 54       Fighter scream
+sound 55       Fighter chatter
+sound 56       Fighter attack
+sound 57       Fighter projectile hit
+sound 58       Fighter projectile flyby
+sound 59       Compiler attack
+sound 60       Compiler death
+sound 61       Compiler hit
+sound 62       Compiler projectile flyby
+sound 63       Compiler projectile hit
+sound 64       Cyborg moving
+sound 65       Cyborg attack
+sound 66       Cyborg hit
+sound 67       Cyborg death
+sound 68       Cyborg projectile bounce
+sound 69       Cyborg projectile hit
+sound 70       Cyborg projectile flyby
+sound 71       Hummer activate
+sound 72       Hummer start attack
+sound 73       Hummer attack
+sound 74       Hummer dying
+sound 75       Hummer death
+sound 76       Hummer projectile hit
+sound 77       Hummer projectile flyby
+sound 78       Human wail
+sound 79       Human scream
+sound 80       Human hit
+sound 81       Human chatter
+sound 82       Assimilated human chatter
+sound 83       Human trash talk
+sound 84       Human apology
+sound 85       Human activation
+sound 86       Human clear
+sound 87       Human stop shooting me you bastard
+sound 88       Human area secure
+sound 89       Kill the player
+sound 90       Water
+sound 91       Sewage
+sound 92       Lava
+sound 93       Goo
+sound 94       Under media
+sound 95       Wind
+sound 96       Waterfall
+sound 97       Siren
+sound 98       Fan
+sound 99       S'pht door
+sound 100      S'pht platform
+sound 101      Alien harmonics
+sound 102      Heavy s'pht platform
+sound 103      Light machinery
+sound 104      Heavy machinery
+sound 105      Transformer
+sound 106      Sparking transformer
+sound 107      Water drip
+sound 108      Walking in water
+sound 109      Exit water
+sound 110      Enter water
+sound 111      Small water splash
+sound 112      Medium water splash
+sound 113      Large water splash
+sound 114      Walking in lava
+sound 115      Enter lava
+sound 116      Exit lava
+sound 117      Small lava splash
+sound 118      Medium lava splash
+sound 119      Large lava splash
+sound 120      Walking in sewage
+sound 121      Exit sewage
+sound 122      Enter sewage
+sound 123      Small sewage splash
+sound 124      Medium sewage splash
+sound 125      Large sewage splash
+sound 126      Walking in goo
+sound 127      Exit goo
+sound 128      Enter goo
+sound 129      Small goo splash
+sound 130      Medium goo splash
+sound 131      Large goo splash
+sound 132      Major fusion firing
+sound 133      Major fusion charged
+sound 134      Assault rifle reloading
+sound 135      Assault rifle shell casings
+sound 136      Shotgun firing
+sound 137      Shotgun reloading
+sound 138      Ball bounce
+sound 139      You are it
+sound 140      Got ball
+sound 141      Computer interface logon
+sound 142      Computer interface logout
+sound 143      Computer interface page
+sound 144      Heavy s'pht door
+sound 145      Heavy s'pht door opening
+sound 146      Heavy s'pht door closing
+sound 147      Heavy s'pht door open
+sound 148      Heavy s'pht door closed
+sound 149      Heavy s'pht door obstructed
+sound 150      Hunter activate
+sound 151      Hunter attack
+sound 152      Hunter dying
+sound 153      Hunter landing
+sound 154      Hunter exploding
+sound 155      Hunter projectile hit
+sound 156      Hunter projectile flyby
+sound 157      Enforcer activate
+sound 158      Enforcer attack
+sound 159      Enforcer projectile hit
+sound 160      Enforcer projectile flyby
+sound 161      Yeti melee attack
+sound 162      Yeti melee attack hit
+sound 163      Yeti projectile attack
+sound 164      Yeti projectile sewage attack hit
+sound 165      Yeti projectile sewage flyby
+sound 166      Yeti projectile lava attack hit
+sound 167      Yeti projectile lava flyby
+sound 168      Yeti dying
+sound 169      Machine binder
+sound 170      Machine bookpress
+sound 171      Machine puncher
+sound 172      Electric
+sound 173      Alarm
+sound 174      Night wind
+sound 175      Surface explosion
+sound 176      Underground explosion
+sound 177      Defender attack
+sound 178      Defender hit
+sound 179      Defender flyby
+sound 180      Defender being hit
+sound 181      Defender exploding
+sound 182      Tick chatter
+sound 183      Tick falling
+sound 184      Tick flapping
+sound 185      Tick exploding
+sound 186      Ceiling lamp exploding
+sound 187      Pfhor platform starting
+sound 188      Pfhor platform stopping
+sound 189      Pfhor platform
+sound 190      Pfhor door opening
+sound 191      Pfhor door closing
+sound 192      Pfhor door obstructed
+sound 193      Pfhor door
+sound 194      Pfhor switch off
+sound 195      Pfhor switch on
+sound 196      Juggernaut firing
+sound 197      Juggernaut warning
+sound 198      Juggernaut exploding
+sound 199      Juggernaut preparing to fire
+sound 200      Enforcer exploding
+sound 201      Alien noise 1
+sound 202      Alien noise 2
+sound 203      Civilian fusion wail
+sound 204      Civilian fusion scream
+sound 205      Civilian fusion hit
+sound 206      Civilian fusion chatter
+sound 207      Assimilated civilian fusion chatter
+sound 208      Civilian fusion trash talk
+sound 209      Civilian fusion apology
+sound 210      Civilian fusion activation
+sound 211      Civilian fusion clear
+sound 212      Civilian fusion stop shooting me you bastard
+sound 213      Civilian fusion area secure
+sound 214      Civilian fusion kill the player
diff --git a/GenericEndianBuffer.cpp b/GenericEndianBuffer.cpp
new file mode 100644 (file)
index 0000000..4f8f3e7
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include <iostream>
+#include <cstring>
+#include <vector>
+#include "GenericEndianBuffer.h"
+
+GenericEndianBuffer::GenericEndianBuffer(unsigned int _size):
+               mSize(0), mSelfAllocated(true)
+{
+       mData = new unsigned char[_size];
+       if (mData != NULL) {
+               mPosition = mData;
+               mSize = _size;
+       }
+}
+
+GenericEndianBuffer::GenericEndianBuffer(unsigned char *_data, unsigned int _size):
+               mData(_data), mPosition(_data), mSize(_size), mSelfAllocated(false)
+{
+       
+}
+
+GenericEndianBuffer::~GenericEndianBuffer(void)
+{
+       if (mSelfAllocated && mData != NULL) {
+               delete[] mData;
+               mData = NULL;
+       }
+}
+
+char GenericEndianBuffer::ReadChar(void)
+{
+       if ((unsigned int)(mPosition - mData) < mSize) {
+               unsigned char   v = *mPosition;
+
+               mPosition++;
+               return (char)v;
+       } else {
+               std::cerr << "GenericEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+unsigned char GenericEndianBuffer::ReadUChar(void)
+{
+       if ((unsigned int)(mPosition - mData) < mSize) {
+               unsigned char   v = *mPosition;
+
+               mPosition++;
+               return v;
+       } else {
+               std::cerr << "GenericEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+void GenericEndianBuffer::ReadBlock(unsigned long _size, unsigned char *dest)
+{
+       if ((unsigned int)(mPosition - mData + _size - 1) < mSize) {
+               memcpy(dest, mPosition, _size);
+               mPosition += _size;
+       } else {
+               std::cerr << "GenericEndianBuffer: attempted read beyond buffer limits\n";
+       }
+}
+
+void GenericEndianBuffer::WriteChar(char v)
+{
+       if ((unsigned int)(mPosition - mData) < mSize)
+               *mPosition++ = v;
+       else
+               std::cerr << "GenericEndianBuffer: attempted write beyond buffer limits\n";
+}
+
+void GenericEndianBuffer::WriteUChar(unsigned char v)
+{
+       if ((unsigned int)(mPosition - mData) < mSize)
+               *mPosition++ = v;
+       else
+               std::cerr << "GenericEndianBuffer: attempted write beyond buffer limits\n";
+}
+
+void GenericEndianBuffer::Write4CharCode(char c1, char c2, char c3, char c4)
+{
+       if ((unsigned int)(mPosition - mData + 4 - 1) < mSize) {
+               *mPosition++ = c1;
+               *mPosition++ = c2;
+               *mPosition++ = c3;
+               *mPosition++ = c4;
+       } else {
+               std::cerr << "GenericEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void GenericEndianBuffer::WriteBlock(unsigned long _size, const void *src)
+{
+       if ((unsigned int)(mPosition - mData + _size - 1) < mSize) {
+               memcpy(mPosition, src, _size);
+               mPosition += _size;
+       } else {
+               std::cerr << "GenericEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void GenericEndianBuffer::WriteZeroes(unsigned int n)
+{
+       if ((unsigned int)(mPosition - mData + n - 1) < mSize) {
+               memset(mPosition, 0, n);
+               mPosition += n;
+       } else {
+               std::cerr << "GenericEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+unsigned char *GenericEndianBuffer::Data(void) const
+{
+       return mData;
+}
+
+unsigned int GenericEndianBuffer::Size(void) const
+{
+       return mSize;
+}
+
+void GenericEndianBuffer::Position(unsigned int pos)
+{
+       if (pos < mSize)
+               mPosition = mData + pos;
+       else
+               std::cerr << "GenericEndianBuffer: attempted to position beyond buffer limits (" << pos << "/" << (mSize-1) << ")\n";
+}
+
+unsigned int GenericEndianBuffer::Position(void) const
+{
+       return mPosition - mData;
+}
+
+static const unsigned long CRC32_POLYNOMIAL = 0xEDB88320L;
+static std::vector<unsigned long> crc_table;
+
+static void BuildCRCTable()
+{
+       if (crc_table.empty()) {
+               crc_table.resize(256);
+
+               for (unsigned int i = 0; i < crc_table.size(); ++i) {
+                       unsigned long crc = i;
+                       for (int j = 0; j < 8; ++j) {
+                               if (crc & 1) {
+                                       crc = (crc >> 1) ^ CRC32_POLYNOMIAL;
+                               } else {
+                                       crc >>= 1;
+                               }
+                               crc_table[i] = crc;
+                       }
+               }
+       }
+}
+
+unsigned long GenericEndianBuffer::CalculateCRC() const 
+{
+       BuildCRCTable();
+
+       unsigned long crc = 0xFFFFFFFFL;
+       
+       unsigned char* p = mData;
+       for (unsigned int i = 0; i < mSize; ++i) {
+               unsigned long a = (crc >> 8) & 0x00FFFFFFL;
+               unsigned long b = crc_table[((int) crc ^ *p++) & 0xff];
+               crc = a^b;
+       }
+       return crc ^ 0xFFFFFFFFL;
+}
diff --git a/GenericEndianBuffer.h b/GenericEndianBuffer.h
new file mode 100644 (file)
index 0000000..c604a9d
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+//
+// GenericEndianBuffer
+//
+
+#ifndef GENERICENDIANBUFFER_H
+#define GENERICENDIANBUFFER_H
+
+class GenericEndianBuffer {
+protected:
+       unsigned char   *mData,
+                                       *mPosition;
+       unsigned int    mSize;
+       bool                    mSelfAllocated;
+
+public:
+       // self-allocate data buffer
+       GenericEndianBuffer(unsigned int _size);
+       // use a pre-allocated buffer
+       GenericEndianBuffer(unsigned char *_data, unsigned int _size);
+       ~GenericEndianBuffer(void);
+       // set access position
+       void Position(unsigned int pos);
+       // return access position
+       unsigned int Position(void) const;
+       // read values, advance position accordingly
+       char ReadChar(void);
+       unsigned char ReadUChar(void);
+       void ReadBlock(unsigned long _size, unsigned char *dest);
+       // write values, advance position accordingly
+       void WriteChar(char v);
+       void WriteUChar(unsigned char v);
+       void Write4CharCode(char c1, char c2, char c3, char c4);
+       void WriteBlock(unsigned long _size, const void *src);
+       void WriteZeroes(unsigned int n);
+       // stuff access
+       unsigned char *Data(void) const;
+       unsigned int Size(void) const;
+
+       unsigned long CalculateCRC() const;
+};
+
+#endif
diff --git a/LittleEndianBuffer.cpp b/LittleEndianBuffer.cpp
new file mode 100644 (file)
index 0000000..8f0f133
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include <iostream>
+#include "LittleEndianBuffer.h"
+
+LittleEndianBuffer::LittleEndianBuffer(unsigned int _size):
+               GenericEndianBuffer(_size)
+{
+
+}
+
+LittleEndianBuffer::LittleEndianBuffer(unsigned char *_data, unsigned int _size):
+               GenericEndianBuffer(_data, _size)
+{
+       
+}
+
+LittleEndianBuffer::~LittleEndianBuffer(void)
+{
+
+}
+
+short LittleEndianBuffer::ReadShort(void)
+{
+       if ((unsigned int)(mPosition - mData + 1) < mSize) {
+               unsigned char   lo = *mPosition++,
+                                               hi = *mPosition++;
+
+               return (short)((hi << 8) | lo);
+       } else {
+               std::cerr << "LittleEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+unsigned short LittleEndianBuffer::ReadUShort(void)
+{
+       if ((unsigned int)(mPosition - mData + 1) < mSize) {
+               unsigned char   lo = *mPosition++,
+                                               hi = *mPosition++;
+               
+               return (unsigned short)((hi << 8) | lo);
+       } else {
+               std::cerr << "LittleEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+long LittleEndianBuffer::ReadLong(void)
+{
+       if ((unsigned int)(mPosition - mData + 3) < mSize) {
+               unsigned char   a = *mPosition++,
+                                               b = *mPosition++,
+                                               c = *mPosition++,
+                                               d = *mPosition++;
+               
+               return (long)((d << 24) | (c << 16) | (b << 8) | a);
+       } else {
+               std::cerr << "LittleEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+unsigned long LittleEndianBuffer::ReadULong(void)
+{
+       if ((unsigned int)(mPosition - mData + 3) < mSize) {
+               unsigned char   a = *mPosition++,
+                                               b = *mPosition++,
+                                               c = *mPosition++,
+                                               d = *mPosition++;
+               
+               return (unsigned long)((d << 24) | (c << 16) | (b << 8) | a);
+       } else {
+               std::cerr << "LittleEndianBuffer: attempted read beyond buffer limits\n";
+               return 0;
+       }
+}
+
+void LittleEndianBuffer::WriteShort(short v)
+{
+       if ((unsigned int)(mPosition - mData + 1) < mSize) {
+               *mPosition++ = v & 0xff;
+               *mPosition++ = (v >> 8) & 0xff;
+       } else {
+               std::cerr << "LittleEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void LittleEndianBuffer::WriteUShort(unsigned short v)
+{
+       if ((unsigned int)(mPosition - mData + 1) < mSize) {
+               *mPosition++ = v & 0xff;
+               *mPosition++ = (v >> 8) & 0xff;
+       } else {
+               std::cerr << "LittleEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void LittleEndianBuffer::WriteLong(long v)
+{
+       if ((unsigned int)(mPosition - mData + 3) < mSize) {
+               *mPosition++ = v & 0xff;
+               *mPosition++ = (v >> 8) & 0xff;
+               *mPosition++ = (v >> 16) & 0xff;
+               *mPosition++ = (v >> 24) & 0xff;
+       } else {
+               std::cerr << "LittleEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
+void LittleEndianBuffer::WriteULong(unsigned long v)
+{
+       if ((unsigned int)(mPosition - mData + 3) < mSize) {
+               *mPosition++ = v & 0xff;
+               *mPosition++ = (v >> 8) & 0xff;
+               *mPosition++ = (v >> 16) & 0xff;
+               *mPosition++ = (v >> 24) & 0xff;
+       } else {
+               std::cerr << "LittleEndianBuffer: attempted write beyond buffer limits\n";
+       }
+}
+
diff --git a/LittleEndianBuffer.h b/LittleEndianBuffer.h
new file mode 100644 (file)
index 0000000..46fcf29
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+//
+// LittleEndianBuffer
+// Utility class to access little-endian data buffers easily
+//
+
+#ifndef LITTLEENDIANBUFFER_H
+#define LITTLEENDIANBUFFER_H
+
+#include "GenericEndianBuffer.h"
+
+class LittleEndianBuffer: public GenericEndianBuffer {
+public:
+       // self-allocate data buffer
+       LittleEndianBuffer(unsigned int _size);
+       // use a pre-allocated buffer
+       LittleEndianBuffer(unsigned char *_data, unsigned int _size);
+       ~LittleEndianBuffer(void);
+       // read little-endian values, advance position accordingly
+       short ReadShort(void);
+       unsigned short ReadUShort(void);
+       long ReadLong(void);
+       unsigned long ReadULong(void);
+       // write little-endian values, advance position accordingly
+       void WriteShort(short v);
+       void WriteUShort(unsigned short v);
+       void WriteLong(long v);
+       void WriteULong(unsigned long v);
+};
+
+#endif
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..dcff0e7
--- /dev/null
@@ -0,0 +1,35 @@
+## Process this file with automake to produce Makefile.in 
+
+SUBDIRS = Physics Shapes Sounds
+
+AUTOMAKE_OPTIONS = 1.5 foreign
+
+EXTRA_DIST = ShapeFusion.xcodeproj/project.pbxproj COPYING.txt \
+       DefaultNames.txt README.txt ShapeFusion-Info.plist \
+       Resources/shapefusion.icns Resources/shapefusion.ico \
+       Resources/shapefusion.rc Resources/shapefusion.svg
+
+if MAKE_WINDOWS
+bin_PROGRAMS = ShapeFusion
+else
+bin_PROGRAMS = shapefusion
+endif
+
+shapefusion_SOURCES = BigEndianBuffer.h DefaultNames.h \
+       GenericEndianBuffer.h LittleEndianBuffer.h ShapeFusionApp.h \
+       ShapeFusionDocManager.h ShapeFusionMain.h ShapeFusionMenus.h \
+       BigEndianBuffer.cpp DefaultNames.cpp GenericEndianBuffer.cpp \
+       LittleEndianBuffer.cpp ShapeFusionApp.cpp \
+       ShapeFusionDocManager.cpp ShapeFusionMain.cpp \
+       ShapeFusionMenus.cpp
+
+shapefusion_LDADD = \
+  Physics/libphysics.a Shapes/libshapes.a Sounds/libsounds.a
+
+ShapeFusion_SOURCES = $(shapefusion_SOURCES)
+ShapeFusion_LDADD = $(shapefusion_LDADD) shapefusion-resources.o
+
+INCLUDES = -I$(top_srcdir)/Physics -I$(top_srcdir)/Shapes -I$(top_srcdir)/Sounds
+
+shapefusion-resources.o: $(top_srcdir)/Resources/shapefusion.rc
+       @WX_RESCOMP@ -I$(top_srcdir)/Resources $(top_srcdir)/Resources/shapefusion.rc -o shapefusion-resources.o
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..0c8c414
--- /dev/null
@@ -0,0 +1,863 @@
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+@MAKE_WINDOWS_FALSE@bin_PROGRAMS = shapefusion$(EXEEXT)
+@MAKE_WINDOWS_TRUE@bin_PROGRAMS = ShapeFusion$(EXEEXT)
+subdir = .
+DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+       $(top_srcdir)/configure config.guess config.sub depcomp \
+       install-sh missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__objects_1 = BigEndianBuffer.$(OBJEXT) DefaultNames.$(OBJEXT) \
+       GenericEndianBuffer.$(OBJEXT) LittleEndianBuffer.$(OBJEXT) \
+       ShapeFusionApp.$(OBJEXT) ShapeFusionDocManager.$(OBJEXT) \
+       ShapeFusionMain.$(OBJEXT) ShapeFusionMenus.$(OBJEXT)
+am_ShapeFusion_OBJECTS = $(am__objects_1)
+ShapeFusion_OBJECTS = $(am_ShapeFusion_OBJECTS)
+ShapeFusion_DEPENDENCIES = $(shapefusion_LDADD) \
+       shapefusion-resources.o
+am_shapefusion_OBJECTS = BigEndianBuffer.$(OBJEXT) \
+       DefaultNames.$(OBJEXT) GenericEndianBuffer.$(OBJEXT) \
+       LittleEndianBuffer.$(OBJEXT) ShapeFusionApp.$(OBJEXT) \
+       ShapeFusionDocManager.$(OBJEXT) ShapeFusionMain.$(OBJEXT) \
+       ShapeFusionMenus.$(OBJEXT)
+shapefusion_OBJECTS = $(am_shapefusion_OBJECTS)
+shapefusion_DEPENDENCIES = Physics/libphysics.a Shapes/libshapes.a \
+       Sounds/libsounds.a
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+       -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ShapeFusion_SOURCES) $(shapefusion_SOURCES)
+DIST_SOURCES = $(ShapeFusion_SOURCES) $(shapefusion_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-dvi-recursive install-exec-recursive \
+       install-html-recursive install-info-recursive \
+       install-pdf-recursive install-ps-recursive install-recursive \
+       installcheck-recursive installdirs-recursive pdf-recursive \
+       ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+       distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SNDFILE_CFLAGS = @SNDFILE_CFLAGS@
+SNDFILE_LIBS = @SNDFILE_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+WX_CFLAGS = @WX_CFLAGS@
+WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@
+WX_CONFIG_PATH = @WX_CONFIG_PATH@
+WX_CPPFLAGS = @WX_CPPFLAGS@
+WX_CXXFLAGS = @WX_CXXFLAGS@
+WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@
+WX_LIBS = @WX_LIBS@
+WX_LIBS_STATIC = @WX_LIBS_STATIC@
+WX_RESCOMP = @WX_RESCOMP@
+WX_VERSION = @WX_VERSION@
+WX_VERSION_MAJOR = @WX_VERSION_MAJOR@
+WX_VERSION_MICRO = @WX_VERSION_MICRO@
+WX_VERSION_MINOR = @WX_VERSION_MINOR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = Physics Shapes Sounds
+AUTOMAKE_OPTIONS = 1.5 foreign
+EXTRA_DIST = ShapeFusion.xcodeproj/project.pbxproj COPYING.txt \
+       DefaultNames.txt README.txt ShapeFusion-Info.plist \
+       Resources/shapefusion.icns Resources/shapefusion.ico \
+       Resources/shapefusion.rc Resources/shapefusion.svg
+
+shapefusion_SOURCES = BigEndianBuffer.h DefaultNames.h \
+       GenericEndianBuffer.h LittleEndianBuffer.h ShapeFusionApp.h \
+       ShapeFusionDocManager.h ShapeFusionMain.h ShapeFusionMenus.h \
+       BigEndianBuffer.cpp DefaultNames.cpp GenericEndianBuffer.cpp \
+       LittleEndianBuffer.cpp ShapeFusionApp.cpp \
+       ShapeFusionDocManager.cpp ShapeFusionMain.cpp \
+       ShapeFusionMenus.cpp
+
+shapefusion_LDADD = \
+  Physics/libphysics.a Shapes/libshapes.a Sounds/libsounds.a
+
+ShapeFusion_SOURCES = $(shapefusion_SOURCES)
+ShapeFusion_LDADD = $(shapefusion_LDADD) shapefusion-resources.o
+INCLUDES = -I$(top_srcdir)/Physics -I$(top_srcdir)/Shapes -I$(top_srcdir)/Sounds
+all: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+am--refresh: Makefile
+       @:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+             $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+       @if test ! -f $@; then rm -f stamp-h1; else :; fi
+       @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+       ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+       rm -f stamp-h1
+       touch $@
+
+distclean-hdr:
+       -rm -f config.h stamp-h1
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       for p in $$list; do echo "$$p $$p"; done | \
+       sed 's/$(EXEEXT)$$//' | \
+       while read p p1; do if test -f $$p; \
+         then echo "$$p"; echo "$$p"; else :; fi; \
+       done | \
+       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+           -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+       sed 'N;N;N;s,\n, ,g' | \
+       $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+         { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+           if ($$2 == $$4) files[d] = files[d] " " $$1; \
+           else { print "f", $$3 "/" $$4, $$1; } } \
+         END { for (d in files) print "f", d, files[d] }' | \
+       while read type dir files; do \
+           if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+           test -z "$$files" || { \
+             echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+             $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+           } \
+       ; done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       files=`for p in $$list; do echo "$$p"; done | \
+         sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+             -e 's/$$/$(EXEEXT)/' `; \
+       test -n "$$list" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+ShapeFusion$(EXEEXT): $(ShapeFusion_OBJECTS) $(ShapeFusion_DEPENDENCIES) 
+       @rm -f ShapeFusion$(EXEEXT)
+       $(CXXLINK) $(ShapeFusion_OBJECTS) $(ShapeFusion_LDADD) $(LIBS)
+shapefusion$(EXEEXT): $(shapefusion_OBJECTS) $(shapefusion_DEPENDENCIES) 
+       @rm -f shapefusion$(EXEEXT)
+       $(CXXLINK) $(shapefusion_OBJECTS) $(shapefusion_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BigEndianBuffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultNames.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GenericEndianBuffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LittleEndianBuffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShapeFusionApp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShapeFusionDocManager.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShapeFusionMain.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShapeFusionMenus.Po@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       $(am__remove_distdir)
+       test -d "$(distdir)" || mkdir "$(distdir)"
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test -d "$(distdir)/$$subdir" \
+           || $(MKDIR_P) "$(distdir)/$$subdir" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+       -test -n "$(am__skip_mode_fix)" \
+       || find "$(distdir)" -type d ! -perm -755 \
+               -exec chmod u+rwx,go+rx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+dist-lzma: distdir
+       tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+       $(am__remove_distdir)
+
+dist-xz: distdir
+       tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+       $(am__remove_distdir)
+
+dist-tarZ: distdir
+       tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+       $(am__remove_distdir)
+
+dist-shar: distdir
+       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       $(am__remove_distdir)
+
+dist-zip: distdir
+       -rm -f $(distdir).zip
+       zip -rq $(distdir).zip $(distdir)
+       $(am__remove_distdir)
+
+dist dist-all: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       case '$(DIST_ARCHIVES)' in \
+       *.tar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+       *.tar.bz2*) \
+         bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+       *.tar.lzma*) \
+         lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+       *.tar.xz*) \
+         xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+       *.tar.Z*) \
+         uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+       *.shar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+       *.zip*) \
+         unzip $(distdir).zip ;;\
+       esac
+       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       mkdir $(distdir)/_build
+       mkdir $(distdir)/_inst
+       chmod a-w $(distdir)
+       test -d $(distdir)/_build || exit 0; \
+       dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+         && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+         && am__cwd=`pwd` \
+         && $(am__cd) $(distdir)/_build \
+         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+           $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+           $(DISTCHECK_CONFIGURE_FLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+               distuninstallcheck \
+         && chmod -R a-w "$$dc_install_base" \
+         && ({ \
+              (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+                   distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+             } || { rm -rf "$$dc_destdir"; exit 1; }) \
+         && rm -rf "$$dc_destdir" \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && rm -rf $(DIST_ARCHIVES) \
+         && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+         && cd "$$am__cwd" \
+         || exit 1
+       $(am__remove_distdir)
+       @(echo "$(distdir) archives ready for distribution: "; \
+         list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+         sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+       @test -n '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: trying to run $@ with an empty' \
+              '$$(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       $(am__cd) '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+          || { echo "ERROR: files left after uninstall:" ; \
+               if test -n "$(DESTDIR)"; then \
+                 echo "  (check DESTDIR support)"; \
+               fi ; \
+               $(distuninstallcheck_listfiles) ; \
+               exit 1; } >&2
+distcleancheck: distclean
+       @if test '$(srcdir)' = . ; then \
+         echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+         exit 1 ; \
+       fi
+       @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+         || { echo "ERROR: files left in build directory after distclean:" ; \
+              $(distcleancheck_listfiles) ; \
+              exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(PROGRAMS) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+       for dir in "$(DESTDIR)$(bindir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
+       ctags-recursive install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+       all all-am am--refresh check check-am clean clean-binPROGRAMS \
+       clean-generic ctags ctags-recursive dist dist-all dist-bzip2 \
+       dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
+       distcheck distclean distclean-compile distclean-generic \
+       distclean-hdr distclean-tags distcleancheck distdir \
+       distuninstallcheck dvi dvi-am html html-am info info-am \
+       install install-am install-binPROGRAMS install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \
+       uninstall uninstall-am uninstall-binPROGRAMS
+
+
+shapefusion-resources.o: $(top_srcdir)/Resources/shapefusion.rc
+       @WX_RESCOMP@ -I$(top_srcdir)/Resources $(top_srcdir)/Resources/shapefusion.rc -o shapefusion-resources.o
+
+# 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/Physics/Makefile.am b/Physics/Makefile.am
new file mode 100644 (file)
index 0000000..119dbe4
--- /dev/null
@@ -0,0 +1,8 @@
+## Process this file with automake to produce Makefile.in 
+
+noinst_LIBRARIES = libphysics.a
+
+libphysics_a_SOURCES = PhysicsDocument.h PhysicsElements.h     \
+       PhysicsTreeItemData.h PhysicsView.h PhysicsDocument.cpp \
+       PhysicsEditor.cpp PhysicsElements.cpp PhysicsView.cpp   \
+       PhysicsTreeItemData.cpp
diff --git a/Physics/Makefile.in b/Physics/Makefile.in
new file mode 100644 (file)
index 0000000..cb097d8
--- /dev/null
@@ -0,0 +1,471 @@
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = Physics
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libphysics_a_AR = $(AR) $(ARFLAGS)
+libphysics_a_LIBADD =
+am_libphysics_a_OBJECTS = PhysicsDocument.$(OBJEXT) \
+       PhysicsEditor.$(OBJEXT) PhysicsElements.$(OBJEXT) \
+       PhysicsView.$(OBJEXT) PhysicsTreeItemData.$(OBJEXT)
+libphysics_a_OBJECTS = $(am_libphysics_a_OBJECTS)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+       -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libphysics_a_SOURCES)
+DIST_SOURCES = $(libphysics_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SNDFILE_CFLAGS = @SNDFILE_CFLAGS@
+SNDFILE_LIBS = @SNDFILE_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+WX_CFLAGS = @WX_CFLAGS@
+WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@
+WX_CONFIG_PATH = @WX_CONFIG_PATH@
+WX_CPPFLAGS = @WX_CPPFLAGS@
+WX_CXXFLAGS = @WX_CXXFLAGS@
+WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@
+WX_LIBS = @WX_LIBS@
+WX_LIBS_STATIC = @WX_LIBS_STATIC@
+WX_RESCOMP = @WX_RESCOMP@
+WX_VERSION = @WX_VERSION@
+WX_VERSION_MAJOR = @WX_VERSION_MAJOR@
+WX_VERSION_MICRO = @WX_VERSION_MICRO@
+WX_VERSION_MINOR = @WX_VERSION_MINOR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+noinst_LIBRARIES = libphysics.a
+libphysics_a_SOURCES = PhysicsDocument.h PhysicsElements.h     \
+       PhysicsTreeItemData.h PhysicsView.h PhysicsDocument.cpp \
+       PhysicsEditor.cpp PhysicsElements.cpp PhysicsView.cpp   \
+       PhysicsTreeItemData.cpp
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Physics/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu Physics/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libphysics.a: $(libphysics_a_OBJECTS) $(libphysics_a_DEPENDENCIES) 
+       -rm -f libphysics.a
+       $(libphysics_a_AR) libphysics.a $(libphysics_a_OBJECTS) $(libphysics_a_LIBADD)
+       $(RANLIB) libphysics.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PhysicsDocument.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PhysicsEditor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PhysicsElements.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PhysicsTreeItemData.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PhysicsView.Po@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am
+
+
+# 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/Physics/PhysicsDocument.cpp b/Physics/PhysicsDocument.cpp
new file mode 100644 (file)
index 0000000..bf8630c
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#if wxUSE_STD_IOSTREAM
+    #include "wx/ioswrap.h"
+#else
+    #include "wx/txtstrm.h"
+#endif
+
+#include "../BigEndianBuffer.h"
+#include "PhysicsDocument.h"
+
+#define FOUR_CHARS_TO_INT(a,b,c,d) (((unsigned int)(a) << 24) | ((unsigned int)(b) << 16) | ((unsigned int)(c) << 8) | (unsigned int)(d))
+
+IMPLEMENT_DYNAMIC_CLASS(PhysicsDocument, wxDocument)
+
+PhysicsDocument::PhysicsDocument() : wxDocument(), PhysicsElement(true)
+{
+       mConstants.resize(2);
+}
+
+PhysicsDocument::~PhysicsDocument()
+{
+}
+
+bool PhysicsDocument::DoOpenDocument(const wxString& file)
+{
+       bool wxOpen = wxDocument::DoOpenDocument(file);
+
+       if (!(wxOpen && mGoodData)) {
+               wxLogError(wxT("[PhysicsDocument] There was an error while opening, see log"));
+               return false;
+       }
+       return true;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD istream& PhysicsDocument::LoadObject(wxSTD istream& stream)
+#else
+wxInputStream& PhysicsDocument::LoadObject(wxInputStream& stream)
+#endif
+{
+       // validate the wad header, load the first wad
+       BigEndianBuffer wad_header(128);
+#if wxUSE_STD_IOSTREAM
+       stream.read((char *)wad_header.Data(), wad_header.Size());
+#else
+       stream.Read((char *)wad_header.Data(), wad_header.Size());
+#endif
+
+       int version = wad_header.ReadShort();
+       int data_version = wad_header.ReadShort();
+
+       if (!(version == 1 || version == 2) || !(data_version == 0 || data_version == 1)) {
+               wxLogError(wxT("[PhysicsDocument] Error loading: Incorrect version/data version (%i/%i)"), version, data_version);
+               return stream;
+       }
+
+       wad_header.ReadBlock(MAXIMUM_WADFILE_NAME_LENGTH, wadfile_name);
+
+       // skip to the directory offset and wad count
+       wad_header.Position(72);
+       
+       long directory_offset = wad_header.ReadLong();
+       int wad_count = wad_header.ReadShort();
+       wad_header.ReadShort(); // application specific directory data size
+       int entry_header_size = wad_header.ReadShort();
+       
+       if (wad_count != 1) {
+               wxLogError(wxT("[PhysicsDocument] Error loading: wad count must be 1"));
+               return stream;
+       }
+
+       // jump to the directory and read the offset of the first (and
+       // hopefully only) wad
+       BigEndianBuffer directory_entry(10);
+#if wxUSE_STD_IOSTREAM
+       stream.seekg(directory_offset, std::ios::beg);
+       stream.read((char *) directory_entry.Data(), directory_entry.Size());
+#else
+       stream.SeekI(directory_offset, wxFromStart);
+       stream.Read((char *) directory_entry.Data(), directory_entry.Size());
+#endif
+       long wad_offset = directory_entry.ReadLong();
+       directory_entry.ReadLong(); // wad_size
+       int wad_index = directory_entry.ReadShort();
+
+       if (wad_index != 0) {
+               wxLogError(wxT("[PhysicsDocument] Error loading: first wad index must be 0"));
+               return stream;
+       }
+
+       long next_offset = 0;
+
+       // read the tags
+       do {
+               BigEndianBuffer entry_header(entry_header_size);
+#if wxUSE_STD_IOSTREAM
+               stream.seekg(next_offset + wad_offset, std::ios::beg);
+               stream.read((char *) entry_header.Data(), entry_header.Size());
+#else
+               stream.SeekI(next_offset + wad_offset, wxFromStart);
+               stream.Read((char *) entry_header.Data(), entry_header.Size());
+#endif
+               unsigned long tag = entry_header.ReadULong();
+               next_offset = entry_header.ReadLong();
+               long entry_size = entry_header.ReadLong();
+
+               BigEndianBuffer tag_data(entry_size);           
+#if wxUSE_STD_IOSTREAM
+               stream.read((char *) tag_data.Data(), tag_data.Size());
+#else
+               stream.Read((char *) tag_data.Data(), tag_data.Size());
+#endif
+
+               switch (tag)
+               {
+               case FOUR_CHARS_TO_INT('M','N','p','x'): {
+                       int count = tag_data.Size() / MonsterDefinition::kSize;
+                       mMonsterDefinitions.resize(count);
+                       for (int i = 0; i < count; ++i) {
+                               mMonsterDefinitions[i].LoadObject(tag_data);
+                               if (!mMonsterDefinitions[i].IsGood()) {
+                                       return stream;
+                               }
+                       }
+                       break;
+               }
+               case FOUR_CHARS_TO_INT('F','X','p','x'): {
+                       int count = tag_data.Size() / EffectDefinition::kSize;
+                       mEffectDefinitions.resize(count);
+                       for (int i = 0; i < count; ++i) {
+                               mEffectDefinitions[i].LoadObject(tag_data);
+                               if (!mEffectDefinitions[i].IsGood()) {
+                                       return stream;
+                               }
+                       }
+                       break;
+               }
+               case FOUR_CHARS_TO_INT('P','R','p','x'): {
+                       int count = tag_data.Size() / ProjectileDefinition::kSize;
+                       mProjectileDefinitions.resize(count);
+                       for (int i = 0; i < count; ++i) {
+                               mProjectileDefinitions[i].LoadObject(tag_data);
+                               if (!mProjectileDefinitions[i].IsGood()) {
+                                       return stream;
+                               }
+                       }
+                       break;
+               }
+               case FOUR_CHARS_TO_INT('P','X','p','x'): {
+                       int count = tag_data.Size() / PhysicsConstants::kSize;
+                       mConstants.resize(2);
+                       for (int i = 0; i < count; ++i) {
+                               mConstants[i].LoadObject(tag_data);
+                               if (!mConstants[i].IsGood()) {
+                                       return stream;
+                               }
+                       }
+                       break;
+               }
+               case FOUR_CHARS_TO_INT('W','P','p','x'): {
+                       int count = tag_data.Size() / WeaponDefinition::kSize;
+                       mWeaponDefinitions.resize(count);
+                       for (int i = 0; i < count; ++i) {
+                               mWeaponDefinitions[i].LoadObject(tag_data);
+                               if (!mWeaponDefinitions[i].IsGood()) {
+                                       return stream;
+                               }
+                       }
+                       break;
+               }
+               }
+       } while (next_offset);
+
+       if (mConstants.size() && mMonsterDefinitions.size() && mEffectDefinitions.size() && mProjectileDefinitions.size() && mWeaponDefinitions.size()) {
+               mGoodData = true;
+       }
+
+       return stream;
+}
+
+template<class T> 
+void PhysicsDocument::WriteTag(BigEndianBuffer& buffer, long& offset, unsigned long tag, const std::vector<T>& data, bool last)
+{
+       long entry_size = T::kSize * data.size();
+       offset += entry_size + kEntryHeaderSize;
+
+       buffer.WriteULong(tag);
+       buffer.WriteLong(last ? 0 : offset);
+       buffer.WriteLong(entry_size);
+       buffer.WriteLong(0);
+
+       for (typename std::vector<T>::const_iterator it = data.begin(); it != data.end(); ++it) {
+               it->SaveObject(buffer);
+       }
+
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD ostream& PhysicsDocument::SaveObject(wxSTD ostream& stream)
+#else
+wxOutputStream& PhysicsDocument::SaveObject(wxOutputStream& stream)
+#endif
+{
+       unsigned long filesize = SizeInFile();
+       BigEndianBuffer buffer(filesize);
+
+       // header
+       buffer.WriteShort(2);                // version
+       buffer.WriteShort(0);                // data version
+       buffer.WriteBlock(MAXIMUM_WADFILE_NAME_LENGTH, wadfile_name);
+       buffer.WriteULong(0);                // blank checksum
+       buffer.WriteLong(filesize - 10);     // directory offset
+       buffer.WriteShort(1);                // wad count
+       buffer.WriteShort(0);                // application specific data size
+       buffer.WriteShort(kEntryHeaderSize); // entry header size
+       buffer.WriteShort(10);               // directory entry size
+       buffer.WriteLong(0);                 // parent checksum
+       buffer.WriteZeroes(40);              // unused
+
+       // tags
+       long next_offset = 0;
+       WriteTag(buffer, next_offset, FOUR_CHARS_TO_INT('M','N','p','x'), mMonsterDefinitions);
+       WriteTag(buffer, next_offset, FOUR_CHARS_TO_INT('F','X','p','x'), mEffectDefinitions);
+       WriteTag(buffer, next_offset, FOUR_CHARS_TO_INT('P','R','p','x'), mProjectileDefinitions);
+       WriteTag(buffer, next_offset, FOUR_CHARS_TO_INT('P','X','p','x'), mConstants);
+       WriteTag(buffer, next_offset, FOUR_CHARS_TO_INT('W','P','p','x'), mWeaponDefinitions, true);
+
+       // directory
+       buffer.WriteLong(128);
+       buffer.WriteLong(filesize - 128 - 10);
+       buffer.WriteShort(0);
+
+       buffer.Position(68);
+       buffer.WriteULong(buffer.CalculateCRC());
+
+#if wxUSE_STD_IOSTREAM
+       stream.write(reinterpret_cast<char *>(buffer.Data()), buffer.Size());
+#else
+       stream.Write(reinterpret_cast<char *>(buffer.Data()), buffer.Size());
+#endif
+
+       return stream;
+}
+
+unsigned long PhysicsDocument::SizeInFile()
+{
+       unsigned long size = 0;
+       size += 128; // wad header
+
+       size += kEntryHeaderSize;
+       size += MonsterDefinition::kSize * mMonsterDefinitions.size();
+       
+       size += kEntryHeaderSize;
+       size += EffectDefinition::kSize * mEffectDefinitions.size();
+       
+       size += kEntryHeaderSize;
+       size += ProjectileDefinition::kSize * mProjectileDefinitions.size();
+       
+       size += kEntryHeaderSize;
+       size += PhysicsConstants::kSize * mConstants.size();
+
+       size += kEntryHeaderSize;
+       size += WeaponDefinition::kSize * mWeaponDefinitions.size();
+
+       size += 10; // directory entry
+
+       return size;
+}
diff --git a/Physics/PhysicsDocument.h b/Physics/PhysicsDocument.h
new file mode 100644 (file)
index 0000000..4549261
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __PHYSICSDOCUMENT_H__
+#define __PHYSICSDOCUMENT_H__
+
+#include "wx/docview.h"
+#include "wx/cmdproc.h"
+
+#include <vector>
+
+#include <stdint.h>
+
+#include "PhysicsElements.h"
+
+class PhysicsDocument : public wxDocument, public PhysicsElement
+{
+       DECLARE_DYNAMIC_CLASS(PhysicsDocument)
+
+private:
+       std::vector<MonsterDefinition> mMonsterDefinitions;
+       std::vector<EffectDefinition> mEffectDefinitions;
+       std::vector<ProjectileDefinition> mProjectileDefinitions;
+       std::vector<PhysicsConstants> mConstants;
+       std::vector<WeaponDefinition> mWeaponDefinitions;
+
+       static const int MAXIMUM_WADFILE_NAME_LENGTH = 64;
+       unsigned char wadfile_name[MAXIMUM_WADFILE_NAME_LENGTH];
+       
+       static const int kEntryHeaderSize = 16;
+
+public:
+       // counts
+       unsigned int MonsterCount() const { return mMonsterDefinitions.size(); }
+       unsigned int EffectCount() const { return mEffectDefinitions.size(); }
+       unsigned int ProjectileCount() const { return mProjectileDefinitions.size(); }
+       unsigned int PhysicsConstantsCount() const { return mConstants.size(); }
+       unsigned int WeaponCount() const { return mWeaponDefinitions.size(); }
+
+       // element accessors
+       PhysicsConstants* GetPhysicsConstants(unsigned int id) { 
+               return &mConstants[id];
+       }
+
+       EffectDefinition* GetEffectDefinition(unsigned int id) {
+               return &mEffectDefinitions[id];
+       }
+
+       ProjectileDefinition* GetProjectileDefinition(unsigned int id) {
+               return &mProjectileDefinitions[id];
+       }
+       
+       MonsterDefinition* GetMonsterDefinition(unsigned int id) {
+               return &mMonsterDefinitions[id];
+       }
+
+       WeaponDefinition* GetWeaponDefinition(unsigned int id) {
+               return &mWeaponDefinitions[id];
+       }
+
+       PhysicsDocument();
+       ~PhysicsDocument();
+
+       bool DoOpenDocument(const wxString& file);
+
+#if wxUSE_STD_IOSTREAM
+       wxSTD ostream& SaveObject(wxSTD ostream& stream);
+       wxSTD istream& LoadObject(wxSTD istream& stream);
+#else
+       wxOutputStream& SaveObject(wxOutputStream& stream);
+       wxInputStream& LoadObject(wxInputStream& stream);
+#endif
+
+       unsigned long SizeInFile();
+       template<class T> void WriteTag(BigEndianBuffer& buffer, long& offset, unsigned long tag, const std::vector<T>& data, bool last = false);
+};
+
+#endif
diff --git a/Physics/PhysicsEditor.cpp b/Physics/PhysicsEditor.cpp
new file mode 100644 (file)
index 0000000..cbe58da
--- /dev/null
@@ -0,0 +1,1361 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include "wx/clipbrd.h"
+
+#include <cmath>
+
+#include "PhysicsView.h"
+#include "PhysicsTreeItemData.h"
+#include "../ShapeFusionMenus.h"
+
+BEGIN_EVENT_TABLE(PhysicsView, wxView)
+       EVT_MENU(EDIT_MENU_COPY, PhysicsView::MenuEditCopy)
+       EVT_MENU(EDIT_MENU_PASTE, PhysicsView::MenuEditPaste)
+        EVT_TREE_SEL_CHANGED(-1, PhysicsView::OnTreeSelect)
+       EVT_COMMAND_RANGE(FIELD_ALIEN_COLLECTION, FIELD_ALIEN_RANGED_ATTACK_SHAPE, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditAlienFields)
+       EVT_TEXT(FIELD_ALIEN_RANDOM_SOUND_MASK, PhysicsView::EditAlienFields)
+       EVT_TEXT(FIELD_ALIEN_SOUND_PITCH, PhysicsView::EditAlienDoubles)
+       EVT_COMMAND_RANGE(MENU_ALIEN_ACTIVATION, MENU_ALIEN_RANDOM, wxEVT_COMMAND_CHOICE_SELECTED, PhysicsView::EditAlienMenus)
+       EVT_TEXT(FIELD_ALIEN_ATTACK_FREQUENCY, PhysicsView::EditAlienFields)
+       EVT_CHOICE(MENU_ALIEN_ATTACK_TYPE, PhysicsView::EditAlienMenus)
+       EVT_COMMAND_RANGE(FIELD_ALIEN_ATTACK_REPETITIONS, FIELD_ALIEN_ATTACK_DZ, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditAlienFields)
+       EVT_CHOICE(MENU_ALIEN_ATTACK_TYPE + NUM_ALIEN_ATTACK_CONTROLS, PhysicsView::EditAlienMenus)
+       EVT_COMMAND_RANGE(FIELD_ALIEN_ATTACK_REPETITIONS + NUM_ALIEN_ATTACK_CONTROLS, FIELD_ALIEN_ATTACK_DZ + NUM_ALIEN_ATTACK_CONTROLS, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditAlienFields)
+       EVT_TEXT(FIELD_ALIEN_SHRAPNEL_RADIUS, PhysicsView::EditAlienFields)
+       EVT_CHOICE(MENU_ALIEN_SHRAPNEL_DAMAGE_TYPE, PhysicsView::EditAlienMenus)
+       EVT_COMMAND_RANGE(FIELD_ALIEN_SHRAPNEL_BASE_DAMAGE, FIELD_ALIEN_SHRAPNEL_RANDOM_DAMAGE, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditAlienFields)
+       EVT_TEXT(FIELD_ALIEN_SHRAPNEL_DAMAGE_SCALE, PhysicsView::EditAlienDoubles)
+       EVT_CHECKBOX(CB_ALIEN_SHRAPNEL_ALIEN_DAMAGE, PhysicsView::EditAlienCheckboxes)
+       EVT_CHOICE(MENU_ALIEN_RANGED_IMPACT_EFFECT, PhysicsView::EditAlienMenus)
+       EVT_CHOICE(MENU_ALIEN_MELEE_IMPACT_EFFECT, PhysicsView::EditAlienMenus)
+       EVT_COMMAND_RANGE(FIELD_ALIEN_VITALITY, FIELD_ALIEN_MAX_LEDGE_JUMP, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditAlienFields)
+       EVT_TEXT(FIELD_ALIEN_EXT_VELOCITY_SCALE, PhysicsView::EditAlienDoubles)
+       EVT_COMMAND_RANGE(FIELD_ALIEN_HOVER_HEIGHT, FIELD_ALIEN_INTELLIGENCE, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditAlienFields)
+       EVT_COMMAND_RANGE(MENU_ALIEN_CARRYING_ITEM, MENU_ALIEN_CLASS, wxEVT_COMMAND_CHOICE_SELECTED, PhysicsView::EditAlienMenus)
+       EVT_COMMAND_RANGE(CB_ALIEN_FRIENDS, CB_ALIEN_WEAKNESSES + 23, wxEVT_COMMAND_CHECKBOX_CLICKED, PhysicsView::EditAlienCheckboxes)
+
+       EVT_COMMAND_RANGE(FIELD_EFFECT_COLLECTION, FIELD_EFFECT_SEQUENCE, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditEffectFields)
+       EVT_TEXT(FIELD_EFFECT_PITCH, PhysicsView::EditEffectDoubles)
+       EVT_CHOICE(MENU_EFFECT_DELAY_SOUND, PhysicsView::EditEffectMenus)
+       EVT_COMMAND_RANGE(CB_EFFECT_END_WHEN_ANIMATION_LOOPS, CB_EFFECT_MEDIA_EFFECT, wxEVT_COMMAND_CHECKBOX_CLICKED, PhysicsView::EditEffectCheckboxes)
+
+       EVT_COMMAND_RANGE(CB_SHOT_FLAGS, CB_SHOT_ALIEN_DAMAGE, wxEVT_COMMAND_CHECKBOX_CLICKED, PhysicsView::EditShotCheckboxes)
+       EVT_COMMAND_RANGE(FIELD_SHOT_COLLECTION, FIELD_SHOT_MAXIMUM_CONTRAILS, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditShotFields)
+       EVT_COMMAND_RANGE(FIELD_SHOT_DAMAGE_SCALE, FIELD_SHOT_SOUND_PITCH, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditShotDoubles)
+       EVT_COMMAND_RANGE(MENU_SHOT_DAMAGE_TYPE, MENU_SHOT_MEDIA_IMPACT, wxEVT_COMMAND_CHOICE_SELECTED, PhysicsView::EditShotMenus)
+
+       EVT_COMMAND_RANGE(FIELD_MAX_FORWARD_VELOCITY, FIELD_HALF_CAMERA_SEPARATION, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditPhysicsConstants)
+
+       EVT_COMMAND_RANGE(CB_WEAPON_FLAGS, CB_WEAPON_FLAGS + 9, wxEVT_COMMAND_CHECKBOX_CLICKED, PhysicsView::EditWeaponCheckboxes)
+       EVT_COMMAND_RANGE(FIELD_WEAPON_COLLECTION, FIELD_WEAPON_FLASH_DECAY, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditWeaponFields)
+       EVT_COMMAND_RANGE(FIELD_WEAPON_FLASH_INTENSITY, FIELD_WEAPON_IDLE_WIDTH, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditWeaponDoubles)
+       EVT_COMMAND_RANGE(MENU_WEAPON_ITEM_TYPE, MENU_WEAPON_CLASS, wxEVT_COMMAND_CHOICE_SELECTED, PhysicsView::EditWeaponMenus)
+       EVT_COMMAND_RANGE(FIELD_TRIGGER_ROUNDS, FIELD_TRIGGER_BURST_COUNT, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditTriggerFields)
+       EVT_COMMAND_RANGE(FIELD_TRIGGER_ROUNDS + NUM_TRIGGER_IDS, FIELD_TRIGGER_BURST_COUNT + NUM_TRIGGER_IDS, wxEVT_COMMAND_TEXT_UPDATED, PhysicsView::EditTriggerFields)
+       EVT_COMMAND_RANGE(MENU_TRIGGER_PROJECTILE, MENU_TRIGGER_SHELL_CASING_TYPE, wxEVT_COMMAND_CHOICE_SELECTED, PhysicsView::EditTriggerMenus)
+       EVT_COMMAND_RANGE(MENU_TRIGGER_PROJECTILE + NUM_TRIGGER_IDS, MENU_TRIGGER_SHELL_CASING_TYPE + NUM_TRIGGER_IDS, wxEVT_COMMAND_CHOICE_SELECTED, PhysicsView::EditTriggerMenus)
+END_EVENT_TABLE()
+
+IMPLEMENT_DYNAMIC_CLASS(PhysicsView, wxView)
+
+
+static inline wxString Format(double f) { 
+       return wxString::Format(wxT("%0.4f"), f);
+}
+
+static inline wxString Format(unsigned short u) {
+       return wxString::Format(wxT("%hu"), u);
+}
+
+static inline wxString Format(short i) {
+       return wxString::Format(wxT("%hi"), i);
+}
+
+void PhysicsView::OnSelectPhysicsConstants(int index)
+{
+       PhysicsConstants* constants = static_cast<PhysicsDocument*>(GetDocument())->GetPhysicsConstants(index);
+
+       max_forward_velocity_field->ChangeValue(Format(constants->GetMaximumForwardVelocity()));
+       max_backward_velocity_field->ChangeValue(Format(constants->GetMaximumBackwardVelocity()));
+       max_perpendicular_velocity_field->ChangeValue(Format(constants->GetMaximumPerpendicularVelocity()));
+
+       acceleration_field->ChangeValue(Format(constants->GetAcceleration()));
+       deceleration_field->ChangeValue(Format(constants->GetDeceleration()));
+       airborne_deceleration_field->ChangeValue(Format(constants->GetAirborneDeceleration()));
+       gravitational_acceleration_field->ChangeValue(Format(constants->GetGravitationalAcceleration()));
+       climbing_acceleration_field->ChangeValue(Format(constants->GetClimbingAcceleration()));
+       terminal_velocity_field->ChangeValue(Format(constants->GetTerminalVelocity()));
+       external_deceleration_field->ChangeValue(Format(constants->GetExternalDeceleration()));
+
+       step_delta_field->ChangeValue(Format(constants->GetStepDelta()));
+       step_amplitude_field->ChangeValue(Format(constants->GetStepAmplitude()));
+
+       radius_field->ChangeValue(Format(constants->GetRadius()));
+       height_field->ChangeValue(Format(constants->GetHeight()));
+
+       angular_acceleration_field->ChangeValue(Format(constants->GetAngularAcceleration()));
+       angular_deceleration_field->ChangeValue(Format(constants->GetAngularDeceleration()));
+       maximum_angular_velocity_field->ChangeValue(Format(constants->GetMaximumAngularVelocity()));
+       angular_recentering_velocity_field->ChangeValue(Format(constants->GetAngularRecenteringVelocity()));
+       head_angular_velocity_field->ChangeValue(Format(constants->GetFastAngularVelocity()));
+       head_angular_maximum_field->ChangeValue(Format(constants->GetFastAngularMaximum()));
+       maximum_elevation_field->ChangeValue(Format(constants->GetMaximumElevation()));
+       external_angular_deceleration_field->ChangeValue(Format(constants->GetExternalAngularDeceleration()));
+
+       dead_height_field->ChangeValue(Format(constants->GetDeadHeight()));
+       camera_height_field->ChangeValue(Format(constants->GetCameraHeight()));
+       splash_height_field->ChangeValue(Format(constants->GetSplashHeight()));
+       half_camera_separation_field->ChangeValue(Format(constants->GetHalfCameraSeparation()));
+       
+       mainbox->Show(physics_sizer, true);
+}
+
+void PhysicsView::OnSelectAlienAppearance(int index)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(index);
+
+       alien_collection_field->ChangeValue(Format(monster->GetCollection()));
+       alien_color_table_field->ChangeValue(Format(monster->GetColorTable()));
+       
+       alien_hit_field->ChangeValue(Format(monster->GetHitShapes()));
+       alien_hard_dying_field->ChangeValue(Format(monster->GetHardDyingShape()));
+       alien_soft_dying_field->ChangeValue(Format(monster->GetSoftDyingShape()));
+       alien_hard_dead_field->ChangeValue(Format(monster->GetHardDeadShapes()));
+       alien_soft_dead_field->ChangeValue(Format(monster->GetSoftDeadShapes()));
+       alien_stationary_field->ChangeValue(Format(monster->GetStationaryShape()));
+       alien_moving_field->ChangeValue(Format(monster->GetMovingShape()));
+       alien_teleport_in_field->ChangeValue(Format(monster->GetTeleportInShape()));
+       alien_teleport_out_field->ChangeValue(Format(monster->GetTeleportOutShape()));
+       alien_melee_attack_shape_field->ChangeValue(Format(monster->GetMeleeAttack()->GetShape()));
+       alien_ranged_attack_shape_field->ChangeValue(Format(monster->GetRangedAttack()->GetShape()));
+
+       alien_activation_choice->SetSelection(monster->GetActivationSound() + 1);
+       alien_friendly_activation_choice->SetSelection(monster->GetFriendlyActivationSound() + 1);
+       alien_clear_choice->SetSelection(monster->GetClearSound() + 1);
+       alien_kill_choice->SetSelection(monster->GetKillSound() + 1);
+       alien_apology_choice->SetSelection(monster->GetApologySound() + 1);
+       alien_friendly_fire_choice->SetSelection(monster->GetFriendlyFireSound() + 1);
+       alien_flaming_choice->SetSelection(monster->GetFlamingSound() + 1);
+       alien_random_choice->SetSelection(monster->GetRandomSound() + 1);
+
+       alien_random_sound_mask_field->ChangeValue(Format(monster->GetRandomSoundMask()));
+       alien_sound_pitch_field->ChangeValue(Format(monster->GetSoundPitch()));
+       
+       mainbox->Show(aliens_appearance_sizer, true);
+}
+
+void PhysicsView::OnSelectAlienCombat(int index)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(index);
+
+       alien_attack_frequency_field->ChangeValue(Format(monster->GetAttackFrequency()));
+       
+       for (int i = 0; i < 2; ++i) {
+               AttackDefinition* attack = (i == 0) ? monster->GetMeleeAttack() : monster->GetRangedAttack();
+               alien_attack_type_choices[i]->SetSelection(attack->GetType() + 1);
+               alien_attack_repetitions_fields[i]->ChangeValue(Format(attack->GetRepetitions()));
+               // Anvil displays the raw angle units here...
+               alien_attack_error_fields[i]->ChangeValue(Format(static_cast<short>(std::floor(attack->GetError() * 512.0 / 360.0 + 0.5))));
+               alien_attack_range_fields[i]->ChangeValue(Format(attack->GetRange()));
+               alien_attack_sequence_fields[i]->ChangeValue(Format(attack->GetShape()));
+               alien_attack_dx_fields[i]->ChangeValue(Format(attack->GetDx()));
+               alien_attack_dy_fields[i]->ChangeValue(Format(attack->GetDy()));
+               alien_attack_dz_fields[i]->ChangeValue(Format(attack->GetDz()));
+       }
+
+       alien_shrapnel_radius_field->ChangeValue(Format(monster->GetShrapnelRadius()));
+
+       DamageDefinition* shrapnel = monster->GetShrapnelDamage();
+       alien_shrapnel_damage_type_choice->SetSelection(shrapnel->GetType() + 1);
+       alien_shrapnel_base_damage_field->ChangeValue(Format(shrapnel->GetBase()));
+       alien_shrapnel_random_damage_field->ChangeValue(Format(shrapnel->GetRandom()));
+       alien_shrapnel_damage_scale_field->ChangeValue(Format(shrapnel->GetScale()));
+       alien_shrapnel_alien_damage_checkbox->SetValue(shrapnel->GetAlien());
+
+       alien_ranged_impact_effect_choice->SetSelection(monster->GetImpactEffect() + 1);
+       alien_melee_impact_effect_choice->SetSelection(monster->GetMeleeImpactEffect() + 1);
+
+       mainbox->Show(aliens_combat_sizer, true);
+}
+
+void PhysicsView::OnSelectAlienConstants(int index)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(index);
+
+       alien_vitality_field->ChangeValue(Format(monster->GetVitality()));
+
+       alien_radius_field->ChangeValue(Format(monster->GetRadius()));
+       alien_height_field->ChangeValue(Format(monster->GetHeight()));
+
+       alien_speed_field->ChangeValue(Format(monster->GetSpeed()));
+
+       alien_terminal_velocity_field->ChangeValue(Format(monster->GetTerminalVelocity()));
+       alien_gravity_field->ChangeValue(Format(monster->GetGravity()));
+
+       alien_min_ledge_jump_field->ChangeValue(Format(monster->GetMinimumLedgeDelta()));
+       alien_max_ledge_jump_field->ChangeValue(Format(monster->GetMaximumLedgeDelta()));
+       alien_ext_velocity_scale_field->ChangeValue(Format(monster->GetExternalVelocityScale()));
+       alien_hover_height_field->ChangeValue(Format(monster->GetPreferredHoverHeight()));
+       
+       alien_door_retry_mask_field->ChangeValue(Format(monster->GetDoorRetryMask()));
+
+       alien_visual_range_field->ChangeValue(Format(monster->GetVisualRange()));
+       alien_dark_visual_range_field->ChangeValue(Format(monster->GetDarkVisualRange()));
+       alien_intelligence_field->ChangeValue(Format(monster->GetIntelligence()));
+
+       alien_carrying_item_choice->SetSelection(monster->GetCarryingItemType() + 1);
+       alien_contrail_effect_choice->SetSelection(monster->GetContrailEffect() + 1);
+
+       mainbox->Show(aliens_constants_sizer, true);
+}
+
+void PhysicsView::OnSelectAlienBehavior(int index)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(index);
+
+       int monster_class_index = 0;
+       long monster_class = monster->GetClass();
+       while (monster_class >>= 1) {
+               monster_class_index++;
+       }
+       alien_class_choice->SetSelection(monster_class_index);
+
+       for (int i = 0; i < 16; ++i) {
+               alien_friends_checkboxes[i]->SetValue(monster->GetFriend(i));
+               alien_enemies_checkboxes[i]->SetValue(monster->GetEnemy(i));
+       }
+
+       for (int i = 0; i < 27; ++i) {
+               alien_flags_checkboxes[i]->SetValue(monster->GetFlag(i + 1));
+       }
+
+       mainbox->Show(aliens_behavior_sizer, true);
+}
+
+void PhysicsView::OnSelectAlienImmunities(int index)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(index);
+
+       for (int i = 0; i < 24; ++i) {
+               alien_immunities_checkboxes[i]->SetValue(monster->GetImmunity(i));
+               alien_weaknesses_checkboxes[i]->SetValue(monster->GetWeakness(i));
+       }
+
+       mainbox->Show(aliens_immunities_sizer, true);
+}
+
+void PhysicsView::OnSelectEffect(int index)
+{
+       EffectDefinition* effect = static_cast<PhysicsDocument*>(GetDocument())->GetEffectDefinition(index);
+       
+       eff_collection_field->ChangeValue(Format(effect->GetCollection()));
+       eff_color_table_field->ChangeValue(Format(effect->GetColorTable()));
+       eff_sequence_field->ChangeValue(Format(effect->GetShape()));
+       
+       eff_delay_field->ChangeValue(Format(effect->GetDelay()));
+       eff_pitch_field->ChangeValue(Format(effect->GetSoundPitch()));
+
+       eff_delay_sound_choice->SetSelection(effect->GetDelaySound() + 1);
+       
+       eff_end_when_animation_loops_checkbox->SetValue(effect->GetEndWhenAnimationLoops());
+       eff_end_when_transfer_animation_loops_checkbox->SetValue(effect->GetEndWhenTransferAnimationLoops());
+       eff_sound_only_checkbox->SetValue(effect->GetSoundOnly());
+       eff_media_effect_checkbox->SetValue(effect->GetMediaEffect());
+       
+       mainbox->Show(effects_sizer, true);
+}
+
+void PhysicsView::OnSelectShot(int index)
+{
+       ProjectileDefinition* projectile = static_cast<PhysicsDocument*>(GetDocument())->GetProjectileDefinition(index);
+       
+       shots_collection_field->ChangeValue(Format(projectile->GetCollection()));
+       shots_color_table_field->ChangeValue(Format(projectile->GetColorTable()));
+       shots_sequence_field->ChangeValue(Format(projectile->GetShape()));
+
+       DamageDefinition* damage = projectile->GetDamage();
+
+       shots_damage_type_choice->SetSelection(damage->GetType() + 1);
+       shots_damage_base_field->ChangeValue(Format(damage->GetBase()));
+       shots_damage_random_field->ChangeValue(Format(damage->GetRandom()));
+       shots_damage_scale_field->ChangeValue(Format(damage->GetScale()));
+       shots_alien_damage_checkbox->SetValue(damage->GetAlien());
+
+       shots_flyby_sound_choice->SetSelection(projectile->GetFlybySound() + 1);
+       shots_rebound_sound_choice->SetSelection(projectile->GetReboundSound() + 1);
+       shots_sound_pitch_field->ChangeValue(Format(projectile->GetSoundPitch()));
+       
+       shots_radius_field->ChangeValue(Format(projectile->GetRadius()));
+       shots_area_of_effect_field->ChangeValue(Format(projectile->GetAreaOfEffect()));
+       shots_speed_field->ChangeValue(Format(projectile->GetSpeed()));
+       shots_range_field->ChangeValue(Format(projectile->GetMaximumRange()));
+
+       shots_detonation_effect_choice->SetSelection(projectile->GetDetonationEffect() + 1);
+       shots_media_detonation_effect_choice->SetSelection(projectile->GetMediaDetonationEffect() + 1);
+       shots_contrail_choice->SetSelection(projectile->GetContrailEffect() + 1);
+       shots_contrail_ticks_field->ChangeValue(Format(projectile->GetTicksBetweenContrails()));
+       shots_maximum_contrails_field->ChangeValue(Format(projectile->GetMaximumContrails()));
+
+       for (int i = 0; i < 22; ++i) {
+               shots_flags_checkboxes[i]->SetValue(projectile->GetFlag(i));
+       }
+
+       shots_media_impact_choice->SetSelection(projectile->GetMediaProjectilePromotion() + 1);
+
+       mainbox->Show(shots_sizer, true);
+}
+
+void PhysicsView::OnSelectWeaponDefinition(int index)
+{
+       WeaponDefinition* weapon = static_cast<PhysicsDocument*>(GetDocument())->GetWeaponDefinition(index);
+
+       weapon_item_type_choice->SetSelection(weapon->GetItemType() + 1);
+
+       weapon_collection_field->ChangeValue(Format(weapon->GetCollection()));
+       weapon_color_table_field->ChangeValue(Format(weapon->GetColorTable()));
+       weapon_idle_field->ChangeValue(Format(weapon->GetIdleShape()));
+       weapon_firing_field->ChangeValue(Format(weapon->GetFiringShape()));
+       weapon_reloading_field->ChangeValue(Format(weapon->GetReloadingShape()));
+       weapon_charging_field->ChangeValue(Format(weapon->GetChargingShape()));
+       weapon_charged_field->ChangeValue(Format(weapon->GetChargedShape()));
+       weapon_flash_intensity_field->ChangeValue(Format(weapon->GetFiringLightIntensity()));
+
+       weapon_ready_field->ChangeValue(Format(weapon->GetReadyTicks()));
+       weapon_await_reload_field->ChangeValue(Format(weapon->GetAwaitReloadTicks()));
+       weapon_loading_field->ChangeValue(Format(weapon->GetLoadingTicks()));
+       weapon_finish_loading_field->ChangeValue(Format(weapon->GetFinishLoadingTicks()));
+       weapon_flash_decay_field->ChangeValue(Format(weapon->GetFiringIntensityDecayTicks()));
+
+       weapon_class_choice->SetSelection(weapon->GetWeaponClass() + 1);
+       
+       weapon_idle_height_field->ChangeValue(Format(weapon->GetIdleHeight()));
+       weapon_bob_amplitude_field->ChangeValue(Format(weapon->GetBobAmplitude()));
+       weapon_kick_height_field->ChangeValue(Format(weapon->GetKickHeight()));
+       weapon_reload_height_field->ChangeValue(Format(weapon->GetReloadHeight()));
+       weapon_idle_width_field->ChangeValue(Format(weapon->GetIdleWidth()));
+
+       for (int i = 0; i < 10; ++i) {
+               weapon_flags_checkboxes[i]->SetValue(weapon->GetFlag(i >= 5 ? i + 1 : i));
+       }
+
+       mainbox->Show(weapons_definitions_sizer, true);
+}
+
+void PhysicsView::OnSelectWeaponTriggers(int index)
+{
+       WeaponDefinition* weapon = static_cast<PhysicsDocument*>(GetDocument())->GetWeaponDefinition(index);
+
+       for (int i = 0; i < 2; ++i) {
+               TriggerDefinition* trigger = (i == 0) ? weapon->GetPrimaryTrigger() : weapon->GetSecondaryTrigger();
+
+               trigger_projectile_choices[i]->SetSelection(trigger->GetProjectileType() + 1);
+               trigger_rounds_fields[i]->ChangeValue(Format(trigger->GetRoundsPerMagazine()));
+               trigger_ammo_type_choices[i]->SetSelection(trigger->GetAmmunitionType() + 1);
+
+               trigger_firing_choices[i]->SetSelection(trigger->GetFiringSound() + 1);
+               trigger_click_choices[i]->SetSelection(trigger->GetClickSound() + 1);
+               trigger_charging_choices[i]->SetSelection(trigger->GetChargingSound() + 1);
+               trigger_shell_casing_choices[i]->SetSelection(trigger->GetShellCasingSound() + 1);
+               trigger_reloading_choices[i]->SetSelection(trigger->GetReloadingSound() + 1);
+               trigger_charged_choices[i]->SetSelection(trigger->GetChargedSound() + 1);
+
+               trigger_ticks_fields[i]->ChangeValue(Format(trigger->GetTicksPerRound()));
+               trigger_recovery_fields[i]->ChangeValue(Format(trigger->GetRecoveryTicks()));
+               trigger_charging_fields[i]->ChangeValue(Format(trigger->GetChargingTicks()));
+               trigger_recoil_fields[i]->ChangeValue(Format(trigger->GetRecoilMagnitude()));
+               trigger_theta_fields[i]->ChangeValue(Format(trigger->GetThetaError()));
+               trigger_dx_fields[i]->ChangeValue(Format(trigger->GetDx()));
+               trigger_dz_fields[i]->ChangeValue(Format(trigger->GetDz()));
+               trigger_burst_count_fields[i]->ChangeValue(Format(trigger->GetBurstCount()));
+
+               trigger_shell_casing_type_choices[i]->SetSelection(trigger->GetShellCasingType() + 1);
+
+       }
+
+       mainbox->Show(weapons_triggers_sizer, true);
+}
+
+void PhysicsView::OnTreeSelect(wxTreeEvent& e)
+{
+       PhysicsTreeItemData* data = dynamic_cast<PhysicsTreeItemData*>(tree->GetItemData(e.GetItem()));
+       if (data) {
+               mainbox->Show(aliens_appearance_sizer, false);
+               mainbox->Show(aliens_behavior_sizer, false);
+               mainbox->Show(aliens_combat_sizer, false);
+               mainbox->Show(aliens_constants_sizer, false);
+               mainbox->Show(aliens_immunities_sizer, false);
+               mainbox->Show(dummy_sizer, false);
+               mainbox->Show(effects_sizer, false);
+               mainbox->Show(shots_sizer, false);
+               mainbox->Show(physics_sizer, false);
+               mainbox->Show(weapons_definitions_sizer, false);
+               mainbox->Show(weapons_triggers_sizer, false);
+
+               int new_section = data->Section();
+               switch (new_section) {
+               case TREESECTION_PHYSICS:
+                       OnSelectPhysicsConstants(data->ID());
+                       break;
+               case TREESECTION_EFFECTS:
+                       OnSelectEffect(data->ID());
+                       break;
+               case TREESECTION_PROJECTILES:
+                       OnSelectShot(data->ID());
+                       break;
+               case TREESECTION_MONSTERS_APPEARANCE:
+                       OnSelectAlienAppearance(data->ID());
+                       break;
+               case TREESECTION_MONSTERS_COMBAT:
+                       OnSelectAlienCombat(data->ID());
+                       break;
+               case TREESECTION_MONSTERS_CONSTANTS:
+                       OnSelectAlienConstants(data->ID());
+                       break;
+               case TREESECTION_MONSTERS_BEHAVIOR:
+                       OnSelectAlienBehavior(data->ID());
+                       break;
+               case TREESECTION_MONSTERS_IMMUNITIES:
+                       OnSelectAlienImmunities(data->ID());
+                       break;
+               case TREESECTION_WEAPONS_SETTINGS:
+                       OnSelectWeaponDefinition(data->ID());
+                       break;
+               case TREESECTION_WEAPONS_TRIGGERS:
+                       OnSelectWeaponTriggers(data->ID());
+                       break;
+               default:
+                       mainbox->Show(dummy_sizer, true);
+                       break;
+               }
+
+               switch (new_section) {
+               case TREESECTION_MONSTERS:
+               case TREESECTION_EFFECTS:
+               case TREESECTION_PROJECTILES:
+               case TREESECTION_PHYSICS:
+               case TREESECTION_WEAPONS:
+                       menubar->Enable(EDIT_MENU_COPY, true);
+                       menubar->Enable(EDIT_MENU_PASTE, true);
+                       break;
+               default:
+                       menubar->Enable(EDIT_MENU_COPY, false);
+                       menubar->Enable(EDIT_MENU_PASTE, false);
+                       break;
+               }
+
+               mainbox->Layout();
+       }
+}
+
+short PhysicsView::GetSelection() {
+       return static_cast<PhysicsTreeItemData*>(tree->GetItemData(tree->GetSelection()))->ID();
+}
+
+template<class T>
+inline unsigned char* Serialize(T* element, size_t& size)
+{
+       size = T::kSize;
+       unsigned char* data = new unsigned char[size];
+       BigEndianBuffer buffer(data, size);
+       element->SaveObject(buffer);
+       return data;
+}
+
+void PhysicsView::MenuEditCopy(wxCommandEvent&) {
+       if (wxTheClipboard->Open()) {
+
+               PhysicsTreeItemData* data = static_cast<PhysicsTreeItemData*>(tree->GetItemData(tree->GetSelection()));
+               PhysicsDocument* document = static_cast<PhysicsDocument*>(GetDocument());
+
+               if (data) {
+                       size_t size = 0;
+                       unsigned char* buf = 0;
+                       wxDataFormat format;
+
+                       switch (data->Section()) {
+                       case TREESECTION_MONSTERS:
+                               buf = Serialize(document->GetMonsterDefinition(data->ID()), size);
+                               format.SetId(wxT("application/vnd.shapefusion.monster"));
+                               break;
+                       case TREESECTION_EFFECTS:
+                               buf = Serialize(document->GetEffectDefinition(data->ID()), size);
+                               format.SetId(wxT("application/vnd.shapefusion.effect"));
+                               break;
+                       case TREESECTION_PROJECTILES:
+                               buf = Serialize(document->GetProjectileDefinition(data->ID()), size);
+                               format.SetId(wxT("application/vnd.shapefusion.projectile"));
+                               break;
+                       case TREESECTION_PHYSICS:
+                               buf = Serialize(document->GetPhysicsConstants(data->ID()), size);
+                               format.SetId(wxT("application/vnd.shapefusion.physics"));
+                               break;
+                       case TREESECTION_WEAPONS:
+                               buf = Serialize(document->GetWeaponDefinition(data->ID()), size);
+                               format.SetId(wxT("application/vnd.shapefusion.weapon"));
+                               break;
+                       }
+
+                       wxCustomDataObject* dataObject = new wxCustomDataObject(format);
+                       dataObject->TakeData(size, buf);
+                       wxTheClipboard->SetData(dataObject);
+                               
+                       wxTheClipboard->Close();
+               }
+       }
+}
+
+void PhysicsView::MenuEditPaste(wxCommandEvent&) {
+       if (wxTheClipboard->Open()) {
+               PhysicsTreeItemData* data = static_cast<PhysicsTreeItemData*>(tree->GetItemData(tree->GetSelection()));
+               PhysicsDocument* document = static_cast<PhysicsDocument*>(GetDocument());
+               
+               if (data) {
+                       wxDataFormat format;
+
+                       switch (data->Section()) {
+                       case TREESECTION_MONSTERS:
+                               format.SetId(wxT("application/vnd.shapefusion.monster"));
+                               break;
+                       case TREESECTION_EFFECTS:
+                               format.SetId(wxT("application/vnd.shapefusion.effect"));
+                               break;
+                       case TREESECTION_PROJECTILES:
+                               format.SetId(wxT("application/vnd.shapefusion.projectile"));
+                               break;
+                       case TREESECTION_PHYSICS:
+                               format.SetId(wxT("application/vnd.shapefusion.physics"));
+                               break;
+                       case TREESECTION_WEAPONS:
+                               format.SetId(wxT("application/vnd.shapefusion.weapon"));
+                               break;
+
+                       }
+
+                       wxCustomDataObject dataObject(format);
+                       if (wxTheClipboard->GetData(dataObject)) {
+                               BigEndianBuffer buffer(reinterpret_cast<unsigned char *>(dataObject.GetData()), dataObject.GetSize());
+                               
+                               switch (data->Section()) {
+                               case TREESECTION_MONSTERS:
+                                       document->GetMonsterDefinition(data->ID())->LoadObject(buffer);
+                                       break;
+                               case TREESECTION_EFFECTS:
+                                       document->GetEffectDefinition(data->ID())->LoadObject(buffer);
+                                       OnSelectEffect(data->ID());
+                                       break;
+                               case TREESECTION_PROJECTILES:
+                                       document->GetProjectileDefinition(data->ID())->LoadObject(buffer);
+                                       OnSelectShot(data->ID());
+                                       break;
+                               case TREESECTION_PHYSICS:
+                                       document->GetPhysicsConstants(data->ID())->LoadObject(buffer);
+                                       OnSelectPhysicsConstants(data->ID());
+                                       break;
+                               case TREESECTION_WEAPONS:
+                                       document->GetWeaponDefinition(data->ID())->LoadObject(buffer);
+                                       break;
+                               }
+
+                               document->Modify(true);
+                       }
+               }
+
+               wxTheClipboard->Close();
+       }
+}
+
+void PhysicsView::EditAlienCheckboxes(wxCommandEvent& e)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(GetSelection());
+
+       int id = e.GetId();
+
+       if (id == CB_ALIEN_SHRAPNEL_ALIEN_DAMAGE) {
+               monster->GetShrapnelDamage()->SetAlien(e.IsChecked());
+       } else if (id >= CB_ALIEN_FRIENDS && id < CB_ALIEN_ENEMIES) {
+               monster->SetFriend(id - CB_ALIEN_FRIENDS, e.IsChecked());
+       } else if (id >= CB_ALIEN_ENEMIES && id < CB_ALIEN_FLAGS) {
+               monster->SetEnemy(id - CB_ALIEN_ENEMIES, e.IsChecked());
+       } else if (id >= CB_ALIEN_FLAGS && id < CB_ALIEN_IMMUNITIES) {
+               monster->SetFlag(id - CB_ALIEN_FLAGS + 1, e.IsChecked());
+       } else if (id >= CB_ALIEN_IMMUNITIES && id < CB_ALIEN_WEAKNESSES) {
+               monster->SetImmunity(id - CB_ALIEN_IMMUNITIES, e.IsChecked());
+       } else if (id >= CB_ALIEN_WEAKNESSES && id <= CB_ALIEN_WEAKNESSES + 24) {
+               monster->SetWeakness(id - CB_ALIEN_WEAKNESSES, e.IsChecked());
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditAlienDoubles(wxCommandEvent& e)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(GetSelection());
+
+       double d = 0.0;
+       if (e.GetString().ToDouble(&d)) {
+               switch (e.GetId()) {
+               case FIELD_ALIEN_SOUND_PITCH:
+                       monster->SetSoundPitch(d);
+                       break;
+               case FIELD_ALIEN_SHRAPNEL_DAMAGE_SCALE:
+                       monster->GetShrapnelDamage()->SetScale(d);
+                       break;
+               case FIELD_ALIEN_EXT_VELOCITY_SCALE:
+                       monster->SetExternalVelocityScale(d);
+                       break;
+               }
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditAlienFields(wxCommandEvent& e)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(GetSelection());
+
+       long v = 0;
+       if (e.GetString().ToLong(&v)) {
+               int id = e.GetId();
+               AttackDefinition* attack = monster->GetMeleeAttack();
+
+               if (id >= MENU_ALIEN_ATTACK_TYPE + NUM_ALIEN_ATTACK_CONTROLS && id <= FIELD_ALIEN_ATTACK_DZ + NUM_ALIEN_ATTACK_CONTROLS)
+               {
+                       id -= NUM_ALIEN_ATTACK_CONTROLS;
+                       attack = monster->GetRangedAttack();
+               }
+               
+               switch (id) {
+                       case FIELD_ALIEN_COLLECTION:
+                               if (v == -1) {
+                                       monster->SetCollection(31);
+                                       monster->SetColorTable(7);
+                                       alien_collection_field->ChangeValue(wxT("31"));
+                                       alien_color_table_field->ChangeValue(wxT("7"));
+                               } else {
+                                       monster->SetCollection(v);
+                               }
+                               break;
+                       case FIELD_ALIEN_COLOR_TABLE:
+                               if (v == -1) {
+                                       monster->SetCollection(31);
+                                       monster->SetColorTable(7);
+                                       alien_collection_field->ChangeValue(wxT("31"));
+                                       alien_color_table_field->ChangeValue(wxT("7"));
+                               } else {
+                                       monster->SetColorTable(v);
+                               }
+                               break;
+                       case FIELD_ALIEN_HIT:
+                               monster->SetHitShapes(v);
+                               break;
+                       case FIELD_ALIEN_HARD_DYING:
+                               monster->SetHardDyingShape(v);
+                               break;
+                       case FIELD_ALIEN_SOFT_DYING:
+                               monster->SetSoftDyingShape(v);
+                               break;
+                       case FIELD_ALIEN_HARD_DEAD:
+                               monster->SetHardDeadShapes(v);
+                               break;
+                       case FIELD_ALIEN_SOFT_DEAD:
+                               monster->SetSoftDeadShapes(v);
+                               break;
+                       case FIELD_ALIEN_STATIONARY:
+                               monster->SetStationaryShape(v);
+                               break;
+                       case FIELD_ALIEN_MOVING:
+                               monster->SetMovingShape(v);
+                               break;
+                       case FIELD_ALIEN_TELEPORT_IN:
+                               monster->SetTeleportInShape(v);
+                               break;
+                       case FIELD_ALIEN_TELEPORT_OUT:
+                               monster->SetTeleportOutShape(v);
+                               break;
+                       case FIELD_ALIEN_MELEE_ATTACK_SHAPE:
+                               monster->GetMeleeAttack()->SetShape(v);
+                               break;
+                       case FIELD_ALIEN_RANGED_ATTACK_SHAPE:
+                               monster->GetRangedAttack()->SetShape(v);
+                               break;
+                       case FIELD_ALIEN_RANDOM_SOUND_MASK:
+                               monster->SetRandomSoundMask(v);
+                               break;
+                       case FIELD_ALIEN_ATTACK_FREQUENCY:
+                               monster->SetAttackFrequency(v);
+                               break;
+                       case FIELD_ALIEN_ATTACK_REPETITIONS:
+                               attack->SetRepetitions(v);
+                               break;
+                       case FIELD_ALIEN_ATTACK_ERROR:
+                               attack->SetError(v / 512.0 * 360.0);
+                               break;
+                       case FIELD_ALIEN_ATTACK_RANGE:
+                               attack->SetRange(v);
+                               break;
+                       case FIELD_ALIEN_ATTACK_SEQUENCE:
+                               attack->SetShape(v);
+                               break;
+                       case FIELD_ALIEN_ATTACK_DX:
+                               attack->SetDx(v);
+                               break;
+                       case FIELD_ALIEN_ATTACK_DY:
+                               attack->SetDy(v);
+                               break;
+                       case FIELD_ALIEN_ATTACK_DZ:
+                               attack->SetDz(v);
+                               break;
+                       case FIELD_ALIEN_SHRAPNEL_RADIUS:
+                               monster->SetShrapnelRadius(v);
+                               break;
+                       case FIELD_ALIEN_SHRAPNEL_BASE_DAMAGE:
+                               monster->GetShrapnelDamage()->SetBase(v);
+                               break;
+                       case FIELD_ALIEN_SHRAPNEL_RANDOM_DAMAGE:
+                               monster->GetShrapnelDamage()->SetRandom(v);
+                               break;
+                       case FIELD_ALIEN_VITALITY:
+                               monster->SetVitality(v);
+                               break;
+                       case FIELD_ALIEN_RADIUS:
+                               monster->SetRadius(v);
+                               break;
+                       case FIELD_ALIEN_HEIGHT:
+                               monster->SetHeight(v);
+                               break;
+                       case FIELD_ALIEN_SPEED:
+                               monster->SetSpeed(v);
+                               break;
+                       case FIELD_ALIEN_TERMINAL_VELOCITY:
+                               monster->SetTerminalVelocity(v);
+                               break;
+                       case FIELD_ALIEN_GRAVITY:
+                               monster->SetGravity(v);
+                               break;                          
+                       case FIELD_ALIEN_MIN_LEDGE_JUMP:
+                               monster->SetMinimumLedgeDelta(v);
+                               break;
+                       case FIELD_ALIEN_MAX_LEDGE_JUMP:
+                               monster->SetMaximumLedgeDelta(v);
+                               break;
+                       case FIELD_ALIEN_HOVER_HEIGHT:
+                               monster->SetPreferredHoverHeight(v);
+                               break;
+                       case FIELD_ALIEN_DOOR_RETRY_MASK:
+                               monster->SetDoorRetryMask(v);
+                               break;
+                       case FIELD_ALIEN_VISUAL_RANGE:
+                               monster->SetVisualRange(v);
+                               break;
+                       case FIELD_ALIEN_DARK_VISUAL_RANGE:
+                               monster->SetDarkVisualRange(v);
+                               break;
+                       case FIELD_ALIEN_INTELLIGENCE:
+                               monster->SetIntelligence(v);
+                               break;          
+               }
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditAlienMenus(wxCommandEvent& e)
+{
+       MonsterDefinition* monster = static_cast<PhysicsDocument*>(GetDocument())->GetMonsterDefinition(GetSelection());
+       
+       switch (e.GetId()) {
+       case MENU_ALIEN_ACTIVATION:
+               monster->SetActivationSound(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_FRIENDLY_ACTIVATION:
+               monster->SetFriendlyActivationSound(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_CLEAR:
+               monster->SetClearSound(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_KILL:
+               monster->SetKillSound(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_APOLOGY:
+               monster->SetApologySound(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_FRIENDLY_FIRE:
+               monster->SetFriendlyFireSound(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_FLAMING:
+               monster->SetFlamingSound(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_RANDOM:
+               monster->SetRandomSound(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_ATTACK_TYPE:
+               monster->GetMeleeAttack()->SetType(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_ATTACK_TYPE + NUM_ALIEN_ATTACK_CONTROLS:
+               monster->GetRangedAttack()->SetType(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_SHRAPNEL_DAMAGE_TYPE:
+               monster->GetShrapnelDamage()->SetType(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_RANGED_IMPACT_EFFECT:
+               monster->SetImpactEffect(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_MELEE_IMPACT_EFFECT:
+               monster->SetMeleeImpactEffect(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_CARRYING_ITEM:
+               monster->SetCarryingItemType(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_CONTRAIL_EFFECT:
+               monster->SetContrailEffect(e.GetSelection() - 1);
+               break;
+       case MENU_ALIEN_CLASS:
+               monster->SetClass(1 << e.GetSelection());
+               break;
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditEffectCheckboxes(wxCommandEvent& e)
+{
+       EffectDefinition* effect = static_cast<PhysicsDocument*>(GetDocument())->GetEffectDefinition(GetSelection());
+       
+       switch (e.GetId()) {
+       case CB_EFFECT_END_WHEN_ANIMATION_LOOPS:
+               effect->SetEndWhenAnimationLoops(e.IsChecked());
+               break;
+       case CB_EFFECT_END_WHEN_TRANSFER_ANIMATION_LOOPS:
+               effect->SetEndWhenTransferAnimationLoops(e.IsChecked());
+               break;
+       case CB_EFFECT_SOUND_ONLY:
+               effect->SetSoundOnly(e.IsChecked());
+               break;
+       case CB_EFFECT_MEDIA_EFFECT:
+               effect->SetMediaEffect(e.IsChecked());
+               break;
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);     
+}
+
+void PhysicsView::EditEffectDoubles(wxCommandEvent& e)
+{
+       EffectDefinition* effect = static_cast<PhysicsDocument*>(GetDocument())->GetEffectDefinition(GetSelection());
+
+       double d = 0.0;
+       if (e.GetString().ToDouble(&d)) {
+               switch (e.GetId()) {
+               case FIELD_EFFECT_PITCH:
+                       effect->SetSoundPitch(d);
+                       break;
+               }
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);     
+}
+
+void PhysicsView::EditEffectFields(wxCommandEvent& e)
+{
+       EffectDefinition* effect = static_cast<PhysicsDocument*>(GetDocument())->GetEffectDefinition(GetSelection());
+
+       long v = 0;
+       if (e.GetString().ToLong(&v)) {
+               switch (e.GetId()) {
+               case FIELD_EFFECT_COLLECTION:
+                       if (v == -1) {
+                               effect->SetCollection(31);
+                               effect->SetColorTable(7);
+                               eff_collection_field->ChangeValue(wxT("31"));
+                               eff_color_table_field->ChangeValue(wxT("7"));
+                       } else {
+                               effect->SetCollection(v);
+                       }
+                       break;
+               case FIELD_EFFECT_COLOR_TABLE:
+                       if (v == -1) {
+                               effect->SetCollection(31);
+                               effect->SetColorTable(7);
+                               eff_collection_field->ChangeValue(wxT("31"));
+                               eff_color_table_field->ChangeValue(wxT("7"));
+                       } else {
+                               effect->SetColorTable(v);
+                       }
+                       break;
+               case FIELD_EFFECT_SEQUENCE:
+                       effect->SetShape(v);
+                       break;
+               }
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditEffectMenus(wxCommandEvent& e)
+{
+       EffectDefinition* effect = static_cast<PhysicsDocument*>(GetDocument())->GetEffectDefinition(GetSelection());
+
+       switch (e.GetId()) {
+       case MENU_EFFECT_DELAY_SOUND:
+               effect->SetDelaySound(e.GetSelection() - 1);
+               break;
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditShotCheckboxes(wxCommandEvent& e)
+{
+       ProjectileDefinition* projectile = static_cast<PhysicsDocument*>(GetDocument())->GetProjectileDefinition(GetSelection());
+       
+       if (e.GetId() == CB_SHOT_ALIEN_DAMAGE) {
+               projectile->GetDamage()->SetAlien(e.IsChecked());
+       } else if (e.GetId() >= CB_SHOT_FLAGS && e.GetId() < CB_SHOT_FLAGS + 22) {
+               projectile->SetFlag(e.GetId() - CB_SHOT_FLAGS, e.IsChecked());
+       }
+       
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditShotFields(wxCommandEvent& e)
+{
+       ProjectileDefinition* projectile = static_cast<PhysicsDocument*>(GetDocument())->GetProjectileDefinition(GetSelection());
+
+       long v = 0;
+       if (e.GetString().ToLong(&v)) {
+               switch (e.GetId()) {
+               case FIELD_SHOT_COLLECTION:
+                       if (v == -1) {
+                               projectile->SetCollection(31);
+                               projectile->SetColorTable(7);
+                               shots_collection_field->ChangeValue(wxT("31"));
+                               shots_color_table_field->ChangeValue(wxT("7"));
+                       } else {
+                               projectile->SetCollection(v);
+                       }
+                       break;
+               case FIELD_SHOT_COLOR_TABLE:
+                       if (v == -1) {
+                               projectile->SetCollection(31);
+                               projectile->SetColorTable(7);
+                               shots_collection_field->ChangeValue(wxT("31"));
+                               shots_color_table_field->ChangeValue(wxT("7"));
+                       } else {
+                               projectile->SetColorTable(v);
+                       }
+                       break;
+               case FIELD_SHOT_SEQUENCE:
+                       projectile->SetShape(v);
+                       break;
+               case FIELD_SHOT_DAMAGE_BASE:
+                       projectile->GetDamage()->SetBase(v);
+                       break;
+               case FIELD_SHOT_DAMAGE_RANDOM:
+                       projectile->GetDamage()->SetRandom(v);
+                       break;
+               case FIELD_SHOT_RADIUS:
+                       projectile->SetRadius(v);
+                       break;
+               case FIELD_SHOT_AREA_OF_EFFECT:
+                       projectile->SetAreaOfEffect(v);
+                       break;
+               case FIELD_SHOT_SPEED:
+                       projectile->SetSpeed(v);
+                       break;
+               case FIELD_SHOT_RANGE:
+                       projectile->SetMaximumRange(v);
+                       break;
+               case FIELD_SHOT_CONTRAIL_TICKS:
+                       projectile->SetTicksBetweenContrails(v);
+                       break;
+               case FIELD_SHOT_MAXIMUM_CONTRAILS:
+                       projectile->SetMaximumContrails(v);
+                       break;
+               }
+       }
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditShotDoubles(wxCommandEvent& e)
+{
+       ProjectileDefinition* projectile = static_cast<PhysicsDocument*>(GetDocument())->GetProjectileDefinition(GetSelection());
+       
+       double d = 0.0;
+
+       if (e.GetString().ToDouble(&d)) {
+               switch (e.GetId()) {
+               case FIELD_SHOT_DAMAGE_SCALE:
+                       projectile->GetDamage()->SetScale(d);
+                       break;
+               case FIELD_SHOT_SOUND_PITCH:
+                       projectile->SetSoundPitch(d);
+                       break;
+               }
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditShotMenus(wxCommandEvent& e)
+{
+       ProjectileDefinition* projectile = static_cast<PhysicsDocument*>(GetDocument())->GetProjectileDefinition(GetSelection());
+
+       switch (e.GetId()) {
+       case MENU_SHOT_DAMAGE_TYPE:
+               projectile->GetDamage()->SetType(e.GetSelection() - 1);
+               break;
+       case MENU_SHOT_FLYBY_SOUND:
+               projectile->SetFlybySound(e.GetSelection() - 1);
+               break;
+       case MENU_SHOT_REBOUND_SOUND:
+               projectile->SetReboundSound(e.GetSelection() - 1);
+               break;
+       case MENU_SHOT_DETONATION_EFFECT:
+               projectile->SetDetonationEffect(e.GetSelection() - 1);
+               break;
+       case MENU_SHOT_MEDIA_DETONATION_EFFECT:
+               projectile->SetMediaDetonationEffect(e.GetSelection() - 1);
+               break;
+       case MENU_SHOT_CONTRAIL:
+               projectile->SetContrailEffect(e.GetSelection() - 1);
+               break;
+       case MENU_SHOT_MEDIA_IMPACT:
+               projectile->SetMediaProjectilePromotion(e.GetSelection() - 1);
+               break;
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);     
+}
+
+void PhysicsView::EditPhysicsConstants(wxCommandEvent& e)
+{
+       PhysicsConstants* constants = static_cast<PhysicsDocument*>(GetDocument())->GetPhysicsConstants(GetSelection());
+
+       double d = 0.0;
+       if (e.GetString().ToDouble(&d)) {
+               switch (e.GetId()) {
+               case FIELD_MAX_FORWARD_VELOCITY:
+                       constants->SetMaximumForwardVelocity(d);
+                       break;
+               case FIELD_MAX_BACKWARD_VELOCITY:
+                       constants->SetMaximumBackwardVelocity(d);
+                       break;
+               case FIELD_MAX_PERPENDICULAR_VELOCITY:
+                       constants->SetMaximumPerpendicularVelocity(d);
+                       break;
+
+               case FIELD_ACCELERATION:
+                       constants->SetAcceleration(d);
+                       break;
+               case FIELD_DECELERATION:
+                       constants->SetDeceleration(d);
+                       break;
+               case FIELD_AIRBORNE_DECELERATION:
+                       constants->SetAirborneDeceleration(d);
+                       break;
+               case FIELD_GRAVITATIONAL_ACCELERATION:
+                       constants->SetGravitationalAcceleration(d);
+                       break;
+               case FIELD_CLIMBING_ACCELERATION:
+                       constants->SetClimbingAcceleration(d);
+                       break;
+               case FIELD_TERMINAL_VELOCITY:
+                       constants->SetTerminalVelocity(d);
+                       break;
+               case FIELD_EXTERNAL_DECELERATION:
+                       constants->SetExternalDeceleration(d);
+                       break;
+
+               case FIELD_STEP_DELTA:
+                       constants->SetStepDelta(d);
+                       break;
+               case FIELD_STEP_AMPLITUDE:
+                       constants->SetStepAmplitude(d);
+                       break;
+
+               case FIELD_RADIUS:
+                       constants->SetRadius(d);
+                       break;
+               case FIELD_HEIGHT:
+                       constants->SetHeight(d);
+                       break;
+
+               case FIELD_ANGULAR_ACCELERATION:
+                       constants->SetAngularAcceleration(d);
+                       break;
+               case FIELD_ANGULAR_DECELERATION:
+                       constants->SetAngularDeceleration(d);
+                       break;
+               case FIELD_MAXIMUM_ANGULAR_VELOCITY:
+                       constants->SetMaximumAngularVelocity(d);
+                       break;
+               case FIELD_ANGULAR_RECENTERING_VELOCITY:
+                       constants->SetAngularRecenteringVelocity(d);
+                       break;
+               case FIELD_HEAD_ANGULAR_VELOCITY:
+                       constants->SetFastAngularVelocity(d);
+                       break;
+               case FIELD_HEAD_ANGULAR_MAXIMUM:
+                       constants->SetFastAngularMaximum(d);
+                       break;
+               case FIELD_MAXIMUM_ELEVATION:
+                       constants->SetMaximumElevation(d);
+                       break;
+               case FIELD_EXTERNAL_ANGULAR_DECELERATION:
+                       constants->SetExternalAngularDeceleration(d);
+                       break;
+
+               case FIELD_DEAD_HEIGHT:
+                       constants->SetDeadHeight(d);
+                       break;
+               case FIELD_CAMERA_HEIGHT:
+                       constants->SetCameraHeight(d);
+                       break;
+               case FIELD_SPLASH_HEIGHT:
+                       constants->SetSplashHeight(d);
+                       break;
+               case FIELD_HALF_CAMERA_SEPARATION:
+                       constants->SetHalfCameraSeparation(d);
+                       break;
+               }
+       }
+       
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);     
+}
+
+void PhysicsView::EditWeaponCheckboxes(wxCommandEvent& e)
+{
+       WeaponDefinition* weapon = static_cast<PhysicsDocument*>(GetDocument())->GetWeaponDefinition(GetSelection());
+
+       int flag = e.GetId() - CB_WEAPON_FLAGS;
+       
+       weapon->SetFlag(flag >= 5 ? flag + 1: flag, e.IsChecked());
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);     
+}
+
+void PhysicsView::EditWeaponFields(wxCommandEvent& e)
+{
+       WeaponDefinition* weapon = static_cast<PhysicsDocument*>(GetDocument())->GetWeaponDefinition(GetSelection());
+
+       long v = 0;
+       if (e.GetString().ToLong(&v)) {
+               switch (e.GetId()) {
+               case FIELD_WEAPON_COLLECTION:
+                       if (v == -1) {
+                               weapon->SetCollection(31);
+                               weapon->SetColorTable(7);
+                               weapon_collection_field->ChangeValue(wxT("31"));
+                               weapon_color_table_field->ChangeValue(wxT("7"));
+                       } else {
+                               weapon->SetCollection(v);
+                       }
+                       break;
+               case FIELD_WEAPON_COLOR_TABLE:
+                       if (v == -1) {
+                               weapon->SetCollection(31);
+                               weapon->SetColorTable(7);
+                               weapon_collection_field->ChangeValue(wxT("31"));
+                               weapon_color_table_field->ChangeValue(wxT("7"));
+                       } else {
+                               weapon->SetColorTable(v);
+                       }
+                       break;
+               case FIELD_WEAPON_IDLE:
+                       weapon->SetIdleShape(v);
+                       break;
+               case FIELD_WEAPON_FIRING:
+                       weapon->SetFiringShape(v);
+                       break;
+               case FIELD_WEAPON_RELOADING:
+                       weapon->SetReloadingShape(v);
+                       break;
+               case FIELD_WEAPON_CHARGING:
+                       weapon->SetChargingShape(v);
+                       break;
+               case FIELD_WEAPON_CHARGED:
+                       weapon->SetChargedShape(v);
+                       break;
+               case FIELD_WEAPON_READY:
+                       weapon->SetReadyTicks(v);
+                       break;
+               case FIELD_WEAPON_AWAIT_RELOAD:
+                       weapon->SetAwaitReloadTicks(v);
+                       break;
+               case FIELD_WEAPON_LOADING:
+                       weapon->SetLoadingTicks(v);
+                       break;
+               case FIELD_WEAPON_FINISH_LOADING:
+                       weapon->SetFinishLoadingTicks(v);
+                       break;
+               case FIELD_WEAPON_FLASH_DECAY:
+                       weapon->SetFiringIntensityDecayTicks(v);
+                       break;
+               }
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);     
+
+}
+
+void PhysicsView::EditWeaponDoubles(wxCommandEvent& e)
+{
+       WeaponDefinition* weapon = static_cast<PhysicsDocument*>(GetDocument())->GetWeaponDefinition(GetSelection());
+
+       double d = 0.0;
+       if (e.GetString().ToDouble(&d)) {
+               switch (e.GetId()) {
+               case FIELD_WEAPON_FLASH_INTENSITY:
+                       weapon->SetFiringLightIntensity(d);
+                       break;
+               case FIELD_WEAPON_IDLE_HEIGHT:
+                       weapon->SetIdleHeight(d);
+                       break;
+               case FIELD_WEAPON_BOB_AMPLITUDE:
+                       weapon->SetBobAmplitude(d);
+                       break;
+               case FIELD_WEAPON_KICK_HEIGHT:
+                       weapon->SetKickHeight(d);
+                       break;
+               case FIELD_WEAPON_RELOAD_HEIGHT:
+                       weapon->SetReloadHeight(d);
+                       break;
+               case FIELD_WEAPON_IDLE_WIDTH:
+                       weapon->SetIdleWidth(d);
+                       break;
+               }
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);     
+}
+
+void PhysicsView::EditWeaponMenus(wxCommandEvent& e)
+{
+       WeaponDefinition* weapon = static_cast<PhysicsDocument*>(GetDocument())->GetWeaponDefinition(GetSelection());
+
+       switch (e.GetId()) {
+       case MENU_WEAPON_ITEM_TYPE:
+               weapon->SetItemType(e.GetSelection() - 1);
+               break;
+       case MENU_WEAPON_CLASS:
+               weapon->SetWeaponClass(e.GetSelection() - 1);
+               break;
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);     
+}
+
+void PhysicsView::EditTriggerFields(wxCommandEvent& e)
+{
+       WeaponDefinition* weapon = static_cast<PhysicsDocument*>(GetDocument())->GetWeaponDefinition(GetSelection());
+
+       long v = 0;
+       if (e.GetString().ToLong(&v)) {
+               int id = e.GetId();
+               TriggerDefinition* trigger = weapon->GetPrimaryTrigger();
+
+               if (id >= FIELD_TRIGGER_ROUNDS + NUM_TRIGGER_IDS) {
+                       id -= NUM_TRIGGER_IDS;
+                       trigger = weapon->GetSecondaryTrigger();
+               }
+
+               switch (id) {
+               case FIELD_TRIGGER_ROUNDS:
+                       trigger->SetRoundsPerMagazine(v);
+                       break;
+               case FIELD_TRIGGER_TICKS:
+                       trigger->SetTicksPerRound(v);
+                       break;
+               case FIELD_TRIGGER_RECOVERY:
+                       trigger->SetRecoveryTicks(v);
+                       break;
+               case FIELD_TRIGGER_CHARGING:
+                       trigger->SetChargingTicks(v);
+                       break;
+               case FIELD_TRIGGER_RECOIL:
+                       trigger->SetRecoilMagnitude(v);
+                       break;
+               case FIELD_TRIGGER_THETA:
+                       trigger->SetThetaError(v);
+                       break;
+               case FIELD_TRIGGER_DX:
+                       trigger->SetDx(v);
+                       break;
+               case FIELD_TRIGGER_DZ:
+                       trigger->SetDz(v);
+                       break;
+               case FIELD_TRIGGER_BURST_COUNT:
+                       trigger->SetBurstCount(v);
+                       break;
+               }
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
+
+void PhysicsView::EditTriggerMenus(wxCommandEvent& e)
+{
+       WeaponDefinition* weapon = static_cast<PhysicsDocument*>(GetDocument())->GetWeaponDefinition(GetSelection());
+
+       int id = e.GetId();
+       TriggerDefinition* trigger = weapon->GetPrimaryTrigger();
+       
+       if (id >= FIELD_TRIGGER_ROUNDS + NUM_TRIGGER_IDS) {
+               id -= NUM_TRIGGER_IDS;
+               trigger = weapon->GetSecondaryTrigger();
+       }
+
+       switch (id) {
+       case MENU_TRIGGER_PROJECTILE:
+               trigger->SetProjectileType(e.GetSelection() - 1);
+               break;
+       case MENU_TRIGGER_AMMO_TYPE:
+               trigger->SetAmmunitionType(e.GetSelection() - 1);
+               break;
+       case MENU_TRIGGER_FIRING:
+               trigger->SetFiringSound(e.GetSelection() - 1);
+               break;
+       case MENU_TRIGGER_CLICK:
+               trigger->SetClickSound(e.GetSelection() - 1);
+               break;
+       case MENU_TRIGGER_CHARGING:
+               trigger->SetChargingSound(e.GetSelection() - 1);
+               break;
+       case MENU_TRIGGER_SHELL_CASING:
+               trigger->SetShellCasingSound(e.GetSelection() - 1);
+               break;
+       case MENU_TRIGGER_RELOADING:
+               trigger->SetReloadingSound(e.GetSelection() - 1);
+               break;
+       case MENU_TRIGGER_CHARGED:
+               trigger->SetChargedSound(e.GetSelection() - 1);
+               break;
+       case MENU_TRIGGER_SHELL_CASING_TYPE:
+               trigger->SetShellCasingType(e.GetSelection() - 1);
+               break;
+       }
+
+       static_cast<PhysicsDocument*>(GetDocument())->Modify(true);
+}
diff --git a/Physics/PhysicsElements.cpp b/Physics/PhysicsElements.cpp
new file mode 100644 (file)
index 0000000..a8bf766
--- /dev/null
@@ -0,0 +1,791 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include <cmath>
+
+#include "PhysicsElements.h"
+
+BigEndianBuffer& PhysicsConstants::LoadObject(BigEndianBuffer& buffer)
+{
+       // everything is a 16.16 fixed, for whatever reason
+       mMaximumForwardVelocity = buffer.ReadFixed();
+       mMaximumBackwardVelocity = buffer.ReadFixed();
+       mMaximumPerpendicularVelocity= buffer.ReadFixed();
+       
+       mAcceleration = buffer.ReadFixed();
+       mDeceleration = buffer.ReadFixed();
+       mAirborneDeceleration = buffer.ReadFixed();
+       
+       mGravitationalAcceleration = buffer.ReadFixed();
+       mClimbingAcceleration = buffer.ReadFixed();
+       mTerminalVelocity = buffer.ReadFixed();
+
+       mExternalDeceleration = buffer.ReadFixed();
+
+       mAngularAcceleration = buffer.ReadFixed();
+       mAngularDeceleration = buffer.ReadFixed();
+       mMaximumAngularVelocity = buffer.ReadFixed();
+       mAngularRecenteringVelocity = buffer.ReadFixed();
+
+       mFastAngularVelocity = buffer.ReadFixed();
+       mFastAngularMaximum = buffer.ReadFixed();
+
+       mMaximumElevation = buffer.ReadFixed();
+       mExternalAngularDeceleration = buffer.ReadFixed();
+
+       mStepDelta = buffer.ReadFixed();
+       mStepAmplitude = buffer.ReadFixed();
+
+       mRadius = buffer.ReadFixed();
+       mHeight = buffer.ReadFixed();
+       mDeadHeight = buffer.ReadFixed();
+       mCameraHeight = buffer.ReadFixed();
+       mSplashHeight = buffer.ReadFixed();
+
+       mHalfCameraSeparation = buffer.ReadFixed();
+
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& PhysicsConstants::SaveObject(BigEndianBuffer& buffer) const
+{
+       buffer.WriteFixed(mMaximumForwardVelocity);
+       buffer.WriteFixed(mMaximumBackwardVelocity);
+       buffer.WriteFixed(mMaximumPerpendicularVelocity);
+
+       buffer.WriteFixed(mAcceleration);
+       buffer.WriteFixed(mDeceleration);
+       buffer.WriteFixed(mAirborneDeceleration);
+       
+       buffer.WriteFixed(mGravitationalAcceleration);
+       buffer.WriteFixed(mClimbingAcceleration);
+       buffer.WriteFixed(mTerminalVelocity);
+
+       buffer.WriteFixed(mExternalDeceleration);
+
+       buffer.WriteFixed(mAngularAcceleration);
+       buffer.WriteFixed(mAngularDeceleration);
+       buffer.WriteFixed(mMaximumAngularVelocity);
+       buffer.WriteFixed(mAngularRecenteringVelocity);
+
+       buffer.WriteFixed(mFastAngularVelocity);
+       buffer.WriteFixed(mFastAngularMaximum);
+
+       buffer.WriteFixed(mMaximumElevation);
+       buffer.WriteFixed(mExternalAngularDeceleration);
+
+       buffer.WriteFixed(mStepDelta);
+       buffer.WriteFixed(mStepAmplitude);
+       
+       buffer.WriteFixed(mRadius);
+       buffer.WriteFixed(mHeight);
+       buffer.WriteFixed(mDeadHeight);
+       buffer.WriteFixed(mCameraHeight);
+       buffer.WriteFixed(mSplashHeight);
+
+       buffer.WriteFixed(mHalfCameraSeparation);
+
+       return buffer;
+}
+
+BigEndianBuffer& AttackDefinition::LoadObject(BigEndianBuffer& buffer)
+{
+       mType = buffer.ReadShort();
+       mRepetitions = buffer.ReadShort();
+       mError = buffer.ReadShort() * 360.0 / 512.0;
+       mRange = buffer.ReadShort();
+       mAttackShape = buffer.ReadShort();
+
+       mDx = buffer.ReadShort();
+       mDy = buffer.ReadShort();
+       mDz = buffer.ReadShort();
+
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& AttackDefinition::SaveObject(BigEndianBuffer& buffer) const
+{
+       buffer.WriteShort(mType);
+       buffer.WriteShort(mRepetitions);
+       buffer.WriteShort(std::floor(mError * 512.0 / 360.0 + 0.5));
+       buffer.WriteShort(mRange);
+       buffer.WriteShort(mAttackShape);
+
+       buffer.WriteShort(mDx);
+       buffer.WriteShort(mDy);
+       buffer.WriteShort(mDz);
+       
+       return buffer;
+}
+
+BigEndianBuffer& DamageDefinition::LoadObject(BigEndianBuffer& buffer)
+{
+       mType = buffer.ReadShort();
+       mFlags = buffer.ReadShort();
+
+       mBase = buffer.ReadShort();
+       mRandom = buffer.ReadShort();
+
+       mScale = buffer.ReadFixed();
+       
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& DamageDefinition::SaveObject(BigEndianBuffer& buffer) const
+{
+       buffer.WriteShort(mType);
+       buffer.WriteShort(mFlags);
+
+       buffer.WriteShort(mBase);
+       buffer.WriteShort(mRandom);
+
+       buffer.WriteFixed(mScale);
+
+       return buffer;
+}
+
+static unsigned short BuildCollection(unsigned short collection, unsigned short colorTable)
+{
+       if (collection == 31 && colorTable == 7) {
+               return 0xffff;
+       } else {
+               return collection | (colorTable << 5);
+       }
+}
+
+BigEndianBuffer& EffectDefinition::LoadObject(BigEndianBuffer& buffer)
+{
+       mCollection = buffer.ReadUShort();
+       mColorTable = (mCollection >> 5) & 0x7;
+       mCollection &= 0x1f;
+       mShape = buffer.ReadShort();
+       mSoundPitch = buffer.ReadFixed();
+       mFlags = buffer.ReadUShort();
+       mDelay = buffer.ReadShort();
+       mDelaySound = buffer.ReadShort();
+
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& EffectDefinition::SaveObject(BigEndianBuffer& buffer) const
+{
+       buffer.WriteUShort(BuildCollection(mCollection, mColorTable));
+       buffer.WriteShort(mShape);
+       buffer.WriteFixed(mSoundPitch);
+       buffer.WriteUShort(mFlags);
+       buffer.WriteShort(mDelay);
+       buffer.WriteShort(mDelaySound);
+
+       return buffer;
+}
+
+BigEndianBuffer& MonsterDefinition::LoadObject(BigEndianBuffer& buffer)
+{
+       mCollection = buffer.ReadUShort();
+       mColorTable = (mCollection >> 5) & 0x7;
+       mCollection &= 0x1f;
+
+       mVitality = buffer.ReadShort();
+       mImmunities = buffer.ReadULong();
+       mWeaknesses = buffer.ReadULong();
+       mFlags = buffer.ReadULong();
+
+       mClass = buffer.ReadLong();
+       mFriends = buffer.ReadLong();
+       mEnemies = buffer.ReadLong();
+
+       mSoundPitch = buffer.ReadFixed();
+
+       mActivationSound = buffer.ReadShort();
+       mFriendlyActivationSound = buffer.ReadShort();
+       mClearSound = buffer.ReadShort();
+       mKillSound = buffer.ReadShort();
+       mApologySound = buffer.ReadShort();
+       mFriendlyFireSound = buffer.ReadShort();
+       mFlamingSound = buffer.ReadShort();
+       mRandomSound = buffer.ReadShort();
+       mRandomSoundMask = buffer.ReadShort();
+
+       mCarryingItemType = buffer.ReadShort();
+       
+       mRadius = buffer.ReadShort();
+       mHeight = buffer.ReadShort();
+       mPreferredHoverHeight = buffer.ReadShort();
+       mMinimumLedgeDelta = buffer.ReadShort();
+       mMaximumLedgeDelta = buffer.ReadShort();
+       mExternalVelocityScale = buffer.ReadFixed();
+       mImpactEffect = buffer.ReadShort();
+       mMeleeImpactEffect = buffer.ReadShort();
+       mContrailEffect = buffer.ReadShort();
+
+       mHalfVisualArc = buffer.ReadShort();
+       mHalfVerticalVisualArc = buffer.ReadShort();
+       mVisualRange = buffer.ReadShort();
+       mDarkVisualRange = buffer.ReadShort();
+       mIntelligence = buffer.ReadShort();
+       mSpeed = buffer.ReadShort();
+       mGravity = buffer.ReadShort();
+       mTerminalVelocity = buffer.ReadShort();
+       mDoorRetryMask = buffer.ReadShort();
+       mShrapnelRadius = buffer.ReadShort();
+       
+       mShrapnelDamage.LoadObject(buffer);
+       if (!mShrapnelDamage.IsGood()) {
+               return buffer;
+       }
+
+       mHitShapes = buffer.ReadShort();
+       mHardDyingShape = buffer.ReadShort();
+       mSoftDyingShape = buffer.ReadShort();
+       mHardDeadShapes = buffer.ReadShort();
+       mSoftDeadShapes = buffer.ReadShort();
+       mStationaryShape = buffer.ReadShort();
+       mMovingShape = buffer.ReadShort();
+       mTeleportInShape = buffer.ReadShort();
+       mTeleportOutShape = buffer.ReadShort();
+
+       mAttackFrequency = buffer.ReadShort();
+       mMeleeAttack.LoadObject(buffer);
+       if (!mMeleeAttack.IsGood()) {
+               return buffer;
+       }
+
+       mRangedAttack.LoadObject(buffer);
+       if (!mRangedAttack.IsGood()) {
+               return buffer;
+       }
+
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& MonsterDefinition::SaveObject(BigEndianBuffer& buffer) const
+{
+       buffer.WriteUShort(BuildCollection(mCollection, mColorTable));
+
+       buffer.WriteShort(mVitality);
+       buffer.WriteULong(mImmunities);
+       buffer.WriteULong(mWeaknesses);
+       buffer.WriteULong(mFlags);
+
+       buffer.WriteLong(mClass);
+       buffer.WriteLong(mFriends);
+       buffer.WriteLong(mEnemies);
+
+       buffer.WriteFixed(mSoundPitch);
+
+       buffer.WriteShort(mActivationSound);
+       buffer.WriteShort(mFriendlyActivationSound);
+       buffer.WriteShort(mClearSound);
+       buffer.WriteShort(mKillSound);
+       buffer.WriteShort(mApologySound);
+       buffer.WriteShort(mFriendlyFireSound);
+       buffer.WriteShort(mFlamingSound);
+       buffer.WriteShort(mRandomSound);
+       buffer.WriteShort(mRandomSoundMask);
+
+       buffer.WriteShort(mCarryingItemType);
+       
+       buffer.WriteShort(mRadius);
+       buffer.WriteShort(mHeight);
+       buffer.WriteShort(mPreferredHoverHeight);
+       buffer.WriteShort(mMinimumLedgeDelta);
+       buffer.WriteShort(mMaximumLedgeDelta);
+       buffer.WriteFixed(mExternalVelocityScale);
+       buffer.WriteShort(mImpactEffect);
+       buffer.WriteShort(mMeleeImpactEffect);
+       buffer.WriteShort(mContrailEffect);
+
+       buffer.WriteShort(mHalfVisualArc);
+       buffer.WriteShort(mHalfVerticalVisualArc);
+       buffer.WriteShort(mVisualRange);
+       buffer.WriteShort(mDarkVisualRange);
+       buffer.WriteShort(mIntelligence);
+       buffer.WriteShort(mSpeed);
+       buffer.WriteShort(mGravity);
+       buffer.WriteShort(mTerminalVelocity);
+       buffer.WriteShort(mDoorRetryMask);
+       buffer.WriteShort(mShrapnelRadius);
+
+       mShrapnelDamage.SaveObject(buffer);
+       
+       buffer.WriteShort(mHitShapes);
+       buffer.WriteShort(mHardDyingShape);
+       buffer.WriteShort(mSoftDyingShape);
+       buffer.WriteShort(mHardDeadShapes);
+       buffer.WriteShort(mSoftDeadShapes);
+       buffer.WriteShort(mStationaryShape);
+       buffer.WriteShort(mMovingShape);
+       buffer.WriteShort(mTeleportInShape);
+       buffer.WriteShort(mTeleportOutShape);
+
+       buffer.WriteShort(mAttackFrequency);
+       mMeleeAttack.SaveObject(buffer);
+       mRangedAttack.SaveObject(buffer);
+
+       return buffer;
+}
+
+BigEndianBuffer& ProjectileDefinition::LoadObject(BigEndianBuffer& buffer)
+{
+       mCollection = buffer.ReadUShort();
+       mColorTable = (mCollection >> 5) & 0x7;
+       mCollection &= 0x1f;
+       mShape = buffer.ReadShort();
+       
+       mDetonationEffect = buffer.ReadShort();
+       mMediaDetonationEffect = buffer.ReadShort();
+       mContrailEffect = buffer.ReadShort();
+       mTicksBetweenContrails = buffer.ReadShort();
+       mMaximumContrails = buffer.ReadShort();
+       mMediaProjectilePromotion = buffer.ReadShort();
+       
+       mRadius = buffer.ReadShort();
+       mAreaOfEffect = buffer.ReadShort();
+       mDamage.LoadObject(buffer);
+       if (!mDamage.IsGood()) {
+               return buffer;
+       }
+
+       mFlags = buffer.ReadULong();
+
+       mSpeed = buffer.ReadShort();
+       mMaximumRange = buffer.ReadShort();
+       
+       mSoundPitch = buffer.ReadFixed();
+       mFlybySound = buffer.ReadShort();
+       mReboundSound = buffer.ReadShort();
+
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& ProjectileDefinition::SaveObject(BigEndianBuffer& buffer) const
+{
+       buffer.WriteUShort(BuildCollection(mCollection, mColorTable));
+       buffer.WriteShort(mShape);
+
+       buffer.WriteShort(mDetonationEffect);
+       buffer.WriteShort(mMediaDetonationEffect);
+       buffer.WriteShort(mContrailEffect);
+       buffer.WriteShort(mTicksBetweenContrails);
+       buffer.WriteShort(mMaximumContrails);
+       buffer.WriteShort(mMediaProjectilePromotion);
+
+       buffer.WriteShort(mRadius);
+       buffer.WriteShort(mAreaOfEffect);
+       mDamage.SaveObject(buffer);
+       
+       buffer.WriteULong(mFlags);
+
+       buffer.WriteShort(mSpeed);
+       buffer.WriteShort(mMaximumRange);
+
+       buffer.WriteFixed(mSoundPitch);
+       buffer.WriteShort(mFlybySound);
+       buffer.WriteShort(mReboundSound);
+
+       return buffer;
+}
+
+BigEndianBuffer& TriggerDefinition::LoadObject(BigEndianBuffer& buffer)
+{
+       mRoundsPerMagazine = buffer.ReadShort();
+       mAmmunitionType = buffer.ReadShort();
+       mTicksPerRound = buffer.ReadShort();
+       mRecoveryTicks = buffer.ReadShort();
+       mChargingTicks = buffer.ReadShort();
+       mRecoilMagnitude = buffer.ReadShort();
+
+       mFiringSound = buffer.ReadShort();
+       mClickSound = buffer.ReadShort();
+       mChargingSound = buffer.ReadShort();
+       mShellCasingSound = buffer.ReadShort();
+       mReloadingSound = buffer.ReadShort();
+       mChargedSound = buffer.ReadShort();
+
+       mProjectileType = buffer.ReadShort();
+       mThetaError = buffer.ReadShort();
+       mDx = buffer.ReadShort();
+       mDz = buffer.ReadShort();
+       mShellCasingType = buffer.ReadShort();
+       mBurstCount = buffer.ReadShort();
+
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& TriggerDefinition::SaveObject(BigEndianBuffer& buffer) const
+{
+       buffer.WriteShort(mRoundsPerMagazine);
+       buffer.WriteShort(mAmmunitionType);
+       buffer.WriteShort(mTicksPerRound);
+       buffer.WriteShort(mRecoveryTicks);
+       buffer.WriteShort(mChargingTicks);
+       buffer.WriteShort(mRecoilMagnitude);
+       
+       buffer.WriteShort(mFiringSound);
+       buffer.WriteShort(mClickSound);
+       buffer.WriteShort(mChargingSound);
+       buffer.WriteShort(mShellCasingSound);
+       buffer.WriteShort(mReloadingSound);
+       buffer.WriteShort(mChargedSound);
+       
+       buffer.WriteShort(mProjectileType);
+       buffer.WriteShort(mThetaError);
+       buffer.WriteShort(mDx);
+       buffer.WriteShort(mDz);
+       buffer.WriteShort(mShellCasingType);
+       buffer.WriteShort(mBurstCount);
+
+       return buffer;
+}
+
+BigEndianBuffer& WeaponDefinition::LoadObject(BigEndianBuffer& buffer)
+{
+       mItemType = buffer.ReadShort();
+       mPowerupType = buffer.ReadShort();
+       mWeaponClass = buffer.ReadShort();
+       mFlags = buffer.ReadShort();
+       
+       mFiringLightIntensity = buffer.ReadFixed();
+       mFiringIntensityDecayTicks = buffer.ReadShort();
+
+       mIdleHeight = buffer.ReadFixed();
+       mBobAmplitude = buffer.ReadFixed();
+       mKickHeight = buffer.ReadFixed();
+       mReloadHeight = buffer.ReadFixed();
+       mIdleWidth = buffer.ReadFixed();
+       mHorizontalAmplitude = buffer.ReadFixed();
+
+       mCollection = buffer.ReadUShort();
+       mColorTable = (mCollection >> 5) & 0x7;
+       mCollection &= 0x1f;
+       
+       mIdleShape = buffer.ReadShort();
+       mFiringShape = buffer.ReadShort();
+       mReloadingShape = buffer.ReadShort();
+       buffer.ReadShort(); // unused
+       mChargingShape = buffer.ReadShort();
+       mChargedShape = buffer.ReadShort();
+
+       mReadyTicks = buffer.ReadShort();
+       mAwaitReloadTicks = buffer.ReadShort();
+       mLoadingTicks = buffer.ReadShort();
+       mFinishLoadingTicks = buffer.ReadShort();
+       mPowerupTicks = buffer.ReadShort();
+
+       mPrimaryTrigger.LoadObject(buffer);
+       if (!mPrimaryTrigger.IsGood()) {
+               return buffer;
+       }
+       
+       mSecondaryTrigger.LoadObject(buffer);
+       if (!mSecondaryTrigger.IsGood()) {
+               return buffer;
+       }
+
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& WeaponDefinition::SaveObject(BigEndianBuffer& buffer) const
+{
+       buffer.WriteShort(mItemType);
+       buffer.WriteShort(mPowerupType);
+       buffer.WriteShort(mWeaponClass);
+       buffer.WriteShort(mFlags);
+       
+       buffer.WriteFixed(mFiringLightIntensity);
+       buffer.WriteShort(mFiringIntensityDecayTicks);
+
+       buffer.WriteFixed(mIdleHeight);
+       buffer.WriteFixed(mBobAmplitude);
+       buffer.WriteFixed(mKickHeight);
+       buffer.WriteFixed(mReloadHeight);
+       buffer.WriteFixed(mIdleWidth);
+       buffer.WriteFixed(mHorizontalAmplitude);
+
+       buffer.WriteUShort(BuildCollection(mCollection, mColorTable));
+
+       buffer.WriteShort(mIdleShape);
+       buffer.WriteShort(mFiringShape);
+       buffer.WriteShort(mReloadingShape);
+       buffer.WriteShort(-1); // unused
+       buffer.WriteShort(mChargingShape);
+       buffer.WriteShort(mChargedShape);
+
+       buffer.WriteShort(mReadyTicks);
+       buffer.WriteShort(mAwaitReloadTicks);
+       buffer.WriteShort(mLoadingTicks);
+       buffer.WriteShort(mFinishLoadingTicks);
+       buffer.WriteShort(mPowerupTicks);
+
+       mPrimaryTrigger.SaveObject(buffer);
+       mSecondaryTrigger.SaveObject(buffer);
+
+       return buffer;
+}
+
+std::ostream& operator<<(std::ostream& s, const PhysicsConstants& constants)
+{
+       s << "Maximum Forward Velocity: " << constants.mMaximumForwardVelocity << std::endl;
+       s << "Maximum Backward Velocity: " << constants.mMaximumBackwardVelocity << std::endl;
+       s << "Maximum Perpendicular Velocity: " << constants.mMaximumPerpendicularVelocity << std::endl;
+       s << "Acceleration: " << constants.mAcceleration << std::endl;
+       s << "Deceleration: " << constants.mDeceleration << std::endl;
+       s << "Airborne Deceleration: " << constants.mAirborneDeceleration << std::endl;
+       s << "Gravitational Acceleration: " << constants.mGravitationalAcceleration << std::endl;
+       s << "Climbing Acceleration: " << constants.mClimbingAcceleration << std::endl;
+       s << "Terminal Velocity: " << constants.mTerminalVelocity << std::endl;
+       s << "External Deceleration: " << constants.mExternalDeceleration << std::endl;
+       s << "Angular Acceleration: " << constants.mAngularAcceleration << std::endl;
+       s << "Angular Deceleration: " << constants.mAngularDeceleration << std::endl;
+       s << "Maximum Angular Velocity: " << constants.mMaximumAngularVelocity << std::endl;
+       s << "Angular Recentering Velocity: " << constants.mAngularRecenteringVelocity << std::endl;
+       s << "Fast Angular Velocity: " << constants.mFastAngularVelocity << std::endl;
+       s << "Fast Angular Maximum: " << constants.mFastAngularMaximum << std::endl;
+       s << "Maximum Elevation: " << constants.mMaximumElevation << std::endl;
+       s << "Eternal Angular Deceleration: " << constants.mExternalAngularDeceleration << std::endl;
+       s << "Step Delta: " << constants.mStepDelta << std::endl;
+       s << "Step Amplitude: " << constants.mStepAmplitude << std::endl;
+       s << "Radius: " << constants.mRadius << std::endl;
+       s << "Height: " << constants.mHeight << std::endl;
+       s << "Dead Height: " << constants.mDeadHeight << std::endl;
+       s << "Camera Height: " << constants.mCameraHeight << std::endl;
+       s << "Splash Height: " << constants.mSplashHeight << std::endl;
+       s << "Half Camera Separation: " << constants.mHalfCameraSeparation << std::endl;
+       return s;
+}
+
+std::ostream& operator<<(std::ostream& s, const AttackDefinition& attack)
+{
+       s << "Type: " << attack.mType << std::endl;
+       s << "Repetitions: " << attack.mRepetitions << std::endl;
+       s << "Error: " << attack.mError << std::endl;
+       s << "Range: " << attack.mRange << std::endl;
+       s << "Attack Shape: " << attack.mAttackShape << std::endl;
+       s << "dx: " << attack.mDx << std::endl;
+       s << "dy: " << attack.mDy << std::endl;
+       s << "dz: " << attack.mDz << std::endl;
+
+       return s;
+}
+
+std::ostream& operator<<(std::ostream& s, const DamageDefinition& damage)
+{
+       s << "Type: " << damage.mType << std::endl;
+       s << "Flags: " << damage.mFlags << std::endl;
+       s << "Base: " << damage.mBase << std::endl;
+       s << "Random: " << damage.mRandom << std::endl;
+       s << "Scale: " << damage.mScale << std::endl;
+
+       return s;
+}
+
+std::ostream& operator<<(std::ostream& s, const EffectDefinition& effect)
+{
+       s << "Collection: " << effect.mCollection << std::endl;
+       s << "Color Table: " << effect.mColorTable << std::endl;
+       s << "Shape: " << effect.mShape << std::endl;
+       s << "Sound Pitch: " << effect.mSoundPitch << std::endl;
+       s << "Flags: " << effect.mFlags << std::endl;
+       s << "Delay: " << effect.mDelay << std::endl;
+       s << "Delay Sound: " << effect.mDelaySound << std::endl;
+
+       return s;
+}
+
+std::ostream& operator<<(std::ostream& s, const MonsterDefinition& monster)
+{
+       s << "mCollection: " << monster.mCollection << std::endl;
+       s << "mColorTable: " << monster.mColorTable << std::endl;
+
+       s << "mVitality: " << monster.mVitality << std::endl;
+       s << "mImmunities: " << monster.mImmunities << std::endl;
+       s << "mWeaknesses: " << monster.mWeaknesses << std::endl;
+       s << "mFlags: " << monster.mFlags << std::endl;
+
+       s << "mClass: " << monster.mClass << std::endl;
+       s << "mFriends: " << monster.mFriends << std::endl;
+       s << "mEnemies: " << monster.mEnemies << std::endl;
+       
+       s << "mSoundPitch: " << monster.mSoundPitch << std::endl;
+       
+       s << "mActivationSound: " << monster.mActivationSound << std::endl;
+       s << "mFriendlyActivationSound: " << monster.mFriendlyActivationSound << std::endl;
+       s << "mClearSound: " << monster.mClearSound << std::endl;
+       s << "mKillSound: " << monster.mKillSound << std::endl;
+       s << "mApologySound: " << monster.mApologySound << std::endl;
+       s << "mFriendlyFireSound: " << monster.mFriendlyFireSound << std::endl;
+       s << "mFlamingSound: " << monster.mFlamingSound << std::endl;
+       s << "mRandomSound: " << monster.mRandomSound << std::endl;
+       s << "mRandomSoundMask: " << monster.mRandomSoundMask << std::endl;
+
+       s << "mCarryingItemType: " << monster.mCarryingItemType << std::endl;
+       
+       s << "mRadius: " << monster.mRadius << std::endl;
+       s << "mHeight: " << monster.mHeight << std::endl;
+       s << "mPreferredHoverHeight: " << monster.mPreferredHoverHeight << std::endl;
+       s << "mMinimumLedgeDelta: " << monster.mMinimumLedgeDelta << std::endl;
+       s << "mMaximumLedgeDelta: " << monster.mMaximumLedgeDelta << std::endl;
+       s << "mExternalVelocityScale: " << monster.mExternalVelocityScale << std::endl;
+       s << "mImpactEffect: " << monster.mImpactEffect << std::endl;
+       s << "mMeleeImpactEffect: " << monster.mMeleeImpactEffect << std::endl;
+       s << "mContrailEffect: " << monster.mContrailEffect << std::endl;
+
+       s << "mHalfVisualArc: " << monster.mHalfVisualArc << std::endl;
+       s << "mHalfVerticalVisualArc: " << monster.mHalfVerticalVisualArc << std::endl;
+       s << "mVisualRange: " << monster.mVisualRange << std::endl;
+       s << "mDarkVisualRange: " << monster.mDarkVisualRange << std::endl;
+       s << "mIntelligence: " << monster.mIntelligence << std::endl;
+       s << "mSpeed: " << monster.mSpeed << std::endl;
+       s << "mGravity: " << monster.mGravity << std::endl;
+       s << "mTerminalVelocity: " << monster.mTerminalVelocity << std::endl;
+       s << "mDoorRetryMask: " << monster.mDoorRetryMask << std::endl;
+       s << "mShrapnelRadius: " << monster.mShrapnelRadius << std::endl;
+       
+       s << "mShrapnelDamage: " << std::endl;
+       s << monster.mShrapnelDamage << std::endl;
+
+       s << "mHitShapes: " << monster.mHitShapes << std::endl;
+       s << "mHardDyingShape: " << monster.mHardDyingShape << std::endl;
+       s << "mSoftDyingShape: " << monster.mSoftDyingShape << std::endl;
+       s << "mHardDeadShapes: " << monster.mHardDeadShapes << std::endl;
+       s << "mSoftDeadShapes: " << monster.mSoftDeadShapes << std::endl;
+       s << "mStationaryShape: " << monster.mStationaryShape << std::endl;
+       s << "mMovingShape: " << monster.mMovingShape << std::endl;
+       s << "mTeleportInShape: " << monster.mTeleportInShape << std::endl;
+       s << "mTeleportOutShape: " << monster.mTeleportOutShape << std::endl;
+
+       s << "mAttackFrequency: " << monster.mAttackFrequency << std::endl;
+       s << "mMeleeAttack: " << std::endl;
+       s << monster.mMeleeAttack << std::endl;
+       s << "mRangedAttack: " << std::endl;
+       s << monster.mRangedAttack << std::endl;
+
+       return s;
+}
+
+std::ostream& operator<<(std::ostream& s, const ProjectileDefinition& projectile)
+{
+       s << "mCollection: " << projectile.mCollection << std::endl;
+       s << "mColorTable: " << projectile.mColorTable << std::endl;
+       s << "mShape: " << projectile.mShape << std::endl;
+       
+       s << "mDetonationEffect: " << projectile.mDetonationEffect << std::endl;
+       s << "mMediaDetonationEffect: " << projectile.mMediaDetonationEffect << std::endl;
+       s << "mContrailEffect: " << projectile.mContrailEffect << std::endl;
+       s << "mTicksBetweenContrails: " << projectile.mTicksBetweenContrails << std::endl;
+       s << "mMaximumContrails: " << projectile.mMaximumContrails << std::endl;
+       s << "mMediaProjectilePromotion: " << projectile.mMediaProjectilePromotion << std::endl;
+
+       s << "mRadius: " << projectile.mRadius << std::endl;
+       s << "mAreaOfEffect: " << projectile.mAreaOfEffect << std::endl;
+       s << "mDamage" << std::endl;
+       s << projectile.mDamage;
+       
+       s << "mFlags: " << projectile.mFlags << std::endl;
+
+       s << "mSpeed: " << projectile.mSpeed << std::endl;
+       s << "mMaximumRange: " << projectile.mMaximumRange << std::endl;
+
+       s << "mSoundPitch: " << projectile.mSoundPitch << std::endl;
+       s << "mFlybySound: " << projectile.mFlybySound << std::endl;
+       s << "mReboundSound: " << projectile.mReboundSound << std::endl;
+
+       return s;
+}
+
+std::ostream& operator<<(std::ostream& s, const TriggerDefinition& trigger)
+{
+       s << "mRoundsPerMagazine: " << trigger.mRoundsPerMagazine << std::endl;
+       s << "mAmmunitionType: " << trigger.mAmmunitionType << std::endl;
+       s << "mTicksPerRound: " << trigger.mTicksPerRound << std::endl;
+       s << "mRecoveryTicks: " << trigger.mRecoveryTicks << std::endl;
+       s << "mChargingTicks: " << trigger.mChargingTicks << std::endl;
+       s << "mRecoilMagnitude: " << trigger.mRecoilMagnitude << std::endl;
+       
+       s << "mFiringSound: " << trigger.mFiringSound << std::endl;
+       s << "mClickSound: " << trigger.mClickSound << std::endl;
+       s << "mChargingSound: " << trigger.mChargingSound << std::endl;
+       s << "mShellCasingSound: " << trigger.mShellCasingSound << std::endl;
+       s << "mReloadingSound: " << trigger.mReloadingSound << std::endl;
+       s << "mChargedSound: " << trigger.mChargedSound << std::endl;
+       
+       s << "mProjectileType: " << trigger.mProjectileType << std::endl;
+       s << "mThetaError: " << trigger.mThetaError << std::endl;
+       s << "mDx: " << trigger.mDx << std::endl;
+       s << "mDz: " << trigger.mDz << std::endl;
+       s << "mShellCasingType: " << trigger.mShellCasingType << std::endl;
+       s << "mBurstCount: " << trigger.mBurstCount << std::endl;
+
+       return s;
+}
+
+std::ostream& operator<<(std::ostream& s, const WeaponDefinition& weapon)
+{
+       s << "mItemType: " << weapon.mItemType << std::endl;
+       s << "mPowerupType: " << weapon.mPowerupType << std::endl;
+       s << "mWeaponClass: " << weapon.mWeaponClass << std::endl;
+       s << "mFlags: " << weapon.mFlags << std::endl;
+       
+       s << "mFiringLightIntensity: " << weapon.mFiringLightIntensity << std::endl;
+       s << "mFiringIntensityDecayTicks: " << weapon.mFiringIntensityDecayTicks << std::endl;
+
+       s << "mIdleHeight: " << weapon.mIdleHeight << std::endl;
+       s << "mBobAmplitude: " << weapon.mBobAmplitude << std::endl;
+       s << "mKickHeight: " << weapon.mKickHeight << std::endl;
+       s << "mReloadHeight: " << weapon.mReloadHeight << std::endl;
+       s << "mIdleWidth: " << weapon.mIdleWidth << std::endl;
+       s << "mHorizontalAmplitude: " << weapon.mHorizontalAmplitude << std::endl;
+
+       s << "mCollection: " << weapon.mCollection << std::endl;
+       s << "mColorTable: " << weapon.mColorTable << std::endl;
+       
+       s << "mIdleShape: " << weapon.mIdleShape << std::endl;
+       s << "mFiringShape: " << weapon.mFiringShape << std::endl;
+       s << "mReloadingShape: " << weapon.mReloadingShape << std::endl;
+       s << "mChargingShape: " << weapon.mChargingShape << std::endl;
+       s << "mChargedShape: " << weapon.mChargedShape << std::endl;
+
+       s << "mReadyTicks: " << weapon.mReadyTicks << std::endl;
+       s << "mAwaitReloadTicks: " << weapon.mAwaitReloadTicks << std::endl;
+       s << "mLoadingTicks: " << weapon.mLoadingTicks << std::endl;
+       s << "mFinishLoadingTicks: " << weapon.mFinishLoadingTicks << std::endl;
+       s << "mPowerupTicks: " << weapon.mPowerupTicks << std::endl;
+
+       s << "mPrimaryTrigger: " << weapon.mPrimaryTrigger << std::endl;
+       s << "mSecondaryTrigger: " << weapon.mSecondaryTrigger << std::endl;
+
+       return s;
+}
diff --git a/Physics/PhysicsElements.h b/Physics/PhysicsElements.h
new file mode 100644 (file)
index 0000000..fafe89e
--- /dev/null
@@ -0,0 +1,816 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef PHYSICSELEMENTS_H
+#define PHYSICSELEMENTS_H
+
+#include "../BigEndianBuffer.h"
+#include <iostream>
+
+class PhysicsElement
+{
+private:
+       bool mVerboseLoading;
+
+protected:
+       // So that subclasses can change their status
+       bool mGoodData;
+
+public:
+       PhysicsElement(bool verbose) : mVerboseLoading(verbose), mGoodData(false) {}
+       ~PhysicsElement() { }
+
+       bool IsGood() const { return mGoodData; }
+       bool IsVerbose() const { return mVerboseLoading; }
+};
+
+class PhysicsConstants : public PhysicsElement
+{
+       friend std::ostream& operator<<(std::ostream&, const PhysicsConstants&);
+private:
+       double mMaximumForwardVelocity;
+       double mMaximumBackwardVelocity;
+       double mMaximumPerpendicularVelocity;
+
+       double mAcceleration;
+       double mDeceleration;
+       double mAirborneDeceleration;
+       
+       double mGravitationalAcceleration;
+       double mClimbingAcceleration;
+       double mTerminalVelocity;
+
+       double mExternalDeceleration;
+
+       double mAngularAcceleration;
+       double mAngularDeceleration;
+       double mMaximumAngularVelocity;
+       double mAngularRecenteringVelocity;
+
+       double mFastAngularVelocity;
+       double mFastAngularMaximum;
+
+       double mMaximumElevation;
+       double mExternalAngularDeceleration;
+
+       double mStepDelta;
+       double mStepAmplitude;
+       
+       double mRadius;
+       double mHeight;
+       double mDeadHeight;
+       double mCameraHeight;
+       double mSplashHeight;
+
+       double mHalfCameraSeparation;
+public:
+       // accessors
+       double GetMaximumForwardVelocity() const { return mMaximumForwardVelocity; }
+       double GetMaximumBackwardVelocity() const { return mMaximumBackwardVelocity; }
+       double GetMaximumPerpendicularVelocity() const { return mMaximumPerpendicularVelocity; }
+
+       double GetAcceleration() const { return mAcceleration; }
+       double GetDeceleration() const { return mDeceleration; }
+       double GetAirborneDeceleration() const { return mAirborneDeceleration; }
+
+       double GetGravitationalAcceleration() const { return mGravitationalAcceleration; }
+       double GetClimbingAcceleration() const { return mClimbingAcceleration; }
+       double GetTerminalVelocity() const { return mTerminalVelocity; }
+
+       double GetExternalDeceleration() const { return mExternalDeceleration; }
+
+       double GetAngularAcceleration() const { return mAngularAcceleration; }
+       double GetAngularDeceleration() const { return mAngularDeceleration; }
+       double GetMaximumAngularVelocity() const { return mMaximumAngularVelocity; }
+       double GetAngularRecenteringVelocity() const { return mAngularRecenteringVelocity; }
+
+
+       double GetFastAngularVelocity() const { return mFastAngularVelocity; }
+       double GetFastAngularMaximum() const { return mFastAngularMaximum; }
+
+       double GetMaximumElevation() const { return mMaximumElevation; }
+       double GetExternalAngularDeceleration() const { return mExternalAngularDeceleration; }
+
+       double GetStepDelta() const { return mStepDelta; }
+       double GetStepAmplitude() const { return mStepAmplitude; }
+       
+       double GetRadius() const { return mRadius; }
+       double GetHeight() const { return mHeight; }
+       double GetDeadHeight() const { return mDeadHeight; }
+       double GetCameraHeight() const { return mCameraHeight; }
+       double GetSplashHeight() const { return mSplashHeight; }
+
+       double GetHalfCameraSeparation() const { return mHalfCameraSeparation; }
+
+       // mutators
+       void SetMaximumForwardVelocity(double v) { mMaximumForwardVelocity = v; }
+       void SetMaximumBackwardVelocity(double v) { mMaximumBackwardVelocity = v; }
+       void SetMaximumPerpendicularVelocity(double v) { mMaximumPerpendicularVelocity = v; }
+
+       void SetAcceleration(double v) { mAcceleration = v; }
+       void SetDeceleration(double v) { mDeceleration = v; }
+       void SetAirborneDeceleration(double v) { mAirborneDeceleration = v; }
+       
+       void SetGravitationalAcceleration(double v) { mGravitationalAcceleration = v; }
+       void SetClimbingAcceleration(double v) { mClimbingAcceleration = v; }
+       void SetTerminalVelocity(double v) { mTerminalVelocity = v; }
+
+       void SetExternalDeceleration(double v) { mExternalDeceleration = v; }
+
+       void SetAngularAcceleration(double v) { mAngularAcceleration = v; }
+       void SetAngularDeceleration(double v) { mAngularDeceleration = v; }
+       void SetMaximumAngularVelocity(double v) { mMaximumAngularVelocity = v; }
+       void SetAngularRecenteringVelocity(double v) { mAngularRecenteringVelocity = v; }
+
+       void SetFastAngularVelocity(double v) { mFastAngularVelocity = v; }
+       void SetFastAngularMaximum(double v) { mFastAngularMaximum = v; }
+
+       void SetMaximumElevation(double v) { mMaximumElevation = v; }
+       void SetExternalAngularDeceleration(double v) { mExternalAngularDeceleration = v; }
+
+       void SetStepDelta(double v) { mStepDelta = v; }
+       void SetStepAmplitude(double v) { mStepAmplitude = v; }
+       
+       void SetRadius(double v) { mRadius = v; }
+       void SetHeight(double v) { mHeight = v; }
+       void SetDeadHeight(double v) { mDeadHeight = v; }
+       void SetCameraHeight(double v) { mCameraHeight = v; }
+       void SetSplashHeight(double v) { mSplashHeight = v; }
+
+       void SetHalfCameraSeparation(double v) { mHalfCameraSeparation = v; }
+
+
+       PhysicsConstants(bool verbose = false) : PhysicsElement(verbose) { }
+       ~PhysicsConstants() { }
+
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer) const;
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+
+       static const int kSize = 104;
+};
+
+class AttackDefinition : public PhysicsElement
+{
+       friend std::ostream& operator<<(std::ostream&, const AttackDefinition&);
+private:
+       short mType;
+       short mRepetitions;
+       double mError;
+       short mRange;
+       short mAttackShape;
+       short mDx, mDy, mDz;
+
+public:
+       // accessors
+       short GetType() { return mType; }
+       short GetRepetitions() { return mRepetitions; }
+       double GetError() { return mError; }
+       short GetRange() { return mRange; }
+       short GetShape() { return mAttackShape; }
+       short GetDx() { return mDx; }
+       short GetDy() { return mDy; }
+       short GetDz() { return mDz; }
+
+       // mutators
+       void SetType(short v) { mType = v; }
+       void SetRepetitions(short v) { mRepetitions = v; }
+       void SetError(double d) { mError = d; }
+       void SetRange(short v) { mRange = v; }
+       void SetShape(short v) { mAttackShape = v; }
+       void SetDx(short v) { mDx = v; }
+       void SetDy(short v) { mDy = v; }
+       void SetDz(short v) { mDz = v; }
+       
+       AttackDefinition(bool verbose = false) : PhysicsElement(verbose) { }
+       ~AttackDefinition() { }
+
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer) const;
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+};
+
+class DamageDefinition : public PhysicsElement
+{
+       friend std::ostream& operator<<(std::ostream&, const DamageDefinition&);
+private:
+       short mType;
+       short mFlags;
+       short mBase;
+       short mRandom;
+       double mScale;
+
+       enum {
+               kAlienDamage = 0x01
+       };
+
+public:
+       // accessors
+       short GetType() { return mType; }
+       short GetBase() { return mBase; }
+       bool GetAlien() { return mFlags & kAlienDamage; }
+       short GetRandom() { return mRandom; }
+       double GetScale() { return mScale; }
+
+       // mutators
+       void SetType(short v) { mType = v; }
+       void SetAlien(bool b) { 
+               if (b) mFlags |= kAlienDamage;
+               else mFlags &= ~kAlienDamage; 
+       }
+
+       void SetBase(short v) { mBase = v; }
+       void SetRandom(short v) { mRandom = v; }
+       void SetScale(double d) { mScale = d; }
+
+       DamageDefinition(bool verbose = false) : PhysicsElement(verbose) { }
+       ~DamageDefinition() { }
+
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer) const;
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+};
+
+class EffectDefinition : public PhysicsElement
+{
+       friend std::ostream& operator<<(std::ostream&, const EffectDefinition&);
+private:
+       unsigned short mCollection;
+       unsigned short mColorTable;
+       short mShape;
+       double mSoundPitch;
+       unsigned short mFlags;
+       short mDelay;
+       short mDelaySound;
+
+       enum {
+               kEndWhenAnimationLoops = 0x0001,
+               kEndWhenTransferAnimationLoops = 0x0002,
+               kSoundOnly = 0x0004,
+               kMakeTwinVisible = 0x0008,
+               kMediaEffect = 0x0010
+       };
+
+public:
+       // accessors
+       unsigned short GetCollection() { return mCollection; }
+       unsigned short GetColorTable() { return mColorTable; }
+       short GetShape() { return mShape; }
+       double GetSoundPitch() { return mSoundPitch; }
+       short GetDelay() { return mDelay; }
+       short GetDelaySound() { return mDelaySound; }
+
+       bool GetEndWhenAnimationLoops() { return mFlags & kEndWhenAnimationLoops; }
+       bool GetEndWhenTransferAnimationLoops() { return mFlags & kEndWhenTransferAnimationLoops; }
+       bool GetSoundOnly() { return mFlags & kSoundOnly; }
+       bool GetMediaEffect() { return mFlags & kMediaEffect; }
+
+       // mutators
+       void SetCollection(unsigned short v) { mCollection = v; }
+       void SetColorTable(unsigned short v) { mColorTable = v; }
+       void SetShape(short v) { mShape = v; }
+       void SetSoundPitch(double v) { mSoundPitch = v; }
+       void SetDelay(short v) { mDelay = v; }
+       void SetDelaySound(short v) { mDelaySound = v; }
+
+       void SetEndWhenAnimationLoops(bool v) { 
+               if (v) mFlags |= kEndWhenAnimationLoops;
+               else mFlags &= ~kEndWhenAnimationLoops;
+       }
+
+       void SetEndWhenTransferAnimationLoops(bool v) { 
+               if (v) mFlags |= kEndWhenTransferAnimationLoops;
+               else mFlags &= ~kEndWhenTransferAnimationLoops;
+       }
+       
+       void SetSoundOnly(bool v) { 
+               if (v) mFlags |= kSoundOnly;
+               else mFlags &= ~kSoundOnly;
+       }
+
+       void SetMediaEffect(bool v) { 
+               if (v) mFlags |= kMediaEffect;
+               else mFlags &= ~kMediaEffect;
+       }
+
+       EffectDefinition(bool verbose = false) : PhysicsElement(verbose) { }
+       ~EffectDefinition() { }
+
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer) const;
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+
+       static const int kSize = 14;
+};     
+
+class MonsterDefinition : public PhysicsElement
+{
+       friend std::ostream& operator<<(std::ostream&, const MonsterDefinition&);
+private:
+       unsigned short mCollection;
+       unsigned short mColorTable;
+
+       short mVitality;
+       unsigned long mImmunities;
+       unsigned long mWeaknesses;
+       unsigned long mFlags;
+
+       long mClass;
+       long mFriends;
+       long mEnemies;
+       
+       double mSoundPitch;
+       
+       short mActivationSound;
+       short mFriendlyActivationSound;
+       short mClearSound;
+       short mKillSound;
+       short mApologySound;
+       short mFriendlyFireSound;
+       short mFlamingSound;
+       short mRandomSound;
+       short mRandomSoundMask;
+
+       short mCarryingItemType;
+       
+       short mRadius;
+       short mHeight;
+       short mPreferredHoverHeight;
+       short mMinimumLedgeDelta;
+       short mMaximumLedgeDelta;
+       double mExternalVelocityScale;
+       short mImpactEffect;
+       short mMeleeImpactEffect;
+       short mContrailEffect;
+
+       short mHalfVisualArc;
+       short mHalfVerticalVisualArc;
+       short mVisualRange;
+       short mDarkVisualRange;
+       short mIntelligence;
+       short mSpeed;
+       short mGravity;
+       short mTerminalVelocity;
+       short mDoorRetryMask;
+       short mShrapnelRadius;
+       
+       DamageDefinition mShrapnelDamage;
+
+       // sequence IDs
+       short mHitShapes;
+       short mHardDyingShape;
+       short mSoftDyingShape;
+       short mHardDeadShapes;
+       short mSoftDeadShapes;
+       short mStationaryShape;
+       short mMovingShape;
+       short mTeleportInShape;
+       short mTeleportOutShape;
+
+       short mAttackFrequency;
+       AttackDefinition mMeleeAttack;
+       AttackDefinition mRangedAttack;
+
+public:
+       // accessors
+       unsigned short GetCollection() { return mCollection; }
+       unsigned short GetColorTable() { return mColorTable; }
+
+       short GetVitality() { return mVitality; }
+       bool GetImmunity(int index) { return mImmunities & (1 << index); }
+       bool GetWeakness(int index) { return mWeaknesses & (1 << index); }
+       bool GetFlag(int index) { return mFlags & (1 << index); }
+
+       long GetClass() { return mClass; }
+       bool GetFriend(int index) { return mFriends & (1 << index); }
+       bool GetEnemy(int index) { return mEnemies & (1 << index); }
+
+       double GetSoundPitch() { return  mSoundPitch; }
+
+       short GetActivationSound() { return  mActivationSound; }
+       short GetFriendlyActivationSound() { return  mFriendlyActivationSound; }
+       short GetClearSound() { return  mClearSound; }
+       short GetKillSound() { return  mKillSound; }
+       short GetApologySound() { return  mApologySound; }
+       short GetFriendlyFireSound() { return  mFriendlyFireSound; }
+       short GetFlamingSound() { return  mFlamingSound; }
+       short GetRandomSound() { return  mRandomSound; }
+       short GetRandomSoundMask() { return  mRandomSoundMask; }
+
+       short GetCarryingItemType() { return mCarryingItemType; }
+
+       short GetRadius() { return mRadius; }
+       short GetHeight() { return mHeight; }
+       short GetPreferredHoverHeight() { return mPreferredHoverHeight; }
+       short GetMinimumLedgeDelta() { return mMinimumLedgeDelta; }
+       short GetMaximumLedgeDelta() { return mMaximumLedgeDelta; }
+       double GetExternalVelocityScale() { return mExternalVelocityScale; }
+       short GetImpactEffect() { return mImpactEffect; }
+       short GetMeleeImpactEffect() { return mMeleeImpactEffect; }
+       short GetContrailEffect() { return mContrailEffect; }
+
+       short GetVisualRange() { return mVisualRange; }
+       short GetDarkVisualRange() { return mDarkVisualRange; }
+       short GetIntelligence() { return mIntelligence; }
+       short GetSpeed() { return mSpeed; }
+       short GetGravity() { return mGravity; }
+       short GetTerminalVelocity() { return mTerminalVelocity; }
+       short GetDoorRetryMask() { return mDoorRetryMask; }
+       short GetShrapnelRadius() { return mShrapnelRadius; }
+
+       DamageDefinition* GetShrapnelDamage() { return &mShrapnelDamage; }
+
+       short GetHitShapes() { return  mHitShapes; }
+       short GetHardDyingShape() { return  mHardDyingShape; }
+       short GetSoftDyingShape() { return  mSoftDyingShape; }
+       short GetHardDeadShapes() { return  mHardDeadShapes; }
+       short GetSoftDeadShapes() { return  mSoftDeadShapes; }
+       short GetStationaryShape() { return  mStationaryShape; }
+       short GetMovingShape() { return  mMovingShape; }
+       short GetTeleportInShape() { return  mTeleportInShape; }
+       short GetTeleportOutShape() { return  mTeleportOutShape; }
+
+       short GetAttackFrequency() { return mAttackFrequency; }
+       AttackDefinition* GetMeleeAttack() { return &mMeleeAttack; }
+       AttackDefinition* GetRangedAttack() { return &mRangedAttack; }
+
+       // mutators
+       void SetCollection(unsigned short v) { mCollection = v; }
+       void SetColorTable(unsigned short v) { mColorTable = v; }
+
+       void SetVitality(short v) { mVitality = v; }
+       void SetImmunity(int index, bool b) { 
+               if (b) mImmunities |= (1 << index);
+               else mImmunities &= ~(1 << index);
+       }
+
+       void SetWeakness(int index, bool b) { 
+               if (b) mWeaknesses |= (1 << index);
+               else mWeaknesses &= ~(1 << index);
+       }
+
+       void SetFlag(int index, bool b) { 
+               if (b) mFlags |= (1 << index);
+               else mFlags &= ~(1 << index);
+       }
+
+       void SetClass(long v) { mClass = v; }
+
+       void SetFriend(int index, bool b) { 
+               if (b) mFriends |= (1 << index);
+               else mFriends &= ~(1 << index);
+       }
+
+       void SetEnemy(int index, bool b) { 
+               if (b) mEnemies |= (1 << index);
+               else mEnemies &= ~(1 << index);
+       }
+
+       void SetSoundPitch(double d) { mSoundPitch = d; }
+
+       void SetRadius(short v) { mRadius = v; }
+       void SetHeight(short v) { mHeight = v; }
+       void SetPreferredHoverHeight(short v) { mPreferredHoverHeight = v; }
+       void SetMinimumLedgeDelta(short v) { mMinimumLedgeDelta = v; }
+       void SetMaximumLedgeDelta(short v) { mMaximumLedgeDelta = v; }
+       void SetExternalVelocityScale(double d) { mExternalVelocityScale = d; }
+       void SetImpactEffect(short v) { mImpactEffect = v; }
+       void SetMeleeImpactEffect(short v) { mMeleeImpactEffect = v; }
+       void SetContrailEffect(short v) { mContrailEffect = v; }
+
+       void SetVisualRange(short v) { mVisualRange = v; }
+       void SetDarkVisualRange(short v) { mDarkVisualRange = v; }
+       void SetIntelligence(short v) { mIntelligence = v; }
+       void SetSpeed(short v) { mSpeed = v; }
+       void SetGravity(short v) { mGravity = v; }
+       void SetTerminalVelocity(short v) { mTerminalVelocity = v; }
+       void SetDoorRetryMask(short v) { mDoorRetryMask = v; }
+       void SetShrapnelRadius(short v) { mShrapnelRadius = v; }
+
+
+       void SetActivationSound(short v) { mActivationSound = v; }
+       void SetFriendlyActivationSound(short v) { mFriendlyActivationSound = v; }
+       void SetClearSound(short v) { mClearSound = v; }
+       void SetKillSound(short v) { mKillSound = v; }
+       void SetApologySound(short v) { mApologySound = v; }
+       void SetFriendlyFireSound(short v) { mFriendlyFireSound = v; }
+       void SetFlamingSound(short v) { mFlamingSound = v; }
+       void SetRandomSound(short v) { mRandomSound = v; }
+       void SetRandomSoundMask(short v) { mRandomSoundMask = v; }
+
+       void SetCarryingItemType(short v) { mCarryingItemType = v; }
+
+       void SetHitShapes(short v) { mHitShapes = v; }
+       void SetHardDyingShape(short v) { mHardDyingShape = v; }
+       void SetSoftDyingShape(short v) { mSoftDyingShape = v; }
+       void SetHardDeadShapes(short v) { mHardDeadShapes = v; }
+       void SetSoftDeadShapes(short v) { mSoftDeadShapes = v; }
+       void SetStationaryShape(short v) { mStationaryShape = v; }
+       void SetMovingShape(short v) { mMovingShape = v; }
+       void SetTeleportInShape(short v) { mTeleportInShape = v; }
+       void SetTeleportOutShape(short v) { mTeleportOutShape = v; }
+
+       void SetAttackFrequency(short v) { mAttackFrequency = v; }
+
+       MonsterDefinition(bool verbose = false) : PhysicsElement(verbose) { }
+       ~MonsterDefinition() { }
+
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer) const;
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+
+       static const int kSize = 156;
+};
+
+class ProjectileDefinition : public PhysicsElement
+{
+       friend std::ostream& operator<<(std::ostream&, const ProjectileDefinition&);
+private:
+       unsigned short mCollection;
+       unsigned short mColorTable;
+       short mShape;
+       
+       short mDetonationEffect;
+       short mMediaDetonationEffect;
+       short mContrailEffect;
+       short mTicksBetweenContrails;
+       short mMaximumContrails;
+       short mMediaProjectilePromotion;
+
+       short mRadius;
+       short mAreaOfEffect;
+       DamageDefinition mDamage;
+       
+       unsigned long mFlags;
+
+       short mSpeed;
+       short mMaximumRange;
+
+       double mSoundPitch;
+       short mFlybySound;
+       short mReboundSound;
+
+public:
+       // accessors
+       unsigned short GetCollection() { return mCollection; }
+       unsigned short GetColorTable() { return mColorTable; }
+       short GetShape() { return mShape; }
+
+       short GetDetonationEffect() { return mDetonationEffect; }
+       short GetMediaDetonationEffect() { return mMediaDetonationEffect; }
+       short GetContrailEffect() { return mContrailEffect; }
+       short GetTicksBetweenContrails() { return mTicksBetweenContrails; }
+       short GetMaximumContrails() { return mMaximumContrails; }
+       short GetMediaProjectilePromotion() { return mMediaProjectilePromotion; }
+
+       short GetRadius() { return mRadius; }
+       short GetAreaOfEffect() { return mAreaOfEffect; }
+
+       DamageDefinition* GetDamage() { return &mDamage; }
+
+       bool GetFlag(int flag_index) { return mFlags & (1 << flag_index); }
+
+       short GetSpeed() { return mSpeed; }
+       short GetMaximumRange() { return mMaximumRange; }
+
+       double GetSoundPitch() { return mSoundPitch; }
+       short GetFlybySound() { return mFlybySound; }
+       short GetReboundSound() { return mReboundSound; }
+
+       // mutators
+       void SetCollection(unsigned short v) { mCollection = v; }
+       void SetColorTable(unsigned short v) { mColorTable = v; }
+       void SetShape(short v) { mShape = v; }
+       
+       void SetDetonationEffect(short v) { mDetonationEffect = v; }
+       void SetMediaDetonationEffect(short v) { mMediaDetonationEffect = v; }
+       void SetContrailEffect(short v) { mContrailEffect = v; }
+       void SetTicksBetweenContrails(short v) { mTicksBetweenContrails = v; }
+       void SetMaximumContrails(short v) { mMaximumContrails = v; }
+       void SetMediaProjectilePromotion(short v) { mMediaProjectilePromotion = v; }
+
+       void SetRadius(short v) { mRadius = v; }
+       void SetAreaOfEffect(short v) { mAreaOfEffect = v; }
+
+       void SetFlag(int flag_index, bool f) {
+               if (f) mFlags |= (1 << flag_index);
+               else mFlags &= ~(1 << flag_index);
+       }
+
+       void SetSpeed(short v) { mSpeed = v; }
+       void SetMaximumRange(short v) { mMaximumRange = v; }
+
+       void SetSoundPitch(double v) { mSoundPitch = v; }
+       void SetFlybySound(short v) { mFlybySound = v; }
+       void SetReboundSound(short v) { mReboundSound = v; }
+
+       ProjectileDefinition(bool verbose = false) : PhysicsElement(verbose) { }
+       ~ProjectileDefinition() { }
+       
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer) const;
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+       
+       static const int kSize = 48;
+};
+
+class TriggerDefinition : public PhysicsElement
+{
+       friend std::ostream& operator<<(std::ostream&, const TriggerDefinition&);
+private:
+       short mRoundsPerMagazine;
+       short mAmmunitionType;
+       short mTicksPerRound;
+       short mRecoveryTicks;
+       short mChargingTicks;
+       short mRecoilMagnitude;
+       
+       short mFiringSound;
+       short mClickSound;
+       short mChargingSound;
+       short mShellCasingSound;
+       short mReloadingSound;
+       short mChargedSound;
+       
+       short mProjectileType;
+       short mThetaError;
+       short mDx;
+       short mDz;
+       short mShellCasingType;
+       short mBurstCount;
+public:
+       // accessors
+       short GetRoundsPerMagazine() { return mRoundsPerMagazine; }
+       short GetAmmunitionType() { return mAmmunitionType; }
+       short GetTicksPerRound() { return mTicksPerRound; }
+       short GetRecoveryTicks() { return mRecoveryTicks; }
+       short GetChargingTicks() { return mChargingTicks; }
+       short GetRecoilMagnitude() { return mRecoilMagnitude; }
+       
+       short GetFiringSound() { return mFiringSound; }
+       short GetClickSound() { return mClickSound; }
+       short GetChargingSound() { return mChargingSound; }
+       short GetShellCasingSound() { return mShellCasingSound; }
+       short GetReloadingSound() { return mReloadingSound; }
+       short GetChargedSound() { return mChargedSound; }
+       
+       short GetProjectileType() { return mProjectileType; }
+       short GetThetaError() { return mThetaError; }
+       short GetDx() { return mDx; }
+       short GetDz() { return mDz; }
+       short GetShellCasingType() { return mShellCasingType; }
+       short GetBurstCount() { return mBurstCount; }
+
+       // mutators
+       void SetRoundsPerMagazine(short v) { mRoundsPerMagazine = v; }
+       void SetAmmunitionType(short v) { mAmmunitionType = v; }
+       void SetTicksPerRound(short v) { mTicksPerRound = v; }
+       void SetRecoveryTicks(short v) { mRecoveryTicks = v; }
+       void SetChargingTicks(short v) { mChargingTicks = v; }
+       void SetRecoilMagnitude(short v) { mRecoilMagnitude = v; }
+       
+       void SetFiringSound(short v) { mFiringSound = v; }
+       void SetClickSound(short v) { mClickSound = v; }
+       void SetChargingSound(short v) { mChargingSound = v; }
+       void SetShellCasingSound(short v) { mShellCasingSound = v; }
+       void SetReloadingSound(short v) { mReloadingSound = v; }
+       void SetChargedSound(short v) { mChargedSound = v; }
+       
+       void SetProjectileType(short v) { mProjectileType = v; }
+       void SetThetaError(short v) { mThetaError = v; }
+       void SetDx(short v) { mDx = v; }
+       void SetDz(short v) { mDz = v; }
+       void SetShellCasingType(short v) { mShellCasingType = v; }
+       void SetBurstCount(short v) { mBurstCount = v; }
+
+       TriggerDefinition(bool verbose = false) : PhysicsElement(verbose) { }
+       ~TriggerDefinition() { }
+
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer) const;
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+};
+
+class WeaponDefinition : public PhysicsElement
+{
+       friend std::ostream& operator<<(std::ostream&, const WeaponDefinition&);
+private:
+       short mItemType;
+       short mPowerupType;
+       short mWeaponClass;
+       short mFlags;
+       
+       double mFiringLightIntensity;
+       short mFiringIntensityDecayTicks;
+
+       double mIdleHeight;
+       double mBobAmplitude;
+       double mKickHeight;
+       double mReloadHeight;
+       double mIdleWidth;
+       double mHorizontalAmplitude;
+
+       unsigned short mCollection;
+       unsigned short mColorTable;
+       
+       short mIdleShape;
+       short mFiringShape;
+       short mReloadingShape;
+       // short unused
+       short mChargingShape;
+       short mChargedShape;
+
+       short mReadyTicks;
+       short mAwaitReloadTicks;
+       short mLoadingTicks;
+       short mFinishLoadingTicks;
+       short mPowerupTicks;
+
+       TriggerDefinition mPrimaryTrigger;
+       TriggerDefinition mSecondaryTrigger;
+public:
+       // accessors
+       short GetItemType() { return mItemType; }
+       short GetPowerupType() { return mPowerupType; }
+       short GetWeaponClass() { return mWeaponClass; }
+       bool GetFlag(int index) { return mFlags & (1 << index); }
+       
+       double GetFiringLightIntensity() { return mFiringLightIntensity; }
+       short GetFiringIntensityDecayTicks() { return mFiringIntensityDecayTicks; }
+
+       double GetIdleHeight() { return mIdleHeight; }
+       double GetBobAmplitude() { return mBobAmplitude; }
+       double GetKickHeight() { return mKickHeight; }
+       double GetReloadHeight() { return mReloadHeight; }
+       double GetIdleWidth() { return mIdleWidth; }
+       double GetHorizontalAmplitude() { return mHorizontalAmplitude; }
+
+       unsigned short GetCollection() { return mCollection; }
+       unsigned short GetColorTable() { return mColorTable; }
+       
+       short GetIdleShape() { return mIdleShape; }
+       short GetFiringShape() { return mFiringShape; }
+       short GetReloadingShape() { return mReloadingShape; }
+       short GetChargingShape() { return mChargingShape; }
+       short GetChargedShape() { return mChargedShape; }
+
+       short GetReadyTicks() { return mReadyTicks; }
+       short GetAwaitReloadTicks() { return mAwaitReloadTicks; }
+       short GetLoadingTicks() { return mLoadingTicks; }
+       short GetFinishLoadingTicks() { return mFinishLoadingTicks; }
+
+       TriggerDefinition* GetPrimaryTrigger() { return &mPrimaryTrigger; }
+       TriggerDefinition* GetSecondaryTrigger() { return &mSecondaryTrigger; }
+
+       // mutators
+       void SetItemType(short v) { mItemType = v; }
+       void SetPowerupType(short v) { mPowerupType = v; }
+       void SetWeaponClass(short v) { mWeaponClass = v; }
+       void SetFlag(int index, bool v) {
+               if (v) mFlags |= (1 << index);
+               else mFlags &= ~(1 << index);
+       }
+
+       void SetFiringLightIntensity(double v) { mFiringLightIntensity = v; }
+       void SetFiringIntensityDecayTicks(short v) { mFiringIntensityDecayTicks = v; }
+
+       void SetIdleHeight(double v) { mIdleHeight = v; }
+       void SetBobAmplitude(double v) { mBobAmplitude = v; }
+       void SetKickHeight(double v) { mKickHeight = v; }
+       void SetReloadHeight(double v) { mReloadHeight = v; }
+       void SetIdleWidth(double v) { mIdleWidth = v; }
+       void SetHorizontalAmplitude(double v) { mHorizontalAmplitude = v; }
+
+       void SetCollection(unsigned short v) { mCollection = v; }
+       void SetColorTable(unsigned short v) { mColorTable = v; }
+       
+       void SetIdleShape(short v) { mIdleShape = v; }
+       void SetFiringShape(short v) { mFiringShape = v; }
+       void SetReloadingShape(short v) { mReloadingShape = v; }
+       void SetChargingShape(short v) { mChargingShape = v; }
+       void SetChargedShape(short v) { mChargedShape = v; }
+
+       void SetReadyTicks(short v) { mReadyTicks = v; }
+       void SetAwaitReloadTicks(short v) { mAwaitReloadTicks = v; }
+       void SetLoadingTicks(short v) { mLoadingTicks = v; }
+       void SetFinishLoadingTicks(short v) { mFinishLoadingTicks = v; }
+
+
+       WeaponDefinition(bool verbose = false) : PhysicsElement(verbose) { }
+       ~WeaponDefinition() { }
+
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer) const;
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+
+       static const int kSize = 134;
+};
+
+#endif
diff --git a/Physics/PhysicsTreeItemData.cpp b/Physics/PhysicsTreeItemData.cpp
new file mode 100644 (file)
index 0000000..9fe64ed
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include "PhysicsTreeItemData.h"
+
+PhysicsTreeItemData::PhysicsTreeItemData(int id, int sect) : id(id), section(sect)
+{
+
+}
+
+PhysicsTreeItemData::~PhysicsTreeItemData()
+{
+
+}
diff --git a/Physics/PhysicsTreeItemData.h b/Physics/PhysicsTreeItemData.h
new file mode 100644 (file)
index 0000000..3717c67
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#ifndef PHYSICSTREEITEMDATA_H
+#define PHYSICSTREEITEMDATA_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+#include "wx/treectrl.h"
+
+enum {
+       TREESECTION_MONSTERS = 1,
+       TREESECTION_MONSTERS_APPEARANCE,
+       TREESECTION_MONSTERS_COMBAT,
+       TREESECTION_MONSTERS_CONSTANTS,
+       TREESECTION_MONSTERS_BEHAVIOR,
+       TREESECTION_MONSTERS_IMMUNITIES,
+       TREESECTION_EFFECTS,
+       TREESECTION_PROJECTILES,
+       TREESECTION_PHYSICS,
+       TREESECTION_WEAPONS,
+       TREESECTION_WEAPONS_SETTINGS,
+       TREESECTION_WEAPONS_TRIGGERS,
+};
+
+class PhysicsTreeItemData : public wxTreeItemData {
+private:
+       int id;
+       int section;
+
+public:
+       PhysicsTreeItemData(int id=-1, int sect=-1);
+       ~PhysicsTreeItemData();
+
+       int ID(void) const { return id; }
+       int Section(void) const { return section; }
+};
+
+#endif
diff --git a/Physics/PhysicsView.cpp b/Physics/PhysicsView.cpp
new file mode 100644 (file)
index 0000000..35eed18
--- /dev/null
@@ -0,0 +1,1465 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include "PhysicsView.h"
+#include "PhysicsTreeItemData.h"
+
+#include "../DefaultNames.h"
+
+const wxSize choiceSize(200, -1);
+
+
+void PhysicsView::CreateAliens()
+{
+       aliens_appearance_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+       wxStaticBoxSizer* appearance_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Appearance"));
+
+       wxFlexGridSizer* appearance_grid_sizer = new wxFlexGridSizer(2);
+       appearance_grid_sizer->AddGrowableCol(0);
+       appearance_grid_sizer->SetHGap(10);
+       appearance_grid_sizer->SetVGap(4);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Graphic Collection:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_collection_field = new wxTextCtrl(main_panel, FIELD_ALIEN_COLLECTION);
+       appearance_grid_sizer->Add(alien_collection_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Color Table:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_color_table_field = new wxTextCtrl(main_panel, FIELD_ALIEN_COLOR_TABLE);
+       appearance_grid_sizer->Add(alien_color_table_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       wxStaticText* sequence_label = new wxStaticText(main_panel, wxID_ANY, _("Sequence IDs:"));
+//     wxFont font = sequence_label->GetFont();
+//     font.SetWeight(wxFONTWEIGHT_BOLD);
+//     sequence_label->SetFont(font);
+       appearance_grid_sizer->Add(sequence_label, 0, wxALIGN_CENTER_VERTICAL);
+       appearance_grid_sizer->AddSpacer(30);
+       
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Hit:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_hit_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HIT);
+       appearance_grid_sizer->Add(alien_hit_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Hard Dying:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_hard_dying_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HARD_DYING);
+       appearance_grid_sizer->Add(alien_hard_dying_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Soft Dying:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_soft_dying_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SOFT_DYING);
+       appearance_grid_sizer->Add(alien_soft_dying_field, 0, wxALIGN_CENTER_VERTICAL);
+       
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Hard Dead:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_hard_dead_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HARD_DEAD);
+       appearance_grid_sizer->Add(alien_hard_dead_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Soft Dead:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_soft_dead_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SOFT_DEAD);
+       appearance_grid_sizer->Add(alien_soft_dead_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Stationary:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_stationary_field = new wxTextCtrl(main_panel, FIELD_ALIEN_STATIONARY);
+       appearance_grid_sizer->Add(alien_stationary_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Moving:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_moving_field = new wxTextCtrl(main_panel, FIELD_ALIEN_MOVING);
+       appearance_grid_sizer->Add(alien_moving_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Teleport In:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_teleport_in_field = new wxTextCtrl(main_panel, FIELD_ALIEN_TELEPORT_IN);
+       appearance_grid_sizer->Add(alien_teleport_in_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Teleport Out:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_teleport_out_field = new wxTextCtrl(main_panel, FIELD_ALIEN_TELEPORT_OUT);
+       appearance_grid_sizer->Add(alien_teleport_out_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Melee Attack:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_melee_attack_shape_field = new wxTextCtrl(main_panel, FIELD_ALIEN_MELEE_ATTACK_SHAPE);
+       appearance_grid_sizer->Add(alien_melee_attack_shape_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ranged Attack:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_ranged_attack_shape_field = new wxTextCtrl(main_panel, FIELD_ALIEN_RANGED_ATTACK_SHAPE);
+       appearance_grid_sizer->Add(alien_ranged_attack_shape_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_sizer->Add(appearance_grid_sizer);
+
+       aliens_appearance_sizer->Add(appearance_sizer);
+       aliens_appearance_sizer->AddSpacer(10);
+
+       wxStaticBoxSizer* sounds_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Sounds"));
+
+       wxFlexGridSizer* sounds_grid_sizer = new wxFlexGridSizer(2);
+       sounds_grid_sizer->AddGrowableCol(0);
+       sounds_grid_sizer->SetHGap(10);
+       sounds_grid_sizer->SetVGap(4);
+
+       std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
+       sound_strings.insert(sound_strings.begin(), GetName(wxT("sound"), -1));
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Activation:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_activation_choice = new wxChoice(main_panel, MENU_ALIEN_ACTIVATION, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       sounds_grid_sizer->Add(alien_activation_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Friendly Activation:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_friendly_activation_choice = new wxChoice(main_panel, MENU_ALIEN_FRIENDLY_ACTIVATION, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       sounds_grid_sizer->Add(alien_friendly_activation_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Clear:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_clear_choice = new wxChoice(main_panel, MENU_ALIEN_CLEAR, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       sounds_grid_sizer->Add(alien_clear_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Kill:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_kill_choice = new wxChoice(main_panel, MENU_ALIEN_KILL, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       sounds_grid_sizer->Add(alien_kill_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Apology:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_apology_choice = new wxChoice(main_panel, MENU_ALIEN_APOLOGY, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       sounds_grid_sizer->Add(alien_apology_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Friendly Fire:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_friendly_fire_choice = new wxChoice(main_panel, MENU_ALIEN_FRIENDLY_FIRE, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       sounds_grid_sizer->Add(alien_friendly_fire_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Flaming:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_flaming_choice = new wxChoice(main_panel, MENU_ALIEN_FLAMING, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       sounds_grid_sizer->Add(alien_flaming_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Random:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_random_choice = new wxChoice(main_panel, MENU_ALIEN_RANDOM, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       sounds_grid_sizer->Add(alien_random_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->AddSpacer(10);
+       sounds_grid_sizer->AddSpacer(10);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Random Sound Mask:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_random_sound_mask_field = new wxTextCtrl(main_panel, FIELD_ALIEN_RANDOM_SOUND_MASK);
+       sounds_grid_sizer->Add(alien_random_sound_mask_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sound Pitch:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_sound_pitch_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SOUND_PITCH);
+       sounds_grid_sizer->Add(alien_sound_pitch_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       sounds_sizer->Add(sounds_grid_sizer);
+
+       aliens_appearance_sizer->Add(sounds_sizer);
+       
+       mainbox->Add(aliens_appearance_sizer, 5, wxALL, 10);
+       mainbox->Show(aliens_appearance_sizer, false);
+
+       aliens_combat_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+       wxFlexGridSizer* combat_grid_sizer = new wxFlexGridSizer(2);
+       combat_grid_sizer->SetHGap(10);
+       combat_grid_sizer->SetVGap(10);
+
+       wxBoxSizer* attack_frequency_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+       attack_frequency_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Attack Frequency:")), 1, wxALIGN_CENTER_VERTICAL);
+       attack_frequency_sizer->AddSpacer(10);
+       alien_attack_frequency_field = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_FREQUENCY);
+       attack_frequency_sizer->Add(alien_attack_frequency_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       combat_grid_sizer->Add(attack_frequency_sizer);
+       combat_grid_sizer->AddSpacer(0);
+
+       std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
+       shot_strings.insert(shot_strings.begin(), GetName(wxT("shot"), -1));
+
+       for (int i = 0; i < 2; ++i) {
+               int id_offset = i * NUM_ALIEN_ATTACK_CONTROLS;
+               wxStaticBoxSizer* attack_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, i == 0 ? _("Melee Attack") : _("Ranged Attack"));
+               wxFlexGridSizer* attack_grid_sizer = new wxFlexGridSizer(2);
+               attack_grid_sizer->AddGrowableCol(0);
+               attack_grid_sizer->SetHGap(10);
+               attack_grid_sizer->SetVGap(4);
+               
+               attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Type:")), 0, wxALIGN_CENTER_VERTICAL);
+               alien_attack_type_choices[i] = new wxChoice(main_panel, MENU_ALIEN_ATTACK_TYPE + id_offset, wxDefaultPosition, choiceSize, shot_strings.size(), &shot_strings[0]);
+               attack_grid_sizer->Add(alien_attack_type_choices[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Repetitions:")), 0, wxALIGN_CENTER_VERTICAL);
+               alien_attack_repetitions_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_REPETITIONS + id_offset);
+               attack_grid_sizer->Add(alien_attack_repetitions_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Error:")), 0, wxALIGN_CENTER_VERTICAL);
+               alien_attack_error_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_ERROR + id_offset);
+               attack_grid_sizer->Add(alien_attack_error_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Range:")), 0, wxALIGN_CENTER_VERTICAL);
+               alien_attack_range_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_RANGE + id_offset);
+               attack_grid_sizer->Add(alien_attack_range_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sequence ID:")), 0, wxALIGN_CENTER_VERTICAL);
+               alien_attack_sequence_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_SEQUENCE + id_offset);
+               attack_grid_sizer->Add(alien_attack_sequence_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dx:")), 0, wxALIGN_CENTER_VERTICAL);
+               alien_attack_dx_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_DX + id_offset);
+               attack_grid_sizer->Add(alien_attack_dx_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dy:")), 0, wxALIGN_CENTER_VERTICAL);
+               alien_attack_dy_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_DY + id_offset);
+               attack_grid_sizer->Add(alien_attack_dy_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               attack_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dz:")), 0, wxALIGN_CENTER_VERTICAL);
+               alien_attack_dz_fields[i] = new wxTextCtrl(main_panel, FIELD_ALIEN_ATTACK_DZ + id_offset);
+               attack_grid_sizer->Add(alien_attack_dz_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               attack_sizer->Add(attack_grid_sizer, 0, wxEXPAND);
+
+               combat_grid_sizer->Add(attack_sizer, 0, wxEXPAND);
+       }
+
+       wxStaticBoxSizer* shrapnel_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Shrapnel"));
+       wxFlexGridSizer* shrapnel_grid_sizer = new wxFlexGridSizer(2);
+       shrapnel_grid_sizer->AddGrowableCol(0);
+       shrapnel_grid_sizer->SetHGap(10);
+       shrapnel_grid_sizer->SetVGap(4);
+
+       shrapnel_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Shrapnel Radius:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_shrapnel_radius_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SHRAPNEL_RADIUS);
+       shrapnel_grid_sizer->Add(alien_shrapnel_radius_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       std::vector<wxString> damage_strings = DefaultNames::Instance()->GetArray(wxT("damage"));
+       damage_strings.insert(damage_strings.begin(), _("None"));
+
+       shrapnel_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Type:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_shrapnel_damage_type_choice = new wxChoice(main_panel, MENU_ALIEN_SHRAPNEL_DAMAGE_TYPE, wxDefaultPosition, choiceSize, damage_strings.size(), &damage_strings[0]);
+       shrapnel_grid_sizer->Add(alien_shrapnel_damage_type_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       shrapnel_sizer->Add(shrapnel_grid_sizer, 0, wxEXPAND);
+       
+       alien_shrapnel_alien_damage_checkbox = new wxCheckBox(main_panel, CB_ALIEN_SHRAPNEL_ALIEN_DAMAGE, _("Alien Damage (varies with level)"));
+       shrapnel_sizer->Add(alien_shrapnel_alien_damage_checkbox, 0, wxEXPAND | wxTOP, 5);
+
+       wxFlexGridSizer* shrapnel_grid_sizer2 = new wxFlexGridSizer(2);
+       shrapnel_grid_sizer2->AddGrowableCol(0);
+       shrapnel_grid_sizer2->SetHGap(10);
+       shrapnel_grid_sizer2->SetVGap(4);
+
+       // make the fields line up with the grid above
+       shrapnel_grid_sizer2->AddSpacer(0);
+       shrapnel_grid_sizer2->Add(choiceSize.GetWidth(), 0);
+
+       shrapnel_grid_sizer2->Add(new wxStaticText(main_panel, wxID_ANY, _("Base Damage:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_shrapnel_base_damage_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SHRAPNEL_BASE_DAMAGE);
+       shrapnel_grid_sizer2->Add(alien_shrapnel_base_damage_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shrapnel_grid_sizer2->Add(new wxStaticText(main_panel, wxID_ANY, _("Random Damage:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_shrapnel_random_damage_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SHRAPNEL_RANDOM_DAMAGE);
+       shrapnel_grid_sizer2->Add(alien_shrapnel_random_damage_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shrapnel_grid_sizer2->Add(new wxStaticText(main_panel, wxID_ANY, _("Scale:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_shrapnel_damage_scale_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SHRAPNEL_DAMAGE_SCALE);
+       shrapnel_grid_sizer2->Add(alien_shrapnel_damage_scale_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shrapnel_sizer->Add(shrapnel_grid_sizer2, 0, wxEXPAND);
+
+       combat_grid_sizer->Add(shrapnel_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* impact_effects_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Impact Effects (hits on monster)"));
+       wxFlexGridSizer* impact_effects_grid_sizer = new wxFlexGridSizer(2);
+       impact_effects_grid_sizer->AddGrowableCol(0);
+       impact_effects_grid_sizer->SetHGap(10);
+       impact_effects_grid_sizer->SetVGap(4);
+
+       std::vector<wxString> effect_strings = DefaultNames::Instance()->GetArray(wxT("effect"));
+       effect_strings.insert(effect_strings.begin(), GetName(wxT("sound"), -1));
+
+       impact_effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ranged:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_ranged_impact_effect_choice = new wxChoice(main_panel, MENU_ALIEN_RANGED_IMPACT_EFFECT, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
+       impact_effects_grid_sizer->Add(alien_ranged_impact_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       impact_effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Melee:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_melee_impact_effect_choice = new wxChoice(main_panel, MENU_ALIEN_MELEE_IMPACT_EFFECT, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
+       impact_effects_grid_sizer->Add(alien_melee_impact_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       impact_effects_sizer->Add(impact_effects_grid_sizer, 0, wxEXPAND);
+       
+       combat_grid_sizer->Add(impact_effects_sizer, 0, wxEXPAND);
+
+       aliens_combat_sizer->Add(combat_grid_sizer);
+
+       mainbox->Add(aliens_combat_sizer, 5, wxALL, 10);
+       mainbox->Show(aliens_combat_sizer, false);
+
+       aliens_constants_sizer = new wxBoxSizer(wxVERTICAL);
+
+       wxFlexGridSizer* constants_grid_sizer = new wxFlexGridSizer(2);
+       constants_grid_sizer->SetHGap(10);
+       constants_grid_sizer->SetVGap(10);
+
+       wxFlexGridSizer* vitality_grid_sizer = new wxFlexGridSizer(2);
+       vitality_grid_sizer->AddGrowableCol(0);
+       vitality_grid_sizer->SetHGap(10);
+
+       vitality_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Vitality:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_vitality_field = new wxTextCtrl(main_panel, FIELD_ALIEN_VITALITY);
+       vitality_grid_sizer->Add(alien_vitality_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       constants_grid_sizer->Add(vitality_grid_sizer, 0, wxEXPAND);
+
+       wxFlexGridSizer* radius_height_sizer = new wxFlexGridSizer(2);
+       radius_height_sizer->AddGrowableCol(0);
+       radius_height_sizer->SetHGap(10);
+       radius_height_sizer->SetVGap(4);
+
+       radius_height_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Radius:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_radius_field = new wxTextCtrl(main_panel, FIELD_ALIEN_RADIUS);
+       radius_height_sizer->Add(alien_radius_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       radius_height_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Height:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_height_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HEIGHT);
+       radius_height_sizer->Add(alien_height_field, 0, wxALIGN_CENTER_VERTICAL);
+       
+       constants_grid_sizer->Add(radius_height_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* movement_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Movement"));
+       wxFlexGridSizer* movement_grid_sizer = new wxFlexGridSizer(2);
+       movement_grid_sizer->AddGrowableCol(0);
+       movement_grid_sizer->SetHGap(10);
+       movement_grid_sizer->SetVGap(4);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Speed:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_speed_field = new wxTextCtrl(main_panel, FIELD_ALIEN_SPEED);
+       movement_grid_sizer->Add(alien_speed_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Terminal Velocity:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_terminal_velocity_field = new wxTextCtrl(main_panel, FIELD_ALIEN_TERMINAL_VELOCITY);
+       movement_grid_sizer->Add(alien_terminal_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Gravity:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_gravity_field = new wxTextCtrl(main_panel, FIELD_ALIEN_GRAVITY);
+       movement_grid_sizer->Add(alien_gravity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->AddSpacer(10);
+       movement_grid_sizer->AddSpacer(10);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Min. Ledge Jump:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_min_ledge_jump_field = new wxTextCtrl(main_panel, FIELD_ALIEN_MIN_LEDGE_JUMP);
+       movement_grid_sizer->Add(alien_min_ledge_jump_field, 0, wxALIGN_CENTER_VERTICAL);       
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Max. Ledge Jump:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_max_ledge_jump_field = new wxTextCtrl(main_panel, FIELD_ALIEN_MAX_LEDGE_JUMP);
+       movement_grid_sizer->Add(alien_max_ledge_jump_field, 0, wxALIGN_CENTER_VERTICAL);       
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("External Velocity Scale:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_ext_velocity_scale_field = new wxTextCtrl(main_panel, FIELD_ALIEN_EXT_VELOCITY_SCALE);
+       movement_grid_sizer->Add(alien_ext_velocity_scale_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Hover Height:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_hover_height_field = new wxTextCtrl(main_panel, FIELD_ALIEN_HOVER_HEIGHT);
+       movement_grid_sizer->Add(alien_hover_height_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->AddSpacer(10);
+       movement_grid_sizer->AddSpacer(10);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Door Retry Mask:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_door_retry_mask_field = new wxTextCtrl(main_panel, FIELD_ALIEN_DOOR_RETRY_MASK);
+       movement_grid_sizer->Add(alien_door_retry_mask_field, 0, wxALIGN_CENTER_VERTICAL);      
+
+       movement_sizer->Add(movement_grid_sizer, 0, wxEXPAND);
+
+       constants_grid_sizer->Add(movement_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* perception_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Perception"));
+       wxFlexGridSizer* perception_grid_sizer = new wxFlexGridSizer(2);
+       perception_grid_sizer->AddGrowableCol(0);
+       perception_grid_sizer->SetHGap(10);
+       perception_grid_sizer->SetVGap(4);
+
+       perception_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Visual Range:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_visual_range_field = new wxTextCtrl(main_panel, FIELD_ALIEN_VISUAL_RANGE);
+       perception_grid_sizer->Add(alien_visual_range_field, 0, wxALIGN_CENTER_VERTICAL);       
+
+       perception_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Dark Visual Range:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_dark_visual_range_field = new wxTextCtrl(main_panel, FIELD_ALIEN_DARK_VISUAL_RANGE);
+       perception_grid_sizer->Add(alien_dark_visual_range_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       perception_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Intelligence:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_intelligence_field = new wxTextCtrl(main_panel, FIELD_ALIEN_INTELLIGENCE);
+       perception_grid_sizer->Add(alien_intelligence_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       perception_sizer->Add(perception_grid_sizer, 0, wxEXPAND);
+
+       constants_grid_sizer->Add(perception_sizer, 0, wxEXPAND);
+
+       aliens_constants_sizer->Add(constants_grid_sizer);
+       aliens_constants_sizer->AddSpacer(10);
+
+       wxFlexGridSizer* carrying_grid_sizer = new wxFlexGridSizer(2);
+       carrying_grid_sizer->AddGrowableCol(0);
+       carrying_grid_sizer->SetHGap(10);
+       carrying_grid_sizer->SetVGap(4);
+
+       std::vector<wxString> item_strings = DefaultNames::Instance()->GetArray(wxT("item"));
+       item_strings.insert(item_strings.begin(), _("None"));
+
+       carrying_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Carrying Item Type:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_carrying_item_choice = new wxChoice(main_panel, MENU_ALIEN_CARRYING_ITEM, wxDefaultPosition, choiceSize, item_strings.size(), &item_strings[0]);
+       carrying_grid_sizer->Add(alien_carrying_item_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       carrying_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Contrail Effect:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_contrail_effect_choice = new wxChoice(main_panel, MENU_ALIEN_CONTRAIL_EFFECT, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
+       carrying_grid_sizer->Add(alien_contrail_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       aliens_constants_sizer->Add(carrying_grid_sizer);
+       
+       mainbox->Add(aliens_constants_sizer, 5, wxALL, 10);
+       mainbox->Show(aliens_constants_sizer, false);
+
+       aliens_behavior_sizer = new wxBoxSizer(wxVERTICAL);
+
+       wxBoxSizer* class_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+       std::vector<wxString> class_strings = DefaultNames::Instance()->GetArray(wxT("class"));
+
+       class_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Class:")), 0, wxALIGN_CENTER_VERTICAL);
+       alien_class_choice = new wxChoice(main_panel, MENU_ALIEN_CLASS, wxDefaultPosition, choiceSize, class_strings.size(), &class_strings[0]);
+       class_sizer->AddSpacer(10);
+       class_sizer->Add(alien_class_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       aliens_behavior_sizer->Add(class_sizer);
+
+       wxStaticBoxSizer* friends_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Friends"));
+       wxGridSizer* friends_grid_sizer = new wxGridSizer(4);
+       friends_grid_sizer->SetVGap(2);
+
+       for (int i = 0; i < 16; ++i) {
+               alien_friends_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_FRIENDS + i, GetName(wxT("class"), i));
+
+       }
+
+       for (int col = 0; col < 4; ++col) {
+               for (int row = 0; row < 4; ++row) {
+                       friends_grid_sizer->Add(alien_friends_checkboxes[row * 4 + col], 0, wxALIGN_CENTER_VERTICAL);
+               }
+       }
+       
+       friends_sizer->Add(friends_grid_sizer, 0, wxEXPAND);
+
+       aliens_behavior_sizer->AddSpacer(10);
+       aliens_behavior_sizer->Add(friends_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* enemies_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Enemies"));
+       wxGridSizer* enemies_grid_sizer = new wxGridSizer(4);
+       enemies_grid_sizer->SetVGap(2);
+
+       for (int i = 0; i < 16; ++i) {
+               alien_enemies_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_ENEMIES + i, GetName(wxT("class"), i));
+       }
+
+       for (int col = 0; col < 4; ++col) {
+               for (int row = 0; row < 4; ++row) {
+                       enemies_grid_sizer->Add(alien_enemies_checkboxes[row * 4 + col], 0, wxALIGN_CENTER_VERTICAL);
+               }
+       }
+
+       enemies_sizer->Add(enemies_grid_sizer, 0, wxEXPAND);
+       
+       aliens_behavior_sizer->AddSpacer(10);
+       aliens_behavior_sizer->Add(enemies_sizer, 0, wxEXPAND);
+
+       const wxString flags_strings[] = {
+               _("Flies"),
+               _("Is Alien"),
+               _("Major"),
+               _("Minor"),
+               _("Cannot Skip"),
+               _("Floats"),
+               _("Cannot Attack"),
+               _("Uses Sniper Ledges"),
+               _("Invisible"),
+               _("Subtly Invisible"),
+               _("Kamikaze"),
+               _("Berserker"),
+               _("Enlarged"),
+               _("Delayed Hard Death"),
+               _("Fires Symmetrically"),
+               _("Nuclear Hard Death"),
+               _("Can't Fire Backwards"),
+               _("Die in Flames"),
+               _("Stay with Clear Shot"),
+               _("Tiny"),
+               _("Attacks Immediately"),
+               _("Not Afraid of Water"),
+               _("Not Afraid of Sewage"),
+               _("Not Afraid of Lava"),
+               _("Not Afraid of Goo"),
+               _("Can Teleport Under Liquid"),
+               _("Chooses Weapon Randomly"),
+       };
+
+       const int flags_layout[] = {
+               0, 8, 17,
+               1, 9, 18,
+               2, 10, 19,
+               3, 11, 20,
+               4, 12, 21,
+               5, 13, 22,
+               6, 14, 23,
+               7, 15, 24,
+               26, 16, 25
+       };
+
+       wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
+       wxGridSizer* flags_grid_sizer = new wxGridSizer(3);
+       flags_grid_sizer->SetVGap(2);
+       
+       for (int i = 0; i < 27; ++i) {
+               alien_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_FLAGS + i, flags_strings[i]);
+       }
+
+       for (int i = 0; i < 27; ++i) {
+               flags_grid_sizer->Add(alien_flags_checkboxes[flags_layout[i]], 0, wxALIGN_CENTER_VERTICAL);
+       }
+
+       flags_sizer->Add(flags_grid_sizer, 0, wxEXPAND);
+       
+       aliens_behavior_sizer->AddSpacer(10);
+       aliens_behavior_sizer->Add(flags_sizer, 0, wxEXPAND);
+       
+       mainbox->Add(aliens_behavior_sizer, 5, wxALL, 10);
+       mainbox->Show(aliens_behavior_sizer, false);
+
+       aliens_immunities_sizer = new wxBoxSizer(wxVERTICAL);
+
+       wxStaticBoxSizer* immunities_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Immunities"));
+       wxGridSizer* immunities_grid_sizer = new wxGridSizer(4);
+       immunities_grid_sizer->SetVGap(2);
+       
+       for (int i = 0; i < 24; ++i) {
+               alien_immunities_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_IMMUNITIES + i, GetName(wxT("damage"), i));
+       }
+
+       for (int i = 0; i < 6; ++i) {
+               for (int j = 0; j < 4; ++j) {
+                       immunities_grid_sizer->Add(alien_immunities_checkboxes[j * 6 + i], 0, wxALIGN_CENTER_VERTICAL);
+               }
+       }
+
+       immunities_sizer->Add(immunities_grid_sizer, 0, wxEXPAND);
+
+       aliens_immunities_sizer->Add(immunities_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* weaknesses_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Weaknesses"));
+       wxGridSizer* weaknesses_grid_sizer = new wxGridSizer(4);
+       weaknesses_grid_sizer->SetVGap(2);
+
+       for (int i = 0; i < 24; ++i) {
+               alien_weaknesses_checkboxes[i] = new wxCheckBox(main_panel, CB_ALIEN_WEAKNESSES + i, GetName(wxT("damage"), i));
+       }
+
+       for (int i = 0; i < 6; ++i) {
+               for (int j = 0; j < 4; ++j) {
+                       weaknesses_grid_sizer->Add(alien_weaknesses_checkboxes[j * 6 + i], 0, wxALIGN_CENTER_VERTICAL);
+               }
+       }
+
+       weaknesses_sizer->Add(weaknesses_grid_sizer, 0, wxEXPAND);
+       
+       aliens_immunities_sizer->AddSpacer(10);
+       aliens_immunities_sizer->Add(weaknesses_sizer, 0, wxEXPAND);
+
+       mainbox->Add(aliens_immunities_sizer, 5, wxALL, 10);
+       mainbox->Show(aliens_immunities_sizer, false);
+}
+
+void PhysicsView::CreateEffects()
+{
+       effects_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+       wxStaticBoxSizer* effects_static_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Effect"));
+       
+       wxFlexGridSizer* effects_grid_sizer = new wxFlexGridSizer(2);
+       effects_grid_sizer->AddGrowableCol(0);
+       effects_grid_sizer->SetHGap(10);
+       effects_grid_sizer->SetVGap(4);
+       
+       effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Graphic collection:")), 0, wxALIGN_CENTER_VERTICAL);
+       eff_collection_field = new wxTextCtrl(main_panel, FIELD_EFFECT_COLLECTION);
+       effects_grid_sizer->Add(eff_collection_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Color table:")), 0, wxALIGN_CENTER_VERTICAL);
+       eff_color_table_field = new wxTextCtrl(main_panel, FIELD_EFFECT_COLOR_TABLE);
+       effects_grid_sizer->Add(eff_color_table_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sequence:")), 0, wxALIGN_CENTER_VERTICAL);
+       eff_sequence_field = new wxTextCtrl(main_panel, FIELD_EFFECT_SEQUENCE);
+       effects_grid_sizer->Add(eff_sequence_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       effects_grid_sizer->AddSpacer(10);
+       effects_grid_sizer->AddSpacer(10);
+
+       effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sound pitch:")), 0, wxALIGN_CENTER_VERTICAL);
+       eff_pitch_field = new wxTextCtrl(main_panel, FIELD_EFFECT_PITCH);
+       effects_grid_sizer->Add(eff_pitch_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       effects_grid_sizer->AddSpacer(10);
+       effects_grid_sizer->AddSpacer(10);
+
+       effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Delay:")), 0, wxALIGN_CENTER_VERTICAL);
+       eff_delay_field = new wxTextCtrl(main_panel, wxID_ANY);
+       eff_delay_field->Disable();
+       effects_grid_sizer->Add(eff_delay_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       std::vector<wxString> delay_sound_choices = DefaultNames::Instance()->GetArray(wxT("sound"));
+       delay_sound_choices.insert(delay_sound_choices.begin(), GetName(wxT("sound"), -1));
+
+       effects_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Delay sound:")), 0, wxALIGN_CENTER_VERTICAL);
+       eff_delay_sound_choice = new wxChoice(main_panel, MENU_EFFECT_DELAY_SOUND, wxDefaultPosition, choiceSize, delay_sound_choices.size(), &delay_sound_choices[0]);
+       effects_grid_sizer->Add(eff_delay_sound_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       effects_static_sizer->Add(effects_grid_sizer);
+       
+       effects_static_sizer->AddSpacer(10);
+
+       eff_end_when_animation_loops_checkbox = new wxCheckBox(main_panel, CB_EFFECT_END_WHEN_ANIMATION_LOOPS, _("End when animation loops"));
+       effects_static_sizer->Add(eff_end_when_animation_loops_checkbox);
+
+       eff_end_when_transfer_animation_loops_checkbox = new wxCheckBox(main_panel, CB_EFFECT_END_WHEN_TRANSFER_ANIMATION_LOOPS, _("End when transfer animation loops"));
+       effects_static_sizer->AddSpacer(2);
+       effects_static_sizer->Add(eff_end_when_transfer_animation_loops_checkbox);
+
+       eff_sound_only_checkbox = new wxCheckBox(main_panel, CB_EFFECT_SOUND_ONLY, _("Sound only"));
+       effects_static_sizer->AddSpacer(2);
+       effects_static_sizer->Add(eff_sound_only_checkbox);
+
+       eff_media_effect_checkbox = new wxCheckBox(main_panel, CB_EFFECT_MEDIA_EFFECT, _("Media effect"));
+       effects_static_sizer->AddSpacer(2);
+       effects_static_sizer->Add(eff_media_effect_checkbox);
+       
+       effects_sizer->Add(effects_static_sizer);
+       
+       mainbox->Add(effects_sizer, 5, wxALL, 10);
+       mainbox->Show(effects_sizer, false);
+}
+
+void PhysicsView::CreatePhysicsConstants()
+{
+       // physics constants
+       physics_sizer = new wxFlexGridSizer(2);
+       physics_sizer->SetHGap(10);
+       physics_sizer->SetVGap(20);
+
+       wxStaticBoxSizer* movement_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Movement"));
+       wxFlexGridSizer* movement_grid_sizer = new wxFlexGridSizer(2);
+
+       movement_grid_sizer->AddGrowableCol(0);
+       movement_grid_sizer->SetHGap(10);
+       movement_grid_sizer->SetVGap(4);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Max. forward velocity:")), 0, wxALIGN_CENTER_VERTICAL);
+       max_forward_velocity_field = new wxTextCtrl(main_panel, FIELD_MAX_FORWARD_VELOCITY);
+       movement_grid_sizer->Add(max_forward_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Max. backward velocity:")), 0, wxALIGN_CENTER_VERTICAL);
+       max_backward_velocity_field = new wxTextCtrl(main_panel, FIELD_MAX_BACKWARD_VELOCITY);
+       movement_grid_sizer->Add(max_backward_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Max. perpendicular velocity:")), 0, wxALIGN_CENTER_VERTICAL);
+       max_perpendicular_velocity_field = new wxTextCtrl(main_panel, FIELD_MAX_PERPENDICULAR_VELOCITY);
+       movement_grid_sizer->Add(max_perpendicular_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->AddSpacer(10);
+       movement_grid_sizer->AddSpacer(10);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Acceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       acceleration_field = new wxTextCtrl(main_panel, FIELD_ACCELERATION);
+       movement_grid_sizer->Add(acceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       deceleration_field = new wxTextCtrl(main_panel, FIELD_DECELERATION);
+       movement_grid_sizer->Add(deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Airborne deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       airborne_deceleration_field = new wxTextCtrl(main_panel, FIELD_AIRBORNE_DECELERATION);
+       movement_grid_sizer->Add(airborne_deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Gravitational acceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       gravitational_acceleration_field = new wxTextCtrl(main_panel, FIELD_GRAVITATIONAL_ACCELERATION);
+       movement_grid_sizer->Add(gravitational_acceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Climbing acceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       climbing_acceleration_field = new wxTextCtrl(main_panel, FIELD_CLIMBING_ACCELERATION);
+       movement_grid_sizer->Add(climbing_acceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Terminal velocity:")), 0, wxALIGN_CENTER_VERTICAL);
+       terminal_velocity_field = new wxTextCtrl(main_panel, FIELD_TERMINAL_VELOCITY);
+       movement_grid_sizer->Add(terminal_velocity_field, 0, wxALIGN_CENTER_VERTICAL);  
+
+       movement_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("External deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       external_deceleration_field = new wxTextCtrl(main_panel, FIELD_EXTERNAL_DECELERATION);
+       movement_grid_sizer->Add(external_deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       movement_sizer->Add(movement_grid_sizer, 0, wxEXPAND);
+       physics_sizer->Add(movement_sizer, 0, wxEXPAND);
+
+       wxBoxSizer* steps_player_size_sizer = new wxBoxSizer(wxVERTICAL);
+       wxStaticBoxSizer* steps_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Steps"));
+       wxFlexGridSizer* steps_grid_sizer = new wxFlexGridSizer(2);
+       steps_grid_sizer->AddGrowableCol(0);
+       steps_grid_sizer->SetHGap(10);
+       steps_grid_sizer->SetVGap(4);
+
+       steps_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Step delta:")), 0, wxALIGN_CENTER_VERTICAL);
+       step_delta_field = new wxTextCtrl(main_panel, FIELD_STEP_DELTA);
+       steps_grid_sizer->Add(step_delta_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       steps_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Step amplitude:")), 0, wxALIGN_CENTER_VERTICAL);
+       step_amplitude_field = new wxTextCtrl(main_panel, FIELD_STEP_AMPLITUDE);
+       steps_grid_sizer->Add(step_amplitude_field, 0, wxALIGN_CENTER_VERTICAL);
+       
+       steps_sizer->Add(steps_grid_sizer, 0, wxEXPAND);
+
+       steps_player_size_sizer->Add(steps_sizer, 0, wxEXPAND);
+       steps_player_size_sizer->AddSpacer(10);
+
+       wxStaticBoxSizer* size_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Player Size"));
+       wxFlexGridSizer* size_grid_sizer = new wxFlexGridSizer(2);
+       size_grid_sizer->AddGrowableCol(0);
+       size_grid_sizer->SetHGap(10);
+       size_grid_sizer->SetVGap(4);
+
+       size_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Radius:")), 0, wxALIGN_CENTER_VERTICAL);
+       radius_field = new wxTextCtrl(main_panel, FIELD_RADIUS);
+       size_grid_sizer->Add(radius_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       size_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Height:")), 0, wxALIGN_CENTER_VERTICAL);
+       height_field = new wxTextCtrl(main_panel, FIELD_HEIGHT);
+       size_grid_sizer->Add(height_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       size_sizer->Add(size_grid_sizer, 0, wxEXPAND);
+       
+       steps_player_size_sizer->Add(size_sizer, 0, wxEXPAND);
+       steps_player_size_sizer->AddStretchSpacer();
+
+       physics_sizer->Add(steps_player_size_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* turning_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Turning/Head Movement"));
+       wxFlexGridSizer* turning_grid_sizer = new wxFlexGridSizer(2);
+       turning_grid_sizer->AddGrowableCol(0);
+       turning_grid_sizer->SetHGap(10);
+       turning_grid_sizer->SetVGap(4);
+       
+       turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Angular acceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       angular_acceleration_field = new wxTextCtrl(main_panel, FIELD_ANGULAR_ACCELERATION);
+       turning_grid_sizer->Add(angular_acceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Angular deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       angular_deceleration_field = new wxTextCtrl(main_panel, FIELD_ANGULAR_DECELERATION);
+       turning_grid_sizer->Add(angular_deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Maximum angular velocity:")), 0, wxALIGN_CENTER_VERTICAL);
+       maximum_angular_velocity_field = new wxTextCtrl(main_panel, FIELD_MAXIMUM_ANGULAR_VELOCITY);
+       turning_grid_sizer->Add(maximum_angular_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Angular recentering velocity:")), 0, wxALIGN_CENTER_VERTICAL);
+       angular_recentering_velocity_field = new wxTextCtrl(main_panel, FIELD_ANGULAR_RECENTERING_VELOCITY);
+       turning_grid_sizer->Add(angular_recentering_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Head angular velocity:")), 0, wxALIGN_CENTER_VERTICAL);
+       head_angular_velocity_field = new wxTextCtrl(main_panel, FIELD_HEAD_ANGULAR_VELOCITY);
+       turning_grid_sizer->Add(head_angular_velocity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Head angular maximum:")), 0, wxALIGN_CENTER_VERTICAL);
+       head_angular_maximum_field = new wxTextCtrl(main_panel, FIELD_HEAD_ANGULAR_MAXIMUM);
+       turning_grid_sizer->Add(head_angular_maximum_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Maximum elevation:")), 0, wxALIGN_CENTER_VERTICAL);
+       maximum_elevation_field = new wxTextCtrl(main_panel, FIELD_MAXIMUM_ELEVATION);
+       turning_grid_sizer->Add(maximum_elevation_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       turning_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("External angular deceleration:")), 0, wxALIGN_CENTER_VERTICAL);
+       external_angular_deceleration_field = new wxTextCtrl(main_panel, FIELD_EXTERNAL_ANGULAR_DECELERATION);
+       turning_grid_sizer->Add(external_angular_deceleration_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       turning_sizer->Add(turning_grid_sizer, 0, wxEXPAND);
+       physics_sizer->Add(turning_sizer, 0);
+
+       wxStaticBoxSizer* camera_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Heights (for camera)"));
+       wxFlexGridSizer* camera_grid_sizer = new wxFlexGridSizer(2);
+       camera_grid_sizer->AddGrowableCol(0);
+       camera_grid_sizer->SetHGap(10);
+       camera_grid_sizer->SetVGap(4);
+
+       camera_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Dead height:")), 0, wxALIGN_CENTER_VERTICAL);
+       dead_height_field = new wxTextCtrl(main_panel, FIELD_DEAD_HEIGHT);
+       camera_grid_sizer->Add(dead_height_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       camera_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Camera height:")), 0, wxALIGN_CENTER_VERTICAL);
+       camera_height_field = new wxTextCtrl(main_panel, FIELD_CAMERA_HEIGHT);
+       camera_grid_sizer->Add(camera_height_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       camera_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Splash height:")), 0, wxALIGN_CENTER_VERTICAL);
+       splash_height_field = new wxTextCtrl(main_panel, FIELD_SPLASH_HEIGHT);
+       camera_grid_sizer->Add(splash_height_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       camera_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Half camera separation:")), 0, wxALIGN_CENTER_VERTICAL);
+       half_camera_separation_field = new wxTextCtrl(main_panel, FIELD_HALF_CAMERA_SEPARATION);
+       camera_grid_sizer->Add(half_camera_separation_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       camera_sizer->Add(camera_grid_sizer, 0, wxEXPAND);
+       camera_sizer->AddStretchSpacer();
+       physics_sizer->Add(camera_sizer, 0);    
+
+       mainbox->Add(physics_sizer, 5, wxALL, 10);
+       mainbox->Show(physics_sizer, false);
+}
+
+void PhysicsView::CreateShots()
+{
+       shots_sizer = new wxBoxSizer(wxHORIZONTAL);
+       
+       wxStaticBoxSizer* shots_static_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, _("Shot"));
+       
+       wxBoxSizer* column_1_sizer = new wxBoxSizer(wxVERTICAL);
+       
+       wxFlexGridSizer* shape_sizer = new wxFlexGridSizer(2);
+       shape_sizer->AddGrowableCol(1);
+       shape_sizer->SetHGap(10);
+       shape_sizer->SetVGap(4);
+
+       shape_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Graphic Collection:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_collection_field = new wxTextCtrl(main_panel, FIELD_SHOT_COLLECTION);
+       shape_sizer->Add(shots_collection_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shape_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Color Table:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_color_table_field = new wxTextCtrl(main_panel, FIELD_SHOT_COLOR_TABLE);
+       shape_sizer->Add(shots_color_table_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shape_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sequence:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_sequence_field = new wxTextCtrl(main_panel, FIELD_SHOT_SEQUENCE);
+       shape_sizer->Add(shots_sequence_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       column_1_sizer->Add(shape_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* damage_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Damage"));
+
+       wxFlexGridSizer* damage_grid_sizer = new wxFlexGridSizer(2);
+       damage_grid_sizer->AddGrowableCol(0);
+       damage_grid_sizer->SetHGap(10);
+       damage_grid_sizer->SetVGap(5);
+
+       damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Type:")), 0, wxALIGN_CENTER_VERTICAL);
+       
+       std::vector<wxString> damage_strings = DefaultNames::Instance()->GetArray(wxT("damage"));
+       damage_strings.insert(damage_strings.begin(), _("None"));
+
+       shots_damage_type_choice = new wxChoice(main_panel, MENU_SHOT_DAMAGE_TYPE, wxDefaultPosition, choiceSize, damage_strings.size(), &damage_strings[0]);
+       damage_grid_sizer->Add(shots_damage_type_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Base:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_damage_base_field = new wxTextCtrl(main_panel, FIELD_SHOT_DAMAGE_BASE);
+       damage_grid_sizer->Add(shots_damage_base_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Random:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_damage_random_field = new wxTextCtrl(main_panel, FIELD_SHOT_DAMAGE_RANDOM);
+       damage_grid_sizer->Add(shots_damage_random_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       damage_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Damage Scale:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_damage_scale_field = new wxTextCtrl(main_panel, FIELD_SHOT_DAMAGE_SCALE);
+       damage_grid_sizer->Add(shots_damage_scale_field, 0, wxALIGN_CENTER_VERTICAL);
+       
+       damage_sizer->Add(damage_grid_sizer, 0, wxEXPAND);
+       
+       shots_alien_damage_checkbox = new wxCheckBox(main_panel, CB_SHOT_ALIEN_DAMAGE, _("Alien Damage (varies with level)"));
+       damage_sizer->Add(shots_alien_damage_checkbox, 0, wxTOP, 5);
+
+       column_1_sizer->Add(damage_sizer, 0, wxEXPAND | wxALL, 10);
+
+       wxFlexGridSizer* shots_grid_sizer = new wxFlexGridSizer(2);
+       shots_grid_sizer->AddGrowableCol(0);
+       shots_grid_sizer->SetHGap(10);
+       shots_grid_sizer->SetVGap(4);
+       
+       std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
+       sound_strings.insert(sound_strings.begin(), GetName(wxT("sound"), -1));
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Flyby Sound:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_flyby_sound_choice = new wxChoice(main_panel, MENU_SHOT_FLYBY_SOUND, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       shots_grid_sizer->Add(shots_flyby_sound_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Rebound Sound:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_rebound_sound_choice = new wxChoice(main_panel, MENU_SHOT_REBOUND_SOUND, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+       shots_grid_sizer->Add(shots_rebound_sound_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Sound Pitch:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_sound_pitch_field = new wxTextCtrl(main_panel, FIELD_SHOT_SOUND_PITCH);
+       shots_grid_sizer->Add(shots_sound_pitch_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->AddSpacer(5);
+       shots_grid_sizer->AddSpacer(5);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Radius:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_radius_field = new wxTextCtrl(main_panel, FIELD_SHOT_RADIUS);
+       shots_grid_sizer->Add(shots_radius_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Area of Effect:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_area_of_effect_field = new wxTextCtrl(main_panel, FIELD_SHOT_AREA_OF_EFFECT);
+       shots_grid_sizer->Add(shots_area_of_effect_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Speed:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_speed_field = new wxTextCtrl(main_panel, FIELD_SHOT_SPEED);
+       shots_grid_sizer->Add(shots_speed_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Maximum Range:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_range_field = new wxTextCtrl(main_panel, FIELD_SHOT_RANGE);
+       shots_grid_sizer->Add(shots_range_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->AddSpacer(5);
+       shots_grid_sizer->AddSpacer(5);
+
+       std::vector<wxString> effect_strings = DefaultNames::Instance()->GetArray(wxT("effect"));
+       effect_strings.insert(effect_strings.begin(), GetName(wxT("sound"), -1));
+       
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Detonation Effect:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_detonation_effect_choice = new wxChoice(main_panel, MENU_SHOT_DETONATION_EFFECT, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
+       shots_grid_sizer->Add(shots_detonation_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       static const wxString media_effect_strings[] = {
+               _("None"),
+               _("Small Splash"),
+               _("Medium Splash"),
+       };
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Media Detonation Effect:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_media_detonation_effect_choice = new wxChoice(main_panel, MENU_SHOT_MEDIA_DETONATION_EFFECT, wxDefaultPosition, choiceSize, 3, media_effect_strings);
+       shots_grid_sizer->Add(shots_media_detonation_effect_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->AddSpacer(5);
+       shots_grid_sizer->AddSpacer(5);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Contrail:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_contrail_choice = new wxChoice(main_panel, MENU_SHOT_CONTRAIL, wxDefaultPosition, choiceSize, effect_strings.size(), &effect_strings[0]);
+       shots_grid_sizer->Add(shots_contrail_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ticks between contrails:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_contrail_ticks_field = new wxTextCtrl(main_panel, FIELD_SHOT_CONTRAIL_TICKS);
+       shots_grid_sizer->Add(shots_contrail_ticks_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       shots_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Maximum contrails:")), 0, wxALIGN_CENTER_VERTICAL);
+       shots_maximum_contrails_field = new wxTextCtrl(main_panel, FIELD_SHOT_MAXIMUM_CONTRAILS);
+       shots_grid_sizer->Add(shots_maximum_contrails_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       column_1_sizer->Add(shots_grid_sizer);
+
+       shots_static_sizer->Add(column_1_sizer, 0, wxEXPAND);
+       shots_static_sizer->AddSpacer(10);
+
+       wxBoxSizer* column_2_sizer = new wxBoxSizer(wxVERTICAL);
+
+       wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
+
+       static const wxString flags_strings[] = {
+               _("Guided"),
+               _("Stop when animation loops"),
+               _("Persistent"),
+               _("Alien"),
+               _("Affected by gravity"),
+               _("No horizontal error"),
+               _("No vertical error"),
+               _("Can toggle control panels"),
+               _("Positive vertical error"),
+               _("Melee projectile"),
+               _("Persistent and virulent"),
+               _("Usually pass transparent side"),
+               _("Sometimes pass transparent side"),
+               _("Doubly affected by gravity"),
+               _("Rebounds from floor"),
+               _("Penetrates liquids"),
+               _("Becomes item on detonation"),
+               _("Bleeding projectile"),
+               _("Horizontal wander"),
+               _("Vertical wander"),
+               _("Affected by half gravity"),
+               _("Penetrates liquid boundary (inf)")
+       };
+
+
+       for (int i = 0; i < 22; ++i) {
+               shots_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_SHOT_FLAGS + i, flags_strings[i]);
+               if (i > 0) {
+                       flags_sizer->Add(shots_flags_checkboxes[i], 0, wxTOP, 2);
+               } else {
+                       flags_sizer->Add(shots_flags_checkboxes[i]);
+               }
+       }
+
+       column_2_sizer->Add(flags_sizer, 0, wxEXPAND | wxTOP | wxRIGHT | wxBOTTOM, 10);
+
+       wxBoxSizer* media_impact_sizer = new wxBoxSizer(wxHORIZONTAL);
+       
+       media_impact_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Media impact:")), 0, wxALIGN_CENTER_VERTICAL);
+       media_impact_sizer->AddSpacer(10);
+
+       std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
+       shot_strings.insert(shot_strings.begin(), GetName(wxT("shot"), -1));
+
+       shots_media_impact_choice = new wxChoice(main_panel, MENU_SHOT_MEDIA_IMPACT, wxDefaultPosition, choiceSize, shot_strings.size(), &shot_strings[0]);
+       media_impact_sizer->Add(shots_media_impact_choice, 0, wxALIGN_CENTER_VERTICAL);
+       
+       column_2_sizer->Add(media_impact_sizer);
+
+       shots_static_sizer->Add(column_2_sizer, 0, wxEXPAND);
+
+       shots_sizer->Add(shots_static_sizer);
+
+       mainbox->Add(shots_sizer, 5, wxALL, 10);
+       mainbox->Show(shots_sizer, false);
+}
+
+void PhysicsView::CreateWeapons()
+{
+       weapons_definitions_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+       wxBoxSizer* column_1_sizer = new wxBoxSizer(wxVERTICAL);
+
+       wxBoxSizer* item_type_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+       std::vector<wxString> item_strings = DefaultNames::Instance()->GetArray(wxT("item"));
+       item_strings.insert(item_strings.begin(), _("None"));
+
+       item_type_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Item Type:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_item_type_choice = new wxChoice(main_panel, MENU_WEAPON_ITEM_TYPE, wxDefaultPosition, choiceSize, item_strings.size(), &item_strings[0]);
+       item_type_sizer->AddSpacer(10);
+       item_type_sizer->Add(weapon_item_type_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       column_1_sizer->Add(item_type_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* appearance_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Appearance"));
+       wxFlexGridSizer* appearance_grid_sizer = new wxFlexGridSizer(2);
+       appearance_grid_sizer->AddGrowableCol(0);
+       appearance_grid_sizer->SetHGap(10);
+       appearance_grid_sizer->SetVGap(4);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Graphic Collection:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_collection_field = new wxTextCtrl(main_panel, FIELD_WEAPON_COLLECTION);
+       appearance_grid_sizer->Add(weapon_collection_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Color Table:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_color_table_field = new wxTextCtrl(main_panel, FIELD_WEAPON_COLOR_TABLE);
+       appearance_grid_sizer->Add(weapon_color_table_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Idle:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_idle_field = new wxTextCtrl(main_panel, FIELD_WEAPON_IDLE);
+       appearance_grid_sizer->Add(weapon_idle_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Firing:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_firing_field = new wxTextCtrl(main_panel, FIELD_WEAPON_FIRING);
+       appearance_grid_sizer->Add(weapon_firing_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Reloading:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_reloading_field = new wxTextCtrl(main_panel, FIELD_WEAPON_RELOADING);
+       appearance_grid_sizer->Add(weapon_reloading_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charging:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_charging_field = new wxTextCtrl(main_panel, FIELD_WEAPON_CHARGING);
+       appearance_grid_sizer->Add(weapon_charging_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charged:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_charged_field = new wxTextCtrl(main_panel, FIELD_WEAPON_CHARGED);
+       appearance_grid_sizer->Add(weapon_charged_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_grid_sizer->AddSpacer(10);
+       appearance_grid_sizer->AddSpacer(10);
+
+       appearance_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Flash Intensity:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_flash_intensity_field = new wxTextCtrl(main_panel, FIELD_WEAPON_FLASH_INTENSITY);
+       appearance_grid_sizer->Add(weapon_flash_intensity_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       appearance_sizer->Add(appearance_grid_sizer, 0, wxEXPAND);
+
+       column_1_sizer->AddSpacer(10);
+       column_1_sizer->Add(appearance_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* timing_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Timing (all in ticks)"));
+       wxFlexGridSizer* timing_grid_sizer = new wxFlexGridSizer(2);
+       timing_grid_sizer->AddGrowableCol(0);
+       timing_grid_sizer->SetHGap(10);
+       timing_grid_sizer->SetVGap(4);
+
+       timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ready:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_ready_field = new wxTextCtrl(main_panel, FIELD_WEAPON_READY);
+       timing_grid_sizer->Add(weapon_ready_field, 0, wxALIGN_CENTER_VERTICAL); 
+
+       timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Await Reload:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_await_reload_field = new wxTextCtrl(main_panel, FIELD_WEAPON_AWAIT_RELOAD);
+       timing_grid_sizer->Add(weapon_await_reload_field, 0, wxALIGN_CENTER_VERTICAL);  
+
+       timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Loading:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_loading_field = new wxTextCtrl(main_panel, FIELD_WEAPON_LOADING);
+       timing_grid_sizer->Add(weapon_loading_field, 0, wxALIGN_CENTER_VERTICAL);       
+
+       timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Finish Loading:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_finish_loading_field = new wxTextCtrl(main_panel, FIELD_WEAPON_FINISH_LOADING);
+       timing_grid_sizer->Add(weapon_finish_loading_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       timing_grid_sizer->AddSpacer(10);
+       timing_grid_sizer->AddSpacer(10);
+
+       timing_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Flash Decay:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_flash_decay_field = new wxTextCtrl(main_panel, FIELD_WEAPON_FLASH_DECAY);
+       timing_grid_sizer->Add(weapon_flash_decay_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       timing_sizer->Add(timing_grid_sizer, 0, wxEXPAND);
+
+       column_1_sizer->AddSpacer(10);
+       column_1_sizer->Add(timing_sizer, 0, wxEXPAND);
+
+       weapons_definitions_sizer->Add(column_1_sizer);
+
+       wxBoxSizer* column_2_sizer = new wxBoxSizer(wxVERTICAL);
+
+       wxBoxSizer* weapon_class_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+       const wxString weapon_class_names[] = {
+               _("None"),
+               _("Melee"),
+               _("Single Function"),
+               _("Dual Function"),
+               _("Two-Fisted"),
+               _("Multipurpose")
+       };
+
+       weapon_class_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Weapon Class:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_class_choice = new wxChoice(main_panel, MENU_WEAPON_CLASS, wxDefaultPosition, choiceSize, 6, weapon_class_names);
+       weapon_class_sizer->AddSpacer(10);
+       weapon_class_sizer->Add(weapon_class_choice, 0, wxALIGN_CENTER_VERTICAL);
+
+       column_2_sizer->Add(weapon_class_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* height_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Height and Idle"));
+       wxFlexGridSizer* height_grid_sizer = new wxFlexGridSizer(2);
+       height_grid_sizer->AddGrowableCol(0);
+       height_grid_sizer->SetHGap(10);
+       height_grid_sizer->SetVGap(4);
+
+       height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Idle Height:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_idle_height_field = new wxTextCtrl(main_panel, FIELD_WEAPON_IDLE_HEIGHT);
+       height_grid_sizer->Add(weapon_idle_height_field, 0, wxALIGN_CENTER_VERTICAL);   
+
+       height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Bob Amplitude:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_bob_amplitude_field = new wxTextCtrl(main_panel, FIELD_WEAPON_BOB_AMPLITUDE);
+       height_grid_sizer->Add(weapon_bob_amplitude_field, 0, wxALIGN_CENTER_VERTICAL); 
+
+       height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Kick Height:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_kick_height_field = new wxTextCtrl(main_panel, FIELD_WEAPON_KICK_HEIGHT);
+       height_grid_sizer->Add(weapon_kick_height_field, 0, wxALIGN_CENTER_VERTICAL);   
+
+       height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Reload Height:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_reload_height_field = new wxTextCtrl(main_panel, FIELD_WEAPON_RELOAD_HEIGHT);
+       height_grid_sizer->Add(weapon_reload_height_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       height_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Idle Width:")), 0, wxALIGN_CENTER_VERTICAL);
+       weapon_idle_width_field = new wxTextCtrl(main_panel, FIELD_WEAPON_IDLE_WIDTH);
+       height_grid_sizer->Add(weapon_idle_width_field, 0, wxALIGN_CENTER_VERTICAL);
+
+       height_sizer->Add(height_grid_sizer, 0, wxEXPAND);
+       
+       column_2_sizer->AddSpacer(10);
+       column_2_sizer->Add(height_sizer, 0, wxEXPAND);
+
+       wxStaticBoxSizer* flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Flags"));
+       static const wxString flags_strings[] = {
+               _("Automatic"),
+               _("Disappears after use"),
+               _("Plays instant shell casing sound"),
+               _("Overloads"),
+               _("Random ammo on pickup"),
+               _("Reloads in one hand"),
+               _("Fires out of phase"),
+               _("Fires under liquids"),
+               _("Triggers share ammo"),
+               _("Angular flipping on 2nd trigger")
+       };
+
+       for (int i = 0; i < 10; ++i) {
+               weapon_flags_checkboxes[i] = new wxCheckBox(main_panel, CB_WEAPON_FLAGS + i, flags_strings[i]);
+               if (i > 0) {
+                       flags_sizer->Add(weapon_flags_checkboxes[i], 0, wxALIGN_CENTER_VERTICAL | wxTOP, 2);
+               } else {
+                       flags_sizer->Add(weapon_flags_checkboxes[i], 0, wxALIGN_CENTER_VERTICAL);
+               }
+       }
+
+       column_2_sizer->AddSpacer(10);
+       column_2_sizer->Add(flags_sizer, 0, wxEXPAND);
+
+       weapons_definitions_sizer->AddSpacer(10);
+       weapons_definitions_sizer->Add(column_2_sizer);
+
+       mainbox->Add(weapons_definitions_sizer, 5, wxALL, 10);
+       mainbox->Show(weapons_definitions_sizer, false);
+
+       weapons_triggers_sizer = new wxBoxSizer(wxVERTICAL);
+
+       static const wxString trigger_names[] = {
+               _("Main Trigger"),
+               _("Secondary Trigger")
+       };
+
+       std::vector<wxString> shot_strings = DefaultNames::Instance()->GetArray(wxT("shot"));
+       shot_strings.insert(shot_strings.begin(), _("None"));
+
+       std::vector<wxString> sound_strings = DefaultNames::Instance()->GetArray(wxT("sound"));
+       sound_strings.insert(sound_strings.begin(), _("None"));
+
+       for (int i = 0; i < 2; ++i) {
+               int id_offset = i * NUM_TRIGGER_IDS;
+               wxStaticBoxSizer* static_box_sizer = new wxStaticBoxSizer(wxHORIZONTAL, main_panel, trigger_names[i]);
+               wxBoxSizer* column_1_sizer = new wxBoxSizer(wxVERTICAL);
+
+               wxFlexGridSizer* left_grid_sizer = new wxFlexGridSizer(2);
+               left_grid_sizer->AddGrowableCol(0);
+               left_grid_sizer->SetHGap(10);
+               left_grid_sizer->SetVGap(4);
+
+               left_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Projectile:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_projectile_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_PROJECTILE + id_offset, wxDefaultPosition, choiceSize, shot_strings.size(), &shot_strings[0]);
+               left_grid_sizer->Add(trigger_projectile_choices[i]);
+
+               left_grid_sizer->AddSpacer(10);
+               left_grid_sizer->AddSpacer(10);
+
+               left_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Rounds/magazine:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_rounds_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_ROUNDS + id_offset);
+               left_grid_sizer->Add(trigger_rounds_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               column_1_sizer->Add(left_grid_sizer, 0, wxEXPAND);
+
+               wxStaticBoxSizer* sounds_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, _("Sounds"));
+               wxFlexGridSizer* sounds_grid_sizer = new wxFlexGridSizer(2);
+               sounds_grid_sizer->AddGrowableCol(0);
+               sounds_grid_sizer->SetHGap(10);
+               sounds_grid_sizer->SetVGap(4);
+
+               sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Firing:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_firing_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_FIRING + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+               sounds_grid_sizer->Add(trigger_firing_choices[i]);
+
+               sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Click:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_click_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_CLICK + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+               sounds_grid_sizer->Add(trigger_click_choices[i]);
+
+               sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charging:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_charging_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_CHARGING + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+               sounds_grid_sizer->Add(trigger_charging_choices[i]);
+
+               sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Shell Casing:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_shell_casing_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_SHELL_CASING + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+               sounds_grid_sizer->Add(trigger_shell_casing_choices[i]);
+
+               sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Reloading:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_reloading_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_RELOADING + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+               sounds_grid_sizer->Add(trigger_reloading_choices[i]);
+
+               sounds_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charged:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_charged_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_CHARGED + id_offset, wxDefaultPosition, choiceSize, sound_strings.size(), &sound_strings[0]);
+               sounds_grid_sizer->Add(trigger_charged_choices[i]);
+
+               sounds_sizer->Add(sounds_grid_sizer);
+
+               column_1_sizer->Add(sounds_sizer, 0, wxEXPAND | wxALL, 10);
+
+               static_box_sizer->Add(column_1_sizer, 0, wxEXPAND);
+
+               wxFlexGridSizer* right_grid_sizer = new wxFlexGridSizer(2);
+               right_grid_sizer->AddGrowableCol(0);
+               right_grid_sizer->SetHGap(10);
+               right_grid_sizer->SetVGap(4);
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ammo Type:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_ammo_type_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_AMMO_TYPE + id_offset, wxDefaultPosition, choiceSize, item_strings.size(), &item_strings[0]);
+               right_grid_sizer->Add(trigger_ammo_type_choices[i]);
+
+               right_grid_sizer->AddSpacer(10);
+               right_grid_sizer->AddSpacer(10);
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Ticks/round:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_ticks_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_TICKS + id_offset);
+               right_grid_sizer->Add(trigger_ticks_fields[i], 0, wxALIGN_CENTER_VERTICAL);             
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Recovery Ticks:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_recovery_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_RECOVERY + id_offset);
+               right_grid_sizer->Add(trigger_recovery_fields[i], 0, wxALIGN_CENTER_VERTICAL);          
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Charging Ticks:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_charging_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_CHARGING + id_offset);
+               right_grid_sizer->Add(trigger_charging_fields[i], 0, wxALIGN_CENTER_VERTICAL);          
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Recoil Magnitude:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_recoil_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_RECOIL + id_offset);
+               right_grid_sizer->Add(trigger_recoil_fields[i], 0, wxALIGN_CENTER_VERTICAL);            
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Theta Error:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_theta_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_THETA + id_offset);
+               right_grid_sizer->Add(trigger_theta_fields[i], 0, wxALIGN_CENTER_VERTICAL);             
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dx:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_dx_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_DX + id_offset);
+               right_grid_sizer->Add(trigger_dx_fields[i], 0, wxALIGN_CENTER_VERTICAL);                
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("dz:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_dz_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_DZ + id_offset);
+               right_grid_sizer->Add(trigger_dz_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Burst Count:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_burst_count_fields[i] = new wxTextCtrl(main_panel, FIELD_TRIGGER_BURST_COUNT + id_offset);
+               right_grid_sizer->Add(trigger_burst_count_fields[i], 0, wxALIGN_CENTER_VERTICAL);
+
+               right_grid_sizer->AddSpacer(10);
+               right_grid_sizer->AddSpacer(10);
+
+               static const wxString shell_casing_type_strings[] = {
+                       _("None"),
+                       _("Assault Rifle"),
+                       _("Pistol Center"),
+                       _("Pistol Left"),
+                       _("Pistol Right"),
+                       _("SMG")
+               };
+
+               right_grid_sizer->Add(new wxStaticText(main_panel, wxID_ANY, _("Shell casing type:")), 0, wxALIGN_CENTER_VERTICAL);
+               trigger_shell_casing_type_choices[i] = new wxChoice(main_panel, MENU_TRIGGER_SHELL_CASING_TYPE + id_offset, wxDefaultPosition, choiceSize, 6, shell_casing_type_strings);
+               right_grid_sizer->Add(trigger_shell_casing_type_choices[i]);            
+
+               static_box_sizer->AddSpacer(20);
+               static_box_sizer->Add(right_grid_sizer, 0, wxEXPAND);
+               
+               if (i == 1) {
+                       weapons_triggers_sizer->AddSpacer(10);
+               }
+
+               weapons_triggers_sizer->Add(static_box_sizer);
+       }
+
+       mainbox->Add(weapons_triggers_sizer, 5, wxALL, 10);
+       mainbox->Show(weapons_triggers_sizer, false);
+}
+
+bool PhysicsView::OnCreate(wxDocument* doc, long flags)
+{
+       wxString frameTitle = wxT("ShapeFusion : Physics : ");
+       frameTitle.Append(doc->GetFilename());
+
+       mFrame = wxGetApp().CreateChildFrame(doc, this, frameTitle, wxDefaultPosition, wxDefaultSize);
+
+       mainbox = new wxBoxSizer(wxHORIZONTAL);
+       main_panel = new wxPanel(mFrame);
+       main_panel->Show();
+       tree = new wxTreeCtrl(main_panel, -1, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT);
+       tree->DeleteAllItems();
+       wxTreeItemId treeroot = tree->AddRoot(doc->GetFilename());
+       mainbox->Add(tree, 2, wxEXPAND);
+
+       // empty space
+       dummy_sizer = new wxBoxSizer(wxVERTICAL);
+       wxPanel* dummy_panel = new wxPanel(main_panel);
+       dummy_sizer->Add(dummy_panel, 1, wxEXPAND);
+       mainbox->Add(dummy_sizer, 5);
+
+       CreateAliens();
+       CreateEffects();
+       CreatePhysicsConstants();
+       CreateShots();
+       CreateWeapons();
+
+       mainbox->Show(dummy_sizer, false);
+       mainbox->Show(weapons_triggers_sizer, true);
+
+       mainbox->Layout();
+       main_panel->SetSizer(mainbox);
+       mainbox->SetSizeHints(mFrame);
+       mainbox->Fit(mFrame);
+
+       menubar = mFrame->GetMenuBar();
+
+       mainbox->Show(dummy_sizer, true);
+       mainbox->Show(weapons_triggers_sizer, false);
+
+       // because we changed size
+       mFrame->Centre(wxBOTH);
+
+       mFrame->Show(true);
+       Activate(true);
+
+       return true;
+}
+
+void PhysicsView::OnUpdate(wxView*, wxObject*)
+{
+       wxTreeItemId aliens = tree->AppendItem(tree->GetRootItem(), _("Aliens"), -1, -1, new PhysicsTreeItemData());
+       unsigned int monster_count = static_cast<PhysicsDocument*>(GetDocument())->MonsterCount();
+       for (unsigned int i = 0; i < monster_count; ++i) {
+               wxTreeItemId alien = tree->AppendItem(aliens, GetName(wxT("alien"), i), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS));
+               
+               tree->AppendItem(alien, _("Appearance and Sounds"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_APPEARANCE));
+               tree->AppendItem(alien, _("Combat Settings"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_COMBAT));
+               tree->AppendItem(alien, _("Physical Constants"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_CONSTANTS));
+               tree->AppendItem(alien, _("Behavior Settings"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_BEHAVIOR));
+               tree->AppendItem(alien, _("Immunities and Weaknesses"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_MONSTERS_IMMUNITIES));
+       }
+
+       wxTreeItemId effects = tree->AppendItem(tree->GetRootItem(), _("Effects"), -1, -1, new PhysicsTreeItemData());
+       unsigned int effect_count = static_cast<PhysicsDocument*>(GetDocument())->EffectCount();
+       for (unsigned int i = 0; i < effect_count; ++i) {
+               tree->AppendItem(effects, GetName(wxT("effect"), i), -1, -1, new PhysicsTreeItemData(i, TREESECTION_EFFECTS));
+       }
+
+       wxTreeItemId shots = tree->AppendItem(tree->GetRootItem(), _("Shots"), -1, -1, new PhysicsTreeItemData());
+       unsigned int projectile_count = static_cast<PhysicsDocument*>(GetDocument())->ProjectileCount();
+       for (unsigned int i = 0; i < projectile_count; ++i) {
+               tree->AppendItem(shots, GetName(wxT("shot"), i), -1 ,-1, new PhysicsTreeItemData(i, TREESECTION_PROJECTILES));
+       }
+
+       wxTreeItemId physics = tree->AppendItem(tree->GetRootItem(), _("Physics"), -1, -1, new PhysicsTreeItemData());
+       tree->AppendItem(physics, _("Walking"), -1, -1, new PhysicsTreeItemData(0, TREESECTION_PHYSICS));
+       tree->AppendItem(physics, _("Running"), -1, -1, new PhysicsTreeItemData(1, TREESECTION_PHYSICS));
+
+       wxTreeItemId weapons = tree->AppendItem(tree->GetRootItem(), _("Weapons"), -1, -1, new PhysicsTreeItemData());
+       unsigned int weapon_count = static_cast<PhysicsDocument*>(GetDocument())->WeaponCount();
+       for (unsigned i = 0; i < weapon_count; ++i) {
+               wxTreeItemId weapon = tree->AppendItem(weapons, GetName(wxT("weapon"), i), -1, -1, new PhysicsTreeItemData(i, TREESECTION_WEAPONS));
+               
+               tree->AppendItem(weapon, _("Weapon Definition"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_WEAPONS_SETTINGS));
+               tree->AppendItem(weapon, _("Trigger Settings"), -1, -1, new PhysicsTreeItemData(i, TREESECTION_WEAPONS_TRIGGERS));
+       }
+}
+
+void PhysicsView::OnDraw(wxDC* dc)
+{
+}
+
+bool PhysicsView::OnClose(bool deleteWindow)
+{
+       if (!GetDocument()->Close())
+               return false;
+       Activate(false);
+       if (deleteWindow) {
+               delete mFrame;
+               return true;
+       }
+       return true;
+}
+
diff --git a/Physics/PhysicsView.h b/Physics/PhysicsView.h
new file mode 100644 (file)
index 0000000..d772d7a
--- /dev/null
@@ -0,0 +1,515 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __PHYSICSVIEW_H__
+#define __PHYSICSVIEW_H__
+
+#include "wx/docview.h"
+#include "wx/treectrl.h"
+#include "PhysicsDocument.h"
+#include "../ShapeFusionApp.h"
+
+class PhysicsView : public wxView
+{
+       DECLARE_DYNAMIC_CLASS(PhysicsView)
+
+private:
+       enum {
+               FIELD_ALIEN_COLLECTION,
+               FIELD_ALIEN_COLOR_TABLE,
+               FIELD_ALIEN_HIT,
+               FIELD_ALIEN_HARD_DYING,
+               FIELD_ALIEN_SOFT_DYING,
+               FIELD_ALIEN_HARD_DEAD,
+               FIELD_ALIEN_SOFT_DEAD,
+               FIELD_ALIEN_STATIONARY,
+               FIELD_ALIEN_MOVING,
+               FIELD_ALIEN_TELEPORT_IN,
+               FIELD_ALIEN_TELEPORT_OUT,
+               FIELD_ALIEN_MELEE_ATTACK_SHAPE,
+               FIELD_ALIEN_RANGED_ATTACK_SHAPE,
+
+               MENU_ALIEN_ACTIVATION,
+               MENU_ALIEN_FRIENDLY_ACTIVATION,
+               MENU_ALIEN_CLEAR,
+               MENU_ALIEN_KILL,
+               MENU_ALIEN_APOLOGY,
+               MENU_ALIEN_FRIENDLY_FIRE,
+               MENU_ALIEN_FLAMING,
+               MENU_ALIEN_RANDOM,
+
+               FIELD_ALIEN_RANDOM_SOUND_MASK,
+               FIELD_ALIEN_SOUND_PITCH,
+
+               FIELD_ALIEN_ATTACK_FREQUENCY,
+
+               MENU_ALIEN_ATTACK_TYPE,
+               FIELD_ALIEN_ATTACK_REPETITIONS,
+               FIELD_ALIEN_ATTACK_ERROR,
+               FIELD_ALIEN_ATTACK_RANGE,
+               FIELD_ALIEN_ATTACK_SEQUENCE,
+               FIELD_ALIEN_ATTACK_DX,
+               FIELD_ALIEN_ATTACK_DY,
+               FIELD_ALIEN_ATTACK_DZ,
+               NUM_ALIEN_ATTACK_CONTROLS = 8,
+
+               FIELD_ALIEN_SHRAPNEL_RADIUS = MENU_ALIEN_ATTACK_TYPE + NUM_ALIEN_ATTACK_CONTROLS * 2,
+               MENU_ALIEN_SHRAPNEL_DAMAGE_TYPE,
+               FIELD_ALIEN_SHRAPNEL_BASE_DAMAGE,
+               FIELD_ALIEN_SHRAPNEL_RANDOM_DAMAGE,
+               FIELD_ALIEN_SHRAPNEL_DAMAGE_SCALE,
+               CB_ALIEN_SHRAPNEL_ALIEN_DAMAGE,
+
+               MENU_ALIEN_RANGED_IMPACT_EFFECT,
+               MENU_ALIEN_MELEE_IMPACT_EFFECT,
+
+               FIELD_ALIEN_VITALITY,
+               FIELD_ALIEN_RADIUS,
+               FIELD_ALIEN_HEIGHT,
+
+               FIELD_ALIEN_SPEED,
+               FIELD_ALIEN_TERMINAL_VELOCITY,
+               FIELD_ALIEN_GRAVITY,
+
+               FIELD_ALIEN_MIN_LEDGE_JUMP,
+               FIELD_ALIEN_MAX_LEDGE_JUMP,
+               FIELD_ALIEN_EXT_VELOCITY_SCALE,
+               FIELD_ALIEN_HOVER_HEIGHT,
+               FIELD_ALIEN_DOOR_RETRY_MASK,
+       
+               FIELD_ALIEN_VISUAL_RANGE,
+               FIELD_ALIEN_DARK_VISUAL_RANGE,
+               FIELD_ALIEN_INTELLIGENCE,
+               
+               MENU_ALIEN_CARRYING_ITEM,
+               MENU_ALIEN_CONTRAIL_EFFECT,
+
+               MENU_ALIEN_CLASS,
+               CB_ALIEN_FRIENDS,
+               CB_ALIEN_ENEMIES = CB_ALIEN_FRIENDS + 16,
+               CB_ALIEN_FLAGS = CB_ALIEN_ENEMIES + 16,
+               CB_ALIEN_IMMUNITIES = CB_ALIEN_FLAGS + 27,
+               CB_ALIEN_WEAKNESSES = CB_ALIEN_IMMUNITIES + 24,
+
+               FIELD_EFFECT_COLLECTION = CB_ALIEN_WEAKNESSES + 24,
+               FIELD_EFFECT_COLOR_TABLE,
+               FIELD_EFFECT_SEQUENCE,
+               FIELD_EFFECT_PITCH,
+               MENU_EFFECT_DELAY_SOUND,
+               CB_EFFECT_END_WHEN_ANIMATION_LOOPS,
+               CB_EFFECT_END_WHEN_TRANSFER_ANIMATION_LOOPS,
+               CB_EFFECT_SOUND_ONLY,
+               CB_EFFECT_MEDIA_EFFECT,
+
+               CB_SHOT_FLAGS,
+               CB_SHOT_ALIEN_DAMAGE = CB_SHOT_FLAGS + 22,
+
+               FIELD_SHOT_COLLECTION,
+               FIELD_SHOT_COLOR_TABLE,
+               FIELD_SHOT_SEQUENCE,
+               FIELD_SHOT_DAMAGE_BASE,
+               FIELD_SHOT_DAMAGE_RANDOM,
+               FIELD_SHOT_RADIUS,
+               FIELD_SHOT_AREA_OF_EFFECT,
+               FIELD_SHOT_SPEED,
+               FIELD_SHOT_RANGE,
+               FIELD_SHOT_CONTRAIL_TICKS,
+               FIELD_SHOT_MAXIMUM_CONTRAILS,
+               
+               FIELD_SHOT_DAMAGE_SCALE,
+               FIELD_SHOT_SOUND_PITCH,
+
+               MENU_SHOT_DAMAGE_TYPE,
+               MENU_SHOT_FLYBY_SOUND,
+               MENU_SHOT_REBOUND_SOUND,
+               MENU_SHOT_DETONATION_EFFECT,
+               MENU_SHOT_MEDIA_DETONATION_EFFECT,
+               MENU_SHOT_CONTRAIL,
+               MENU_SHOT_MEDIA_IMPACT,
+
+               FIELD_MAX_FORWARD_VELOCITY,
+               FIELD_MAX_BACKWARD_VELOCITY,
+               FIELD_MAX_PERPENDICULAR_VELOCITY,
+
+               FIELD_ACCELERATION,
+               FIELD_DECELERATION,
+               FIELD_AIRBORNE_DECELERATION,
+               FIELD_GRAVITATIONAL_ACCELERATION,
+               FIELD_CLIMBING_ACCELERATION,
+               FIELD_TERMINAL_VELOCITY,
+               FIELD_EXTERNAL_DECELERATION,
+
+               FIELD_STEP_DELTA,
+               FIELD_STEP_AMPLITUDE,
+
+               FIELD_RADIUS,
+               FIELD_HEIGHT,
+
+               FIELD_ANGULAR_ACCELERATION,
+               FIELD_ANGULAR_DECELERATION,
+               FIELD_MAXIMUM_ANGULAR_VELOCITY,
+               FIELD_ANGULAR_RECENTERING_VELOCITY,
+               FIELD_HEAD_ANGULAR_VELOCITY,
+               FIELD_HEAD_ANGULAR_MAXIMUM,
+               FIELD_MAXIMUM_ELEVATION,
+               FIELD_EXTERNAL_ANGULAR_DECELERATION,
+
+               FIELD_DEAD_HEIGHT,
+               FIELD_CAMERA_HEIGHT,
+               FIELD_SPLASH_HEIGHT,
+               FIELD_HALF_CAMERA_SEPARATION,
+
+               CB_WEAPON_FLAGS,
+
+               FIELD_WEAPON_COLLECTION = CB_WEAPON_FLAGS + 10,
+               FIELD_WEAPON_COLOR_TABLE,
+               FIELD_WEAPON_IDLE,
+               FIELD_WEAPON_FIRING,
+               FIELD_WEAPON_RELOADING,
+               FIELD_WEAPON_CHARGING,
+               FIELD_WEAPON_CHARGED,
+               FIELD_WEAPON_READY,
+               FIELD_WEAPON_AWAIT_RELOAD,
+               FIELD_WEAPON_LOADING,
+               FIELD_WEAPON_FINISH_LOADING,
+               FIELD_WEAPON_FLASH_DECAY,
+
+               FIELD_WEAPON_FLASH_INTENSITY,
+               FIELD_WEAPON_IDLE_HEIGHT,
+               FIELD_WEAPON_BOB_AMPLITUDE,
+               FIELD_WEAPON_KICK_HEIGHT,
+               FIELD_WEAPON_RELOAD_HEIGHT,
+               FIELD_WEAPON_IDLE_WIDTH,
+               
+               MENU_WEAPON_ITEM_TYPE,
+               MENU_WEAPON_CLASS,
+
+               FIELD_TRIGGER_ROUNDS,
+               FIELD_TRIGGER_TICKS,
+               FIELD_TRIGGER_RECOVERY,
+               FIELD_TRIGGER_CHARGING,
+               FIELD_TRIGGER_RECOIL,
+               FIELD_TRIGGER_THETA,
+               FIELD_TRIGGER_DX,
+               FIELD_TRIGGER_DZ,
+               FIELD_TRIGGER_BURST_COUNT,
+               MENU_TRIGGER_PROJECTILE,
+               MENU_TRIGGER_AMMO_TYPE,
+               MENU_TRIGGER_FIRING,
+               MENU_TRIGGER_CLICK,
+               MENU_TRIGGER_CHARGING,
+               MENU_TRIGGER_SHELL_CASING,
+               MENU_TRIGGER_RELOADING,
+               MENU_TRIGGER_CHARGED,
+               MENU_TRIGGER_SHELL_CASING_TYPE,
+               NUM_TRIGGER_IDS = 18,
+               LAST_TRIGGER_ID = MENU_TRIGGER_SHELL_CASING_TYPE + NUM_TRIGGER_IDS,
+       };
+
+       wxBoxSizer* mainbox;
+       wxPanel* main_panel;
+       wxMenuBar* menubar;
+       wxTreeCtrl* tree;
+       wxBoxSizer* dummy_sizer;
+
+       wxBoxSizer* aliens_appearance_sizer;
+
+       wxTextCtrl* alien_collection_field;
+       wxTextCtrl* alien_color_table_field;
+       wxTextCtrl* alien_hit_field;
+       wxTextCtrl* alien_hard_dying_field;
+       wxTextCtrl* alien_soft_dying_field;
+       wxTextCtrl* alien_hard_dead_field;
+       wxTextCtrl* alien_soft_dead_field;
+       wxTextCtrl* alien_stationary_field;
+       wxTextCtrl* alien_moving_field;
+       wxTextCtrl* alien_teleport_in_field;
+       wxTextCtrl* alien_teleport_out_field;
+       wxTextCtrl* alien_melee_attack_shape_field;
+       wxTextCtrl* alien_ranged_attack_shape_field;
+
+       wxChoice* alien_activation_choice;
+       wxChoice* alien_friendly_activation_choice;
+       wxChoice* alien_clear_choice;
+       wxChoice* alien_kill_choice;
+       wxChoice* alien_apology_choice;
+       wxChoice* alien_friendly_fire_choice;
+       wxChoice* alien_flaming_choice;
+       wxChoice* alien_random_choice;
+
+       wxTextCtrl* alien_random_sound_mask_field;
+       wxTextCtrl* alien_sound_pitch_field;
+       
+       wxBoxSizer* aliens_combat_sizer;
+
+       wxTextCtrl* alien_attack_frequency_field;
+
+       wxChoice* alien_attack_type_choices[2];
+       wxTextCtrl* alien_attack_repetitions_fields[2];
+       wxTextCtrl* alien_attack_error_fields[2];
+       wxTextCtrl* alien_attack_range_fields[2];
+       wxTextCtrl* alien_attack_sequence_fields[2];
+       wxTextCtrl* alien_attack_dx_fields[2];
+       wxTextCtrl* alien_attack_dy_fields[2];
+       wxTextCtrl* alien_attack_dz_fields[2];
+
+       wxTextCtrl* alien_shrapnel_radius_field;
+       wxChoice* alien_shrapnel_damage_type_choice;
+       wxTextCtrl* alien_shrapnel_base_damage_field;
+       wxTextCtrl* alien_shrapnel_random_damage_field;
+       wxTextCtrl* alien_shrapnel_damage_scale_field;
+       wxCheckBox* alien_shrapnel_alien_damage_checkbox;
+
+       wxChoice* alien_ranged_impact_effect_choice;
+       wxChoice* alien_melee_impact_effect_choice;
+
+       wxBoxSizer* aliens_constants_sizer;
+
+       wxTextCtrl* alien_vitality_field;
+       wxTextCtrl* alien_radius_field;
+       wxTextCtrl* alien_height_field;
+
+       wxTextCtrl* alien_speed_field;
+       wxTextCtrl* alien_terminal_velocity_field;
+       wxTextCtrl* alien_gravity_field;
+
+       wxTextCtrl* alien_min_ledge_jump_field;
+       wxTextCtrl* alien_max_ledge_jump_field;
+       wxTextCtrl* alien_ext_velocity_scale_field;
+       wxTextCtrl* alien_hover_height_field;
+       wxTextCtrl* alien_door_retry_mask_field;
+       
+       wxTextCtrl* alien_visual_range_field;
+       wxTextCtrl* alien_dark_visual_range_field;
+       wxTextCtrl* alien_intelligence_field;
+       
+       wxChoice* alien_carrying_item_choice;
+       wxChoice* alien_contrail_effect_choice;
+
+       wxBoxSizer* aliens_behavior_sizer;
+
+       wxChoice* alien_class_choice;
+
+       wxCheckBox* alien_friends_checkboxes[16];
+       wxCheckBox* alien_enemies_checkboxes[16];
+       wxCheckBox* alien_flags_checkboxes[27];
+
+       wxBoxSizer* aliens_immunities_sizer;
+
+       wxCheckBox* alien_immunities_checkboxes[24];
+       wxCheckBox* alien_weaknesses_checkboxes[24];
+       
+       wxBoxSizer* effects_sizer;
+
+       wxTextCtrl* eff_collection_field;
+       wxTextCtrl* eff_color_table_field;
+       wxTextCtrl* eff_sequence_field;
+       wxTextCtrl* eff_pitch_field;
+
+       wxTextCtrl* eff_delay_field;
+
+       wxChoice* eff_delay_sound_choice;
+
+       wxCheckBox* eff_end_when_animation_loops_checkbox;
+       wxCheckBox* eff_end_when_transfer_animation_loops_checkbox;
+       wxCheckBox* eff_sound_only_checkbox;
+       wxCheckBox* eff_media_effect_checkbox;
+
+       wxFlexGridSizer* physics_sizer;
+
+       wxTextCtrl* max_forward_velocity_field;
+       wxTextCtrl* max_backward_velocity_field;
+       wxTextCtrl* max_perpendicular_velocity_field;
+
+       wxTextCtrl* acceleration_field;
+       wxTextCtrl* deceleration_field;
+       wxTextCtrl* airborne_deceleration_field;
+       wxTextCtrl* gravitational_acceleration_field;
+       wxTextCtrl* climbing_acceleration_field;
+       wxTextCtrl* terminal_velocity_field;
+       wxTextCtrl* external_deceleration_field;
+
+       wxTextCtrl* step_delta_field;
+       wxTextCtrl* step_amplitude_field;
+
+       wxTextCtrl* radius_field;
+       wxTextCtrl* height_field;
+
+       wxTextCtrl* angular_acceleration_field;
+       wxTextCtrl* angular_deceleration_field;
+       wxTextCtrl* maximum_angular_velocity_field;
+       wxTextCtrl* angular_recentering_velocity_field;
+       wxTextCtrl* head_angular_velocity_field;
+       wxTextCtrl* head_angular_maximum_field;
+       wxTextCtrl* maximum_elevation_field;
+       wxTextCtrl* external_angular_deceleration_field;
+
+       wxTextCtrl* dead_height_field;
+       wxTextCtrl* camera_height_field;
+       wxTextCtrl* splash_height_field;
+       wxTextCtrl* half_camera_separation_field;
+
+       wxBoxSizer* shots_sizer;
+
+       wxTextCtrl* shots_collection_field;
+       wxTextCtrl* shots_color_table_field;
+       wxTextCtrl* shots_sequence_field;
+
+       wxChoice* shots_damage_type_choice;
+       wxTextCtrl* shots_damage_base_field;
+       wxTextCtrl* shots_damage_random_field;
+       wxTextCtrl* shots_damage_scale_field;
+       wxCheckBox* shots_alien_damage_checkbox;
+
+       wxChoice* shots_flyby_sound_choice;
+       wxChoice* shots_rebound_sound_choice;
+       wxTextCtrl* shots_sound_pitch_field;
+       wxTextCtrl* shots_radius_field;
+       wxTextCtrl* shots_area_of_effect_field;
+       wxTextCtrl* shots_speed_field;
+       wxTextCtrl* shots_range_field;
+       wxChoice* shots_detonation_effect_choice;
+       wxChoice* shots_media_detonation_effect_choice;
+       wxChoice* shots_contrail_choice;
+       wxTextCtrl* shots_contrail_ticks_field;
+       wxTextCtrl* shots_maximum_contrails_field;
+
+       wxCheckBox* shots_flags_checkboxes[22];
+
+       wxChoice* shots_media_impact_choice;
+
+       wxBoxSizer* weapons_definitions_sizer;
+
+       wxChoice* weapon_item_type_choice;
+
+       wxTextCtrl* weapon_collection_field;
+       wxTextCtrl* weapon_color_table_field;
+       wxTextCtrl* weapon_idle_field;
+       wxTextCtrl* weapon_firing_field;
+       wxTextCtrl* weapon_reloading_field;
+       wxTextCtrl* weapon_charging_field;
+       wxTextCtrl* weapon_charged_field;
+       wxTextCtrl* weapon_flash_intensity_field;
+
+       wxTextCtrl* weapon_ready_field;
+       wxTextCtrl* weapon_await_reload_field;
+       wxTextCtrl* weapon_loading_field;
+       wxTextCtrl* weapon_finish_loading_field;
+       wxTextCtrl* weapon_flash_decay_field;
+
+       wxChoice* weapon_class_choice;
+
+       wxTextCtrl* weapon_idle_height_field;
+       wxTextCtrl* weapon_bob_amplitude_field;
+       wxTextCtrl* weapon_kick_height_field;
+       wxTextCtrl* weapon_reload_height_field;
+       wxTextCtrl* weapon_idle_width_field;
+
+       wxCheckBox* weapon_flags_checkboxes[10];
+
+       wxBoxSizer* weapons_triggers_sizer;
+
+       wxChoice* trigger_projectile_choices[2];
+       wxTextCtrl* trigger_rounds_fields[2];
+       wxChoice* trigger_ammo_type_choices[2];
+
+       wxChoice* trigger_firing_choices[2];
+       wxChoice* trigger_click_choices[2];
+       wxChoice* trigger_charging_choices[2];
+       wxChoice* trigger_shell_casing_choices[2];
+       wxChoice* trigger_reloading_choices[2];
+       wxChoice* trigger_charged_choices[2];
+       
+       wxTextCtrl* trigger_ticks_fields[2];
+       wxTextCtrl* trigger_recovery_fields[2];
+       wxTextCtrl* trigger_charging_fields[2];
+       wxTextCtrl* trigger_recoil_fields[2];
+       wxTextCtrl* trigger_theta_fields[2];
+       wxTextCtrl* trigger_dx_fields[2];
+       wxTextCtrl* trigger_dz_fields[2];
+       wxTextCtrl* trigger_burst_count_fields[2];
+       
+       wxChoice* trigger_shell_casing_type_choices[2];
+       
+protected:
+       DECLARE_EVENT_TABLE();
+
+public:
+       PhysicsView() { }
+       ~PhysicsView(){ }
+
+       bool OnCreate(wxDocument* doc, long flags);
+       void OnDraw(wxDC* dc);
+       void OnUpdate(wxView* sender, wxObject* hint = (wxObject *) NULL);
+       bool OnClose(bool deletewindow = false);
+       
+       // control callbacks
+       void OnTreeSelect(wxTreeEvent& e);
+
+private:
+       void CreateAliens();
+       void CreateEffects();
+       void CreatePhysicsConstants();
+       void CreateShots();
+       void CreateWeapons();
+
+       void OnSelectAlienAppearance(int index);
+       void OnSelectAlienCombat(int index);
+       void OnSelectAlienConstants(int index);
+       void OnSelectAlienBehavior(int index);
+       void OnSelectAlienImmunities(int index);
+       void OnSelectPhysicsConstants(int index);
+       void OnSelectEffect(int index);
+       void OnSelectShot(int index);
+       void OnSelectWeaponDefinition(int index);
+       void OnSelectWeaponTriggers(int index);
+
+       short GetSelection(); // index of current tree selection
+
+       void MenuEditCopy(wxCommandEvent&);
+       void MenuEditPaste(wxCommandEvent&);
+
+       void EditAlienCheckboxes(wxCommandEvent& e);
+       void EditAlienDoubles(wxCommandEvent& e);
+       void EditAlienFields(wxCommandEvent& e);
+       void EditAlienMenus(wxCommandEvent& e);
+
+       void EditEffectCheckboxes(wxCommandEvent& e);
+       void EditEffectFields(wxCommandEvent& e);
+       void EditEffectDoubles(wxCommandEvent& e);
+       void EditEffectMenus(wxCommandEvent& e);
+
+       void EditShotCheckboxes(wxCommandEvent& e);
+       void EditShotFields(wxCommandEvent& e);
+       void EditShotDoubles(wxCommandEvent& e);
+       void EditShotMenus(wxCommandEvent& e);
+
+       void EditPhysicsConstants(wxCommandEvent& e);
+
+       void EditWeaponCheckboxes(wxCommandEvent& e);
+       void EditWeaponFields(wxCommandEvent& e);
+       void EditWeaponDoubles(wxCommandEvent& e);
+       void EditWeaponMenus(wxCommandEvent& e);
+
+       void EditTriggerFields(wxCommandEvent& e);
+       void EditTriggerMenus(wxCommandEvent& e);
+
+       wxFrame* mFrame;
+};
+
+#endif
diff --git a/README.txt b/README.txt
new file mode 100644 (file)
index 0000000..86ba6c3
--- /dev/null
@@ -0,0 +1,218 @@
+ShapeFusion 0.5
+http://shapefusion.sourceforge.net
+
+An editor for Marathon II, Marathon Infinity and AlephOne scenarios
+
+Copyright 2000-2008 Tito Dal Canton and Etienne Samson
+
+
+What is ShapeFusion?
+--------------------
+ShapeFusion is a scenario editor for the AlephOne game engine, also
+compatible with Bungie's original Marathon II and Marathon Infinity engines.
+An AlephOne scenario is made of several files; ShapeFusion is devoted to
+editing the "Shapes" file, which stores most of the scenario graphics and
+animation data. It's *not* a tool for editing maps. In case you ever used
+Bungie tools for editing Marathon scenarios, it's enough to say that
+ShapeFusion is meant as a replacement for Anvil, or better for its Shapes
+editor. Such a replacement is mainly needed because Anvil is proprietary,
+non-free and Mac-only software, which makes it very difficult to use on
+modern platforms. Thanks to Etienne Samson, since version 0.4 ShapeFusion
+can open Sounds files too; the Sounds editor is in progress and I hope it will
+reach the level of the Shapes counterpart soon.
+
+As for the license, ShapeFusion is free software, released under the terms of
+the GNU General Public License. For more information see the COPYING file
+that comes with ShapeFusion.
+
+Supported platforms
+-------------------
+ShapeFusion is being developed on Linux and continuously tested on Linux,
+MacOS X and Windows. Thanks to wxWidgets it should compile and work on other
+systems too, but I've never tried it. ShapeFusion could *in theory* compile
+and work also on MacOS Classic, but I have no plans on this side. If you build
+ShapeFusion on systems different from Linux, MacOS X and Windows, please let
+me know (screenshots and binary builds are appreciated!).
+
+Building
+--------
+You'll need wxWidgets (at least version 2.8.x) to compile ShapeFusion.
+
+On Linux systems you can test the presence of wxWidgets by running the command
+'wx-config --version'. If that command is available and gives you the right
+version, everything should work; otherwise install wxWidgets following your
+Linux distribution rules. To compile ShapeFusion, just run the following inside
+the source directory:
+
+  ./configure
+  make
+
+When compilation is complete, simply run the 'shapefusion'
+executable (you can put it anywhere in your PATH). I finally suggest you place
+the attached DefaultNames.txt file in the /usr/local/share/shapefusion
+directory, so that collections and sounds will get Infinity-like names.
+
+On MacOS X you should be able to use the provided Xcode project
+(ShapeFusion.xcodeproj). You'll need both the MacOS X developer tools and
+wxWidgets (which will take some time to build). Once in the ShapeFusion
+Xcode project, before building you must change the WX_SRC_ROOT variable to
+point to your wxWidgets source directory. Note that MacOS X binary builds are
+released together with each source release: they should work out-of-the-box
+without the need to install anything else. In case you're wondering why they
+are so large in size, it is because they carry the whole wxWidgets library
+together with ShapeFusion itself.
+
+Overview of the Shapes editor window
+------------------------------------
+When you open a Shapes file, the window shows its collection slots on the left.
+In standard Marathon Shapes there are always 32 of them; however, ShapeFusion
+tries to be flexible and can open "extended" Shapes files with more collections,
+like Damage Inc ones. Collection names are read from the DefaultNames.txt file
+if it is available, otherwise they are set to simple numbers. Each collection
+slot can be opened revealing two sub-slots, the 8 bit and true color versions.
+They represent two independent versions of the same collection: the first will
+be used if the game is played on low-color displays, the second is for modern
+high-color displays (including the OpenGL mode in AlephOne). Each sub-slot can
+finally be opened to reveal its real content: bitmaps, color tables, frames and
+sequences. The contrast with Anvil is clear. Anvil tries to obfuscate some
+aspects of the Shapes file organization, but I feel that this creates a lot of
+confusion in the user. In my opinion, it makes more sense to treat Shapes files
+as they really are: archives of collections. The ShapeFusion window tries to
+reflect this idea.
+
+Bitmaps, color tables and frames are displayed as lists of preview thumbnails.
+Selecting one of them will pop up an edit panel for that item. Sequences are
+listed by their name since they can't be easily represented with thumbnails;
+however, selecting a sequence will pop up an edit panel like for other items.
+
+The logic behind ShapeFusion is that each collection is made of four sets of
+entities: color tables, bitmaps, frames and sequences. If you follow this
+order, entities coming after reference entities coming before: a sequence
+references a set of frames, a frame references a bitmap, a bitmap naturally
+references a color table since it's indexed. So editing a sequence involves
+picking frames from the collection frame set, and editing a frame involves
+selecting a bitmap from the collection bitmap set. Get it? ;-) Of course you
+don't have to follow this flow, especially if you are only adjusting some
+settings.
+
+The View menu contains display settings such as thumbnail size. Nothing here
+affects what's inside the Shapes file.
+
+You may edit the DefaultNames.txt file at your will to provide collection and
+sound names that are more suited to your scenario. The syntax should be pretty
+self-explanatory. Under Linux/Unix this file should go into
+/usr/local/share/shapefusion; under MacOS X it should be embedded into the
+application package (Contents/Resources); under Windows it should sit next to
+the ShapeFusion executable.
+
+Overview of the Sounds editor window
+------------------------------------
+TODO
+
+Notes
+-----
+Please be careful when editing your scenario with ShapeFusion. We had no big
+problems so far, but it's still under development and it may corrupt your
+files, so be sure to keep backup copies. You should not use versions before
+0.3, as they are affected by a bug regarding frames minimum light intensity
+value. If you think your files got corrupted by ShapeFusion, please let us
+know what happened.
+
+Object indexes start from 0, not 1. So if you have 12 bitmaps, the first is
+bitmap 0 (not 1) and the last is bitmap 11 (not 12).
+
+Bitmaps are exported as 8-bit Windows bitmap (.bmp) files. They get the color
+table that is currently used for viewing, as selected in the View menu.
+
+When you import a bitmap, ShapeFusion tries to map its colors to the collection
+color table as best as it can. Although the algorithm often yields good results,
+you can help it a lot by converting the bitmap to indexed before (using
+PhotoShop or Gimp, for example) so that it contains just colors belonging to
+the collection color table.
+
+In ShapeFusion, a frame can be referenced by many sequences. This may sound
+strange at first, but in Shapes file format logic it's perfectly legal and I
+think it makes sense too. However it can create a bit of confusion if you
+forget it. Keep in mind that a famous Anvil bug is based on this very
+confusion. But in Anvil it's a bug, in ShapeFusion it's a feature ;-)
+
+If you open an "original" Shapes file (e.g. from Marathon II) and then save it
+without touching anything, it won't probably have exactly the same size. In
+other words, it won't be exactly the same file. However I've never been able
+to tell the difference, apart from looking at the size. The original engines,
+AlephOne and ShapeFusion itself seem to behave perfectly with both files. The
+size mismatch has probably to do with data structure alignments: ShapeFusion
+ignores alignments when writing files, it just packs structure after structure
+and so produces generally smaller files.
+
+Shapes files are known to rarely contain strange data, like negative sequence
+ticks_per_frame. Maybe this comes from some broken Shapes editor, but it could
+be just Anvil. ShapeFusion doesn't handle this invalid data very well, but I
+plan to implement some consistency checks in the future.
+
+Feedback
+--------
+You can send screenshots, bug reports and any comment to tito(at)dalcanton.it.
+Better yet, you can join the ShapeFusion development mailing list
+(see http://www.sourceforge.net/projects/shapefusion for details) and report
+things there.
+
+History
+-------
+ShapeFusion was born in 2000 as a MacOS Classic application. Working releases
+were produced, but then I moved to other projects and the development ended
+while ShapeFusion was still far from being a complete editor.
+
+With the death of the Classic platform and the spread of AlephOne on different
+operating systems I became more and more attracted by the idea of porting
+ShapeFusion to other systems too. This couldn't be done easily with the
+original MacOS code, so eventually I started to rewrite everything using the
+portable wxWidgets toolkit. I also had the opportunity to rework the user
+interface, since I never liked the Anvil approach that I was trying to follow
+in the original ShapeFusion. Etienne joined the project at this stage.
+
+The new editor is not yet complete, but it's a great improvement at least on
+the technical side (stability, code organization, portability). Adding new
+features and fixing existing ones will be much easier with respect to the old
+version.
+
+Changelog
+---------
+0.5
+       Collection and sound names are now read from a simple external text file.
+       First release supporting Windows officially.
+       ShapeFusion now requires at least wxWidgets 2.8.x.
+       Fixed a bug that prevented opening shapes files on Windows.
+       Fixed a file I/O bug that prevented BMP exporting on Windows.
+       Code cleanup and minor fixes.
+
+0.4
+       Switched to multidocument wxWidgets framework (major code rewrite).
+       Implemented a preliminary Sounds editor.
+       Implemented the color table editor.
+       Improved the color quantization algorithm used when importing bitmaps.
+       Bitmap masks can be exported to separate bmp files.
+       Bitmaps are now exported to 8-bit bmp files.
+       Lots of small changes and fixes.
+
+0.3
+       Improved functionality of the sequence editor.
+       Implemented bitmap and frame deletion.
+       Frame and sequence user interface cleanup.
+       One can now edit frame scale factors.
+       Fixed a serious bug regarding frames minimum light intensity value.
+       Assorted changes and fixes.
+
+0.2
+       Work done on the color table section and on color table exporting features.
+       Improved color reduction when importing RGB bitmaps.
+       Implemented "Save all bitmaps".
+       Implemented preliminary version of a true sequence editor.
+       Implemented sequence deleting.
+       Fixed sequence name charset issue that prevented some names from being displayed.
+       BitmapBrowser and FrameBrowser speed optimizations.
+       Assorted changes and fixes.
+
+0.1
+       First release of the new version using wxWidgets.
+
diff --git a/Resources/shapefusion.icns b/Resources/shapefusion.icns
new file mode 100644 (file)
index 0000000..066df53
Binary files /dev/null and b/Resources/shapefusion.icns differ
diff --git a/Resources/shapefusion.ico b/Resources/shapefusion.ico
new file mode 100644 (file)
index 0000000..a1fa9e1
Binary files /dev/null and b/Resources/shapefusion.ico differ
diff --git a/Resources/shapefusion.rc b/Resources/shapefusion.rc
new file mode 100644 (file)
index 0000000..a82ddf7
--- /dev/null
@@ -0,0 +1,26 @@
+#define wxUSE_NO_MANIFEST 1\r
+#include <wx/msw/wx.rc>\r
+
+1 VERSIONINFO
+FILEVERSION 0, 5, 0, 0
+PRODUCTVERSION 0, 5, 0, 0
+FILEFLAGSMASK 0
+FILEOS 0x40000
+FILETYPE 1
+{
+ BLOCK "StringFileInfo"
+ {
+  BLOCK "040904E4"
+  {
+   VALUE "AppName", "ShapeFusion"
+   VALUE "FileVersion", "0.5"
+   VALUE "FileDescription", "ShapeFusion for Win32"
+   VALUE "LegalCopyright", "GNU General Public License"
+   VALUE "License", "GNU General Public License (For details, see the file COPYING)"
+   VALUE "OriginalFilename", "ShapeFusion.exe"
+   VALUE "URL", "http://shapefusion.sourceforge.net"
+  }
+ }
+}
+
+AppIcon ICON "shapefusion.ico"
diff --git a/Resources/shapefusion.svg b/Resources/shapefusion.svg
new file mode 100644 (file)
index 0000000..3ee56ee
--- /dev/null
@@ -0,0 +1,1361 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg4463"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="shapefusion.svg">
+  <defs
+     id="defs4465">
+    <linearGradient
+       id="linearGradient5512">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5514" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5516" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3797-2"
+       id="radialGradient4053"
+       cx="10.833834"
+       cy="39.016094"
+       fx="10.833834"
+       fy="39.016094"
+       r="24"
+       gradientTransform="matrix(1.5386187,0.01189261,-0.01211628,1.5736966,-5.3283917,-23.560953)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3797-2">
+      <stop
+         id="stop3805-1"
+         offset="0"
+         style="stop-color:#e5efe6;stop-opacity:1;" />
+      <stop
+         style="stop-color:#00640c;stop-opacity:1;"
+         offset="1"
+         id="stop3801-9" />
+    </linearGradient>
+    <radialGradient
+       r="24"
+       fy="39.016094"
+       fx="10.833834"
+       cy="39.016094"
+       cx="10.833834"
+       gradientTransform="matrix(1.0257458,0.00792841,-0.00807752,1.0491311,4.447737,-15.707304)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4608"
+       xlink:href="#linearGradient3797-2"
+       inkscape:collect="always" />
+    <radialGradient
+       r="48.92857"
+       fy="306.64789"
+       fx="160.35715"
+       cy="306.64789"
+       cx="160.35715"
+       gradientTransform="matrix(1,0,0,4.1313869,59.756785,-944.49891)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2375"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="10.357145"
+       fy="281.29074"
+       fx="133.21428"
+       cy="281.29074"
+       cx="133.21428"
+       gradientTransform="matrix(1,0,0,3.068965,59.756785,-566.24641)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2372"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="5.3571401"
+       fy="255.57648"
+       fx="137.5"
+       cy="255.57648"
+       cx="137.5"
+       gradientTransform="matrix(1,0,0,3.9333357,59.756785,-733.95728)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2369"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="12.5"
+       fy="286.64789"
+       fx="126.78571"
+       cy="286.64789"
+       cx="126.78571"
+       gradientTransform="matrix(1,0,0,1.5428572,59.756785,-139.87457)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2366"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="12.142855"
+       fy="407.36218"
+       fx="182.14285"
+       cy="407.36218"
+       cx="182.14285"
+       gradientTransform="matrix(1,0,0,3.1764713,59.756785,-870.87778)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2363"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="6.7857151"
+       fy="410.21933"
+       fx="176.78571"
+       cy="410.21933"
+       cx="176.78571"
+       gradientTransform="matrix(1,0,0,2.4210529,59.756785,-567.20906)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2360"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="9.2857151"
+       fy="385.93362"
+       fx="188.57143"
+       cy="385.93362"
+       cx="188.57143"
+       gradientTransform="matrix(1,0,0,0.5384615,59.756785,193.85752)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2357"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="21.42857"
+       fy="416.29074"
+       fx="122.85714"
+       cy="416.29074"
+       cx="122.85714"
+       gradientTransform="matrix(1,0,0,1.15,59.756785,-46.709305)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2354"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="12.857145"
+       fy="400.93362"
+       fx="127.14286"
+       cy="400.93362"
+       cx="127.14286"
+       gradientTransform="matrix(1,0,0,0.4444447,59.756785,238.47509)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2351"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="2.1428599"
+       fy="423.07645"
+       fx="125"
+       cy="423.07645"
+       cx="125"
+       gradientTransform="matrix(1,0,0,4.999993,59.756785,-1676.5686)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2348"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="21.428576"
+       fy="360.93362"
+       fx="135.71429"
+       cy="360.93362"
+       cx="135.71429"
+       gradientTransform="matrix(1,0,0,0.8999997,59.756785,51.827786)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2345"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.5714254"
+       fy="373.79074"
+       fx="140.71429"
+       cy="373.79074"
+       cx="140.71429"
+       gradientTransform="matrix(1,0,0,0.8333334,59.756785,78.032722)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2342"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="2.8571401"
+       fy="353.79074"
+       fx="145"
+       cy="353.79074"
+       cx="145"
+       gradientTransform="matrix(1,0,0,1.7500018,59.756785,-249.60938)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2339"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.5714302"
+       fy="354.14789"
+       fx="121.42857"
+       cy="354.14789"
+       cx="121.42857"
+       gradientTransform="matrix(1,0,0,0.2083334,59.756785,296.10137)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2336"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="14.64286"
+       fy="224.50504"
+       fx="197.5"
+       cy="224.50504"
+       cx="197.5"
+       gradientTransform="matrix(1,0,0,0.7317071,59.756785,75.9674)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2333"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="13.214285"
+       fy="273.43362"
+       fx="185.35715"
+       cy="273.43362"
+       cx="185.35715"
+       gradientTransform="matrix(1,0,0,1.4324324,59.756785,-102.50725)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2330"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="1.785715"
+       fy="274.86218"
+       fx="184.64285"
+       cy="274.86218"
+       cx="184.64285"
+       gradientTransform="matrix(1,0,0,4.5999978,59.756785,-973.76895)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2327"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="1.785715"
+       fy="237.71933"
+       fx="196.78571"
+       cy="237.71933"
+       cx="196.78571"
+       gradientTransform="matrix(1,0,0,4.5999978,59.756785,-840.05474)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2324"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="3.2142849"
+       fy="219.50504"
+       fx="191.78571"
+       cy="219.50504"
+       cx="191.78571"
+       gradientTransform="matrix(1,0,0,3.3333339,59.756785,-496.44423)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2321"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="3.57143"
+       fy="217.36218"
+       fx="162.14285"
+       cy="217.36218"
+       cx="162.14285"
+       gradientTransform="matrix(1,0,0,5.1999983,59.756785,-897.18649)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2318"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="2.5"
+       fy="209.1479"
+       fx="158.21429"
+       cy="209.1479"
+       cx="158.21429"
+       gradientTransform="matrix(1,0,0,2.42857,59.756785,-283.04811)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2315"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="4.2857099"
+       fy="166.29076"
+       fx="180"
+       cy="166.29076"
+       cx="180"
+       gradientTransform="matrix(1,0,0,2.9166696,59.756785,-302.99012)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2312"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="5"
+       fy="154.1479"
+       fx="203.57143"
+       cy="154.1479"
+       cx="203.57143"
+       gradientTransform="matrix(1,0,0,1.642857,59.756785,-83.360754)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2309"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="5"
+       fy="154.1479"
+       fx="203.57143"
+       cy="154.1479"
+       cx="203.57143"
+       gradientTransform="matrix(1,0,0,1.642857,0,-99.095053)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15177"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="4.2857099"
+       fy="166.29076"
+       fx="180"
+       cy="166.29076"
+       cx="180"
+       gradientTransform="matrix(1,0,0,2.9166696,0,-318.72442)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15175"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="2.5"
+       fy="209.1479"
+       fx="158.21429"
+       cy="209.1479"
+       cx="158.21429"
+       gradientTransform="matrix(1,0,0,2.42857,0,-298.78241)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15173"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="3.57143"
+       fy="217.36218"
+       fx="162.14285"
+       cy="217.36218"
+       cx="162.14285"
+       gradientTransform="matrix(1,0,0,5.1999983,0,-912.92079)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15171"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="3.2142849"
+       fy="219.50504"
+       fx="191.78571"
+       cy="219.50504"
+       cx="191.78571"
+       gradientTransform="matrix(1,0,0,3.3333339,0,-512.17853)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15169"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="1.785715"
+       fy="237.71933"
+       fx="196.78571"
+       cy="237.71933"
+       cx="196.78571"
+       gradientTransform="matrix(1,0,0,4.5999978,0,-855.78904)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15167"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="1.785715"
+       fy="274.86218"
+       fx="184.64285"
+       cy="274.86218"
+       cx="184.64285"
+       gradientTransform="matrix(1,0,0,4.5999978,0,-989.50325)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15165"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="13.214285"
+       fy="273.43362"
+       fx="185.35715"
+       cy="273.43362"
+       cx="185.35715"
+       gradientTransform="matrix(1,0,0,1.4324324,0,-118.24155)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15163"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="14.64286"
+       fy="224.50504"
+       fx="197.5"
+       cy="224.50504"
+       cx="197.5"
+       gradientTransform="matrix(1,0,0,0.7317071,0,60.233101)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15161"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.5714302"
+       fy="354.14789"
+       fx="121.42857"
+       cy="354.14789"
+       cx="121.42857"
+       gradientTransform="matrix(1,0,0,0.2083334,0,280.36707)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15159"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="2.8571401"
+       fy="353.79074"
+       fx="145"
+       cy="353.79074"
+       cx="145"
+       gradientTransform="matrix(1,0,0,1.7500018,0,-265.34368)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15157"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.5714254"
+       fy="373.79074"
+       fx="140.71429"
+       cy="373.79074"
+       cx="140.71429"
+       gradientTransform="matrix(1,0,0,0.8333334,0,62.298423)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15155"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="21.428576"
+       fy="360.93362"
+       fx="135.71429"
+       cy="360.93362"
+       cx="135.71429"
+       gradientTransform="matrix(1,0,0,0.8999997,0,36.093487)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15153"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="2.1428599"
+       fy="423.07645"
+       fx="125"
+       cy="423.07645"
+       cx="125"
+       gradientTransform="matrix(1,0,0,4.999993,0,-1692.3029)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15151"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="12.857145"
+       fy="400.93362"
+       fx="127.14286"
+       cy="400.93362"
+       cx="127.14286"
+       gradientTransform="matrix(1,0,0,0.4444447,0,222.74079)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15149"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="21.42857"
+       fy="416.29074"
+       fx="122.85714"
+       cy="416.29074"
+       cx="122.85714"
+       gradientTransform="matrix(1,0,0,1.15,0,-62.443604)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15147"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="9.2857151"
+       fy="385.93362"
+       fx="188.57143"
+       cy="385.93362"
+       cx="188.57143"
+       gradientTransform="matrix(1,0,0,0.5384615,0,178.12322)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15145"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="6.7857151"
+       fy="410.21933"
+       fx="176.78571"
+       cy="410.21933"
+       cx="176.78571"
+       gradientTransform="matrix(1,0,0,2.4210529,0,-582.94336)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15143"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="12.142855"
+       fy="407.36218"
+       fx="182.14285"
+       cy="407.36218"
+       cx="182.14285"
+       gradientTransform="matrix(1,0,0,3.1764713,0,-886.61208)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15141"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="12.5"
+       fy="286.64789"
+       fx="126.78571"
+       cy="286.64789"
+       cx="126.78571"
+       gradientTransform="matrix(1,0,0,1.5428572,0,-155.60887)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15139"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="5.3571401"
+       fy="255.57648"
+       fx="137.5"
+       cy="255.57648"
+       cx="137.5"
+       gradientTransform="matrix(1,0,0,3.9333357,0,-749.69158)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15137"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="10.357145"
+       fy="281.29074"
+       fx="133.21428"
+       cy="281.29074"
+       cx="133.21428"
+       gradientTransform="matrix(1,0,0,3.068965,0,-581.98071)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15135"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="48.92857"
+       fy="306.64789"
+       fx="160.35715"
+       cy="306.64789"
+       cx="160.35715"
+       gradientTransform="matrix(1,0,0,4.1313869,0,-960.23321)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15133"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <radialGradient
+       r="48.92857"
+       fy="306.64789"
+       fx="160.35715"
+       cy="306.64789"
+       cx="160.35715"
+       gradientTransform="matrix(1,0,0,4.1313869,222.37499,-960.23321)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient15131"
+       xlink:href="#linearGradient8285"
+       inkscape:collect="always" />
+    <filter
+       id="filter11733"
+       inkscape:collect="always">
+      <feGaussianBlur
+         id="feGaussianBlur11735"
+         stdDeviation="2.575"
+         inkscape:collect="always" />
+    </filter>
+    <linearGradient
+       id="linearGradient8285">
+      <stop
+         id="stop8287"
+         offset="0"
+         style="stop-color:#30e0ff;stop-opacity:1;" />
+      <stop
+         id="stop8289"
+         offset="1"
+         style="stop-color:#0000ae;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5588"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,4.1313869,59.756785,-944.49891)"
+       cx="160.35715"
+       cy="306.64789"
+       fx="160.35715"
+       fy="306.64789"
+       r="48.92857" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5590"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.068965,59.756785,-566.24641)"
+       cx="133.21428"
+       cy="281.29074"
+       fx="133.21428"
+       fy="281.29074"
+       r="10.357145" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5592"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.9333357,59.756785,-733.95728)"
+       cx="137.5"
+       cy="255.57648"
+       fx="137.5"
+       fy="255.57648"
+       r="5.3571401" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5594"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.5428572,59.756785,-139.87457)"
+       cx="126.78571"
+       cy="286.64789"
+       fx="126.78571"
+       fy="286.64789"
+       r="12.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5596"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.1764713,59.756785,-870.87778)"
+       cx="182.14285"
+       cy="407.36218"
+       fx="182.14285"
+       fy="407.36218"
+       r="12.142855" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5598"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.4210529,59.756785,-567.20906)"
+       cx="176.78571"
+       cy="410.21933"
+       fx="176.78571"
+       fy="410.21933"
+       r="6.7857151" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5600"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5384615,59.756785,193.85752)"
+       cx="188.57143"
+       cy="385.93362"
+       fx="188.57143"
+       fy="385.93362"
+       r="9.2857151" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5602"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.15,59.756785,-46.709305)"
+       cx="122.85714"
+       cy="416.29074"
+       fx="122.85714"
+       fy="416.29074"
+       r="21.42857" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5604"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.4444447,59.756785,238.47509)"
+       cx="127.14286"
+       cy="400.93362"
+       fx="127.14286"
+       fy="400.93362"
+       r="12.857145" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5606"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,4.999993,59.756785,-1676.5686)"
+       cx="125"
+       cy="423.07645"
+       fx="125"
+       fy="423.07645"
+       r="2.1428599" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5608"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.8999997,59.756785,51.827786)"
+       cx="135.71429"
+       cy="360.93362"
+       fx="135.71429"
+       fy="360.93362"
+       r="21.428576" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5610"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.8333334,59.756785,78.032722)"
+       cx="140.71429"
+       cy="373.79074"
+       fx="140.71429"
+       fy="373.79074"
+       r="8.5714254" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5612"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.7500018,59.756785,-249.60938)"
+       cx="145"
+       cy="353.79074"
+       fx="145"
+       fy="353.79074"
+       r="2.8571401" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5614"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.2083334,59.756785,296.10137)"
+       cx="121.42857"
+       cy="354.14789"
+       fx="121.42857"
+       fy="354.14789"
+       r="8.5714302" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5616"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.7317071,59.756785,75.9674)"
+       cx="197.5"
+       cy="224.50504"
+       fx="197.5"
+       fy="224.50504"
+       r="14.64286" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5618"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.4324324,59.756785,-102.50725)"
+       cx="185.35715"
+       cy="273.43362"
+       fx="185.35715"
+       fy="273.43362"
+       r="13.214285" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5620"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,4.5999978,59.756785,-973.76895)"
+       cx="184.64285"
+       cy="274.86218"
+       fx="184.64285"
+       fy="274.86218"
+       r="1.785715" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5622"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,4.5999978,59.756785,-840.05474)"
+       cx="196.78571"
+       cy="237.71933"
+       fx="196.78571"
+       fy="237.71933"
+       r="1.785715" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5624"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,3.3333339,59.756785,-496.44423)"
+       cx="191.78571"
+       cy="219.50504"
+       fx="191.78571"
+       fy="219.50504"
+       r="3.2142849" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5626"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,5.1999983,59.756785,-897.18649)"
+       cx="162.14285"
+       cy="217.36218"
+       fx="162.14285"
+       fy="217.36218"
+       r="3.57143" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5628"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.42857,59.756785,-283.04811)"
+       cx="158.21429"
+       cy="209.1479"
+       fx="158.21429"
+       fy="209.1479"
+       r="2.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5630"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,2.9166696,59.756785,-302.99012)"
+       cx="180"
+       cy="166.29076"
+       fx="180"
+       fy="166.29076"
+       r="4.2857099" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5632"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.642857,59.756785,-83.360754)"
+       cx="203.57143"
+       cy="154.1479"
+       fx="203.57143"
+       fy="154.1479"
+       r="5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5635"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.03491337,0.13029842,21.149247,-20.277909)"
+       cx="203.57143"
+       cy="154.1479"
+       fx="203.57143"
+       fy="154.1479"
+       r="5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5638"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.06198395,0.23132716,25.816726,-37.697173)"
+       cx="180"
+       cy="166.29076"
+       fx="180"
+       fy="166.29076"
+       r="4.2857099" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5641"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.05161105,0.19261496,25.392926,-36.115531)"
+       cx="158.21429"
+       cy="209.1479"
+       fx="158.21429"
+       fy="209.1479"
+       r="2.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5644"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.11050839,0.41242273,38.444362,-84.824129)"
+       cx="162.14285"
+       cy="217.36218"
+       fx="162.14285"
+       fy="217.36218"
+       r="3.57143" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5647"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.07083875,0.26437368,29.92794,-53.040423)"
+       cx="191.78571"
+       cy="219.50504"
+       fx="191.78571"
+       fy="219.50504"
+       r="3.2142849" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5650"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.09775741,0.36483544,37.23022,-80.292891)"
+       cx="196.78571"
+       cy="237.71933"
+       fx="196.78571"
+       fy="237.71933"
+       r="1.785715" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5653"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.09775741,0.36483544,40.071863,-90.898044)"
+       cx="184.64285"
+       cy="274.86218"
+       fx="184.64285"
+       fy="274.86218"
+       r="1.785715" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5656"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.03044151,0.11360921,21.556141,-21.796458)"
+       cx="185.35715"
+       cy="273.43362"
+       fx="185.35715"
+       fy="273.43362"
+       r="13.214285" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5659"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.01554996,0.05803322,17.763265,-7.6412602)"
+       cx="197.5"
+       cy="224.50504"
+       fx="197.5"
+       fy="224.50504"
+       r="14.64286" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5662"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.00442742,0.01652336,13.085062,9.818025)"
+       cx="121.42857"
+       cy="354.14789"
+       fx="121.42857"
+       fy="354.14789"
+       r="8.5714302" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.03719037,0.1387963,24.682299,-33.463435)"
+       cx="145"
+       cy="353.79074"
+       fx="145"
+       fy="353.79074"
+       r="2.8571401" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5668"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.01770968,0.06609341,17.719374,-7.4774552)"
+       cx="140.71429"
+       cy="373.79074"
+       fx="140.71429"
+       fy="373.79074"
+       r="8.5714254" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.01912645,0.07138086,18.276271,-9.5558235)"
+       cx="135.71429"
+       cy="360.93362"
+       fx="135.71429"
+       fy="360.93362"
+       r="21.428576" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5674"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.10625795,0.39655989,55.007494,-146.63855)"
+       cx="125"
+       cy="423.07645"
+       fx="125"
+       fy="423.07645"
+       r="2.1428599" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5677"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.00944517,0.03524984,14.309714,5.2475643)"
+       cx="127.14286"
+       cy="400.93362"
+       fx="127.14286"
+       fy="400.93362"
+       r="12.857145" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.02443936,0.0912089,20.370344,-17.371006)"
+       cx="122.85714"
+       cy="416.29074"
+       fx="122.85714"
+       fy="416.29074"
+       r="21.42857" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5683"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.01144318,0.04270651,15.257909,1.7088516)"
+       cx="188.57143"
+       cy="385.93362"
+       fx="188.57143"
+       fy="385.93362"
+       r="9.2857151" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5686"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.0514513,0.19201877,31.431807,-58.65293)"
+       cx="176.78571"
+       cy="410.21933"
+       fx="176.78571"
+       fy="410.21933"
+       r="6.7857151" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.06750516,0.25193258,37.885259,-82.73753)"
+       cx="182.14285"
+       cy="407.36218"
+       fx="182.14285"
+       fy="407.36218"
+       r="12.142855" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5692"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.03278821,0.12236723,22.350257,-24.760138)"
+       cx="126.78571"
+       cy="286.64789"
+       fx="126.78571"
+       fy="286.64789"
+       r="12.5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5695"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.08358976,0.31196108,34.975477,-71.878079)"
+       cx="137.5"
+       cy="255.57648"
+       fx="137.5"
+       fy="255.57648"
+       r="5.3571401" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5698"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.06522048,0.24340603,31.411349,-58.57658)"
+       cx="133.21428"
+       cy="281.29074"
+       fx="133.21428"
+       fy="281.29074"
+       r="10.357145" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8285"
+       id="radialGradient5701"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.07931209,0.02125162,-0.08779866,0.32766893,39.449827,-88.576576)"
+       cx="160.35715"
+       cy="306.64789"
+       fx="160.35715"
+       fy="306.64789"
+       r="48.92857" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4"
+     inkscape:cx="47.09975"
+     inkscape:cy="33.986269"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1600"
+     inkscape:window-height="1101"
+     inkscape:window-x="0"
+     inkscape:window-y="49"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata4468">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       id="g6158">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3025-7"
+         d="M 23.999999,-1.26e-6 C 15.163443,-1.26e-6 8,7.1774611 8,16.03131 8,24.438127 14.449981,31.325128 22.666666,32 l 0,-9.247228 c -5.077613,-0.654903 -8.999999,-4.983418 -8.999999,-10.249186 0,-5.7181104 4.626391,-10.3535546 10.333332,-10.3535546 5.706945,0 10.333335,4.6354442 10.333335,10.3535546 0,5.265768 -3.922386,9.594283 -9.000001,10.249186 l 0,9.247228 C 33.55002,31.325128 40,24.438127 40,16.03131 40,7.1774611 32.836556,-1.26e-6 23.999999,-1.26e-6 z m 0,3.67384216 c -4.786467,0 -8.666666,3.8877922 -8.666666,8.6836271 0,4.795836 3.880199,8.683627 8.666666,8.683627 4.786469,0 8.666668,-3.887791 8.666668,-8.683627 0,-4.7958349 -3.880199,-8.6836271 -8.666668,-8.6836271 z"
+         style="fill:url(#radialGradient4608);fill-opacity:1;stroke:none;display:inline;stroke-opacity:1;stroke-width:0.20000000000000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;opacity:1" />
+      <g
+         transform="matrix(0.08764665,0,0,0.08764665,8,23.849491)"
+         i:dimmedPercent="50"
+         i:layer="yes"
+         i:rgbTrio="#4F008000FFFF"
+         id="Layer_1">
+        <g
+           id="g4549">
+          <path
+             style="fill:#616161;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="M 0,34.344 0.72,53.46 C 9.396,60.732 18,68.04 26.928,75.78 35.892,83.52 45.792,90 53.856,99.504 c 7.884,9.396 16.992,18 20.52,32.616 3.384,14.651 3.384,32.509 0,54.54 l -10.98,18.756 -0.36,21.961 20.556,8.855 c 5.796,-2.16 12.6,-3.205 20.556,-2.844 7.92,0.215 19.62,1.332 26.892,4.607 7.2,3.203 12.24,10.297 15.948,14.904 3.564,4.607 5.508,8.604 5.688,12.383 l 23.724,10.262 68.004,-68.689 -0.721,-23.4 v 0.002 c -3.312,-1.586 -6.336,-3.24 -9.216,-4.969 -2.952,-1.801 -5.616,-3.637 -8.136,-5.652 24.3,1.801 44.496,2.52 61.992,1.764 17.352,-0.9 29.592,-3.275 41.436,-6.012 11.7,-2.699 22.393,-7.309 28.332,-9.936 5.796,-2.701 7.813,-4.176 6.732,-6.373 -1.225,-2.412 -3.168,-3.059 -13.464,-7.775 -10.62,-4.896 -35.028,-15.3 -48.528,-20.916 -13.428,-5.616 -23.544,-9.612 -31.176,-12.384 v -9.576 L 249.01,92.808 V 78.624 L 46.404,0 C 30.96,11.448 15.48,22.896 0,34.344 z"
+             i:knockout="Off"
+             id="path4551" />
+          <path
+             style="fill:#a1a1a1;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 3.888,37.188 205.452,81.108 37.872,-37.548 c -7.668,7.128 -14.688,12.528 -21.6,16.632 -6.84,4.032 -9.721,7.632 -19.477,7.452 -9.936,-0.396 -16.164,-1.476 -39.672,-9.216 C 142.56,87.624 92.16,68.328 64.836,58.428 37.548,48.636 17.604,41.652 3.888,37.188 z"
+             i:knockout="Off"
+             id="path4553" />
+          <path
+             style="fill:#a1a1a1;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 249.336,96.336 c -9.54,9.144 -16.164,15.876 -20.16,20.196 -3.96,4.284 -5.328,3.852 -3.563,5.652 1.62,1.692 9.216,4.392 13.464,4.608 4.176,0.072 7.812,-1.224 11.34,-3.888 l -6.732,8.496 -27.972,-8.136 27.612,-26.208 c 1.979,-0.216 3.995,-0.468 6.011,-0.72 z"
+             i:knockout="Off"
+             id="path4555" />
+          <path
+             style="fill:#a1a1a1;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 261.396,127.512 c -6.12,-0.54 -9.648,0.54 -11.7,2.808 -2.196,2.304 -3.097,7.993 -1.044,10.657 2.016,2.52 4.248,2.555 13.104,4.572 8.856,1.979 22.933,5.508 39.313,7.092 16.344,1.439 50.184,2.627 57.384,1.764 6.804,-0.9 -3.888,-3.527 -15.948,-7.057 -12.24,-3.707 -42.228,-10.835 -55.944,-14.184 -13.609,-3.348 -19.081,-5.184 -25.165,-5.652 z"
+             i:knockout="Off"
+             id="path4557" />
+          <path
+             style="fill:#212121;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 63.036,46.044 16.308,-11.34 -16.308,-6.732 -15.912,11.7 15.912,6.372 z"
+             i:knockout="Off"
+             id="path4559" />
+          <path
+             style="fill:#212121;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 249.012,79.668 -38.987,38.628 c -0.937,10.836 -1.297,20.052 -0.685,28.333 0.468,8.172 3.061,18.863 3.888,20.555 0.757,1.512 0.505,-3.816 1.045,-10.98 0.432,-7.234 1.079,-17.676 1.8,-31.895 l 31.859,-31.86 c 0.36,-4.249 0.72,-8.497 1.08,-12.781 z"
+             i:knockout="Off"
+             id="path4561" />
+          <path
+             style="fill:#212121;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 249.696,124.308 -6.372,7.812 c -0.216,7.487 0.072,12.312 0.72,14.868 0.612,2.34 2.412,2.34 3.168,0 0.648,-2.412 -0.432,-10.44 1.08,-13.824 1.332,-3.456 7.2,-4.932 7.452,-6.372 0.216,-1.512 -1.8,-2.34 -6.048,-2.484 z"
+             i:knockout="Off"
+             id="path4563" />
+          <path
+             style="fill:#212121;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 269.172,103.428 c -4.14,4.788 -6.264,7.812 -6.372,9.216 -0.107,1.296 4.104,-0.864 5.688,-1.08 1.476,-0.288 2.7,-0.36 3.527,-0.36 l -0.72,-9.216 c -0.683,0.468 -1.403,0.936 -2.123,1.44 z"
+             i:knockout="Off"
+             id="path4565" />
+          <path
+             style="fill:#212121;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 170.352,214.633 c 0.216,-4.609 0.54,-8.605 2.484,-13.105 1.728,-4.535 3.564,-9.143 8.856,-13.824 5.4,-4.859 22.428,-13.211 23.041,-14.508 0.252,-1.26 -14.257,3.744 -20.196,7.092 -5.94,3.313 -11.592,7.236 -14.868,12.744 -3.276,5.4 -4.86,13.861 -4.608,19.836 0.324,5.869 4.968,15.229 6.012,15.59 0.755,0.179 -0.973,-9.29 -0.721,-13.825 z"
+             i:knockout="Off"
+             id="path4567" />
+          <path
+             style="fill:#212121;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 225.972,174.24 16.633,9.936 -51.337,53.461 c -0.756,-7.885 0,-14.797 2.124,-20.881 2.124,-6.119 8.028,-11.268 10.62,-15.588 2.484,-4.428 1.404,-7.848 4.248,-10.26 2.772,-2.447 10.225,-2.52 12.061,-4.248 1.655,-1.873 -2.772,-4.32 -1.765,-6.373 0.9,-2.088 3.42,-4.103 7.416,-6.047 z"
+             i:knockout="Off"
+             id="path4569" />
+          <path
+             style="fill:#212121;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 44.28,14.148 c 0,2.556 3.42,4.608 7.632,4.608 4.176,0 7.596,-2.052 7.596,-4.608 0,-2.52 -3.42,-4.608 -7.596,-4.608 -4.212,0 -7.632,2.088 -7.632,4.608 z"
+             i:knockout="Off"
+             id="path4571" />
+          <path
+             style="fill:#212121;fill-rule:evenodd"
+             inkscape:connector-curvature="0"
+             clip-rule="evenodd"
+             d="m 65.232,207.035 c 5.328,-8.711 10.26,-14.471 15.084,-17.135 4.716,-2.701 7.56,0.539 13.392,0.828 5.76,0.18 20.844,-1.908 21.348,0.396 0.324,2.34 -14.436,9.07 -18.864,13.391 -4.5,4.213 -7.092,8.029 -7.92,11.736 -7.668,-3.06 -15.336,-6.118 -23.04,-9.216 z"
+             i:knockout="Off"
+             id="path4573" />
+        </g>
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path7258"
+         d="M 33.421301,0.31770012 22.834944,16.486106 l 1.982802,0.53129 -7.749425,13.285426 10.976672,-13.999378 -2.26606,-0.60719 7.642368,-15.37855388 z"
+         style="fill:url(#radialGradient5701);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7260"
+         d="m 23.550279,15.402683 -0.06529,-5.421477 0.534774,4.575772 -0.469481,0.845705 z"
+         style="fill:url(#radialGradient5698);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7262"
+         d="m 23.75793,12.361659 1.131141,-1.275603 0.161023,-1.960577 -0.542404,1.797668 -0.756805,1.011592 0.007,0.42692 z"
+         style="fill:url(#radialGradient5695);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7264"
+         d="m 23.518032,13.936788 -1.018637,-1.183726 -0.07372,-1.537725 -0.300618,1.801735 1.463714,1.788736 -0.07074,-0.86902 z"
+         style="fill:url(#radialGradient5692);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7266"
+         d="m 24.915576,20.504586 c 0,0 0.758402,3.967785 0.697683,4.194391 -0.06072,0.226606 -2.22379,1.95433 -2.22379,1.95433 l 1.955713,-2.08688 -0.762469,-3.725999 0.332863,-0.335842 z"
+         style="fill:url(#radialGradient5689);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7268"
+         d="m 25.051902,23.394903 -1.592489,1.637736 1.54804,-2.378273 0.04445,0.740537 z"
+         style="fill:url(#radialGradient5686);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7270"
+         d="m 25.167385,21.604279 1.019727,0.273236 0.240695,0.914558 -0.516908,-0.563537 -0.607986,-0.223629 -0.135528,-0.400628 z"
+         style="fill:url(#radialGradient5683);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7272"
+         d="m 22.163765,21.710245 -2.842888,1.545568 -1.603603,1.452601 1.943511,-1.361523 2.037567,-1.032727 0.465413,-0.603919 z"
+         style="fill:url(#radialGradient5680);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7274"
+         d="m 21.044825,22.26049 -1.579197,0.0019 2.28233,-0.359954 -0.703133,0.358066 z"
+         style="fill:url(#radialGradient5677);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7276"
+         d="m 20.363917,22.988825 -0.738648,1.623646 0.32284,-1.431467 0.415808,-0.192179 z"
+         style="fill:url(#radialGradient5674);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7278"
+         d="m 24.246074,18.017876 -2.006117,0.0089 -2.212678,2.139464 2.378565,-1.852139 1.564017,0.05476 0.276213,-0.351021 z"
+         style="fill:url(#radialGradient5671);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7280"
+         d="m 23.091616,19.833701 -1.228174,0.2781 -0.435055,0.490616 0.718311,-0.414718 0.85384,-0.01409 0.09108,-0.339909 z"
+         style="fill:url(#radialGradient5668);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7282"
+         d="m 23.357806,18.387054 -0.665727,0.671683 0.310639,-0.70611 0.355088,0.03443 z"
+         style="fill:url(#radialGradient5665);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7284"
+         d="m 21.865621,18.290818 -1.435535,-0.08106 1.246334,0.333954 0.189201,-0.252898 z"
+         style="fill:url(#radialGradient5662);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7288"
+         d="m 28.547306,10.123273 2.077949,-0.0504 0.700155,-1.0267725 -0.752739,0.769806 -1.862454,-0.074011 -0.162911,0.3813805 z"
+         style="fill:url(#radialGradient5659);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7290"
+         d="m 26.630885,14.102968 1.809872,-0.182955 0.94303,-1.933195 -0.792323,2.277172 -2.108307,0.163707 0.147728,-0.324729 z"
+         style="fill:url(#radialGradient5656);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7292"
+         d="m 27.530264,13.918924 0.575741,-1.242265 -0.277303,1.261512 -0.298438,-0.01925 z"
+         style="fill:url(#radialGradient5653);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7298"
+         d="m 29.601461,10.04142 -0.205472,1.220041 0.519089,-1.257445 -0.313617,0.0374 z"
+         style="fill:url(#radialGradient5650);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7300"
+         d="M 29.106777,9.8481506 30.072032,8.2852235 29.564057,9.727803 29.106777,9.8481506 z"
+         style="fill:url(#radialGradient5647);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7302"
+         d="M 27.059188,9.785252 26.95511,8.3608301 27.961838,6.8697338 27.268727,8.3234259 27.24839,9.5323541 27.059188,9.785252 z"
+         style="fill:url(#radialGradient5644);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7306"
+         d="M 27.046189,8.0209207 27.077639,6.997127 27.307223,7.7265513 27.04619,8.0209207 z"
+         style="fill:url(#radialGradient5641);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7310"
+         d="m 29.803157,5.6629851 -0.42583,-0.903446 0.503908,-1.2007943 -0.246942,1.1482103 0.301414,0.6879521 -0.13255,0.2680779 z"
+         style="fill:url(#radialGradient5638);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7314"
+         d="m 31.622251,4.0859682 0.861976,-0.497661 -1.142255,1.090468 0.280279,-0.592807 z"
+         style="fill:url(#radialGradient5635);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.04105496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.62068936;stroke-dasharray:none" />
+    </g>
+  </g>
+</svg>
diff --git a/ShapeFusion-Info.plist b/ShapeFusion-Info.plist
new file mode 100644 (file)
index 0000000..c64f5dd
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>CFBundleDevelopmentRegion</key>
+       <string>English</string>
+       <key>CFBundleDocumentTypes</key>
+       <array/>
+       <key>CFBundleExecutable</key>
+       <string>ShapeFusion</string>
+       <key>CFBundleIconFile</key>
+       <string>shapefusion</string>
+       <key>CFBundleIdentifier</key>
+       <string>com.titodalcanton.shapefusion</string>
+       <key>CFBundleInfoDictionaryVersion</key>
+       <string>6.0</string>
+       <key>CFBundlePackageType</key>
+       <string>APPL</string>
+       <key>CFBundleSignature</key>
+       <string>ShpF</string>
+       <key>CFBundleVersion</key>
+       <string>0.5</string>
+       <key>CFBundleShortVersionString</key>
+       <string>0.5</string>
+</dict>
+</plist>
diff --git a/ShapeFusion.xcodeproj/project.pbxproj b/ShapeFusion.xcodeproj/project.pbxproj
new file mode 100644 (file)
index 0000000..c9eaf96
--- /dev/null
@@ -0,0 +1,592 @@
+// !$*UTF8*$!
+{
+       archiveVersion = 1;
+       classes = {
+       };
+       objectVersion = 42;
+       objects = {
+
+/* Begin PBXBuildFile section */
+               1F33454A0BC95CA300A15A32 /* LittleEndianBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F3345480BC95CA300A15A32 /* LittleEndianBuffer.cpp */; };
+               1F536BAC0B93426B00F51E49 /* BitmapBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F08B4B7E0AB0AE4B00896399 /* BitmapBrowser.cpp */; };
+               1F536BAD0B93426C00F51E49 /* BitmapView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F08B4B7D0AB0AE4B00896399 /* BitmapView.cpp */; };
+               1F536BAE0B93426C00F51E49 /* CTBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F08B4B7C0AB0AE4B00896399 /* CTBrowser.cpp */; };
+               1F536BAF0B93426D00F51E49 /* FrameBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F08B4B7B0AB0AE4B00896399 /* FrameBrowser.cpp */; };
+               1F536BB00B93426E00F51E49 /* FrameView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F08B4B7A0AB0AE4B00896399 /* FrameView.cpp */; };
+               1F536BB10B93426F00F51E49 /* SequenceView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F0966E020B551E4900820E4F /* SequenceView.cpp */; };
+               1F9857330B8A2CDC00D0395F /* ShapeFusionMain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F98572F0B8A2CDC00D0395F /* ShapeFusionMain.cpp */; };
+               1F9857340B8A2CDC00D0395F /* ShapeFusionMenus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F9857310B8A2CDC00D0395F /* ShapeFusionMenus.cpp */; };
+               1F9857EA0B8A39BF00D0395F /* ShapesDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F9857E60B8A39BF00D0395F /* ShapesDocument.cpp */; };
+               1F9857EB0B8A39BF00D0395F /* ShapesView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F9857E80B8A39BF00D0395F /* ShapesView.cpp */; };
+               1F9FB4F10BF99DF000E8DBBD /* CTView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F9FB4EF0BF99DF000E8DBBD /* CTView.cpp */; };
+               1FAD07400B94409100E04604 /* ShapesElements.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FAD073D0B94409100E04604 /* ShapesElements.cpp */; };
+               1FAD85D20BB1E9410024D113 /* SoundsDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FAD85CC0BB1E9410024D113 /* SoundsDocument.cpp */; };
+               1FAD85D30BB1E9410024D113 /* SoundsElements.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FAD85CE0BB1E9410024D113 /* SoundsElements.cpp */; };
+               1FAD85D40BB1E9410024D113 /* SoundsView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FAD85D00BB1E9410024D113 /* SoundsView.cpp */; };
+               1FD3571A0BA21F2000360AA5 /* ShapesTreeItemData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FD357180BA21F2000360AA5 /* ShapesTreeItemData.cpp */; };
+               1FD941E10B92D5CD00DD1EEC /* BigEndianBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F096F44E0AD2DD97005A633A /* BigEndianBuffer.cpp */; };
+               1FE8DF890B9C4431003EF856 /* COPYING.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1FE8DF870B9C4431003EF856 /* COPYING.txt */; };
+               1FE8DF8A0B9C4431003EF856 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1FE8DF880B9C4431003EF856 /* README.txt */; };
+               1FEDD4640B9C3F9D00D69B62 /* utilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FEDD4610B9C3F9D00D69B62 /* utilities.cpp */; };
+               4DE10B410CC3992D00BAEC76 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F08B4C360AB0B06D00896399 /* Carbon.framework */; };
+               4DE10B4A0CC39BF200BAEC76 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F08B4C760AB0B7E300896399 /* IOKit.framework */; };
+               4DE10B4B0CC39BF400BAEC76 /* System.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F08B4C370AB0B09A00896399 /* System.framework */; };
+               4DE10B4E0CC39C2E00BAEC76 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DE10B4D0CC39C2E00BAEC76 /* libiconv.dylib */; };
+               4DE10B500CC39C4200BAEC76 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DE10B4F0CC39C4200BAEC76 /* QuickTime.framework */; };
+               4DE10B530CC39C8E00BAEC76 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DE10B520CC39C8E00BAEC76 /* Cocoa.framework */; };
+               4DE10B570CC39CAB00BAEC76 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DE10B560CC39CAB00BAEC76 /* libz.dylib */; };
+               AE0270E314C51B4F0093B508 /* PhysicsDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE0270DE14C51B4F0093B508 /* PhysicsDocument.cpp */; };
+               AE0270E414C51B4F0093B508 /* PhysicsEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE0270DF14C51B4F0093B508 /* PhysicsEditor.cpp */; };
+               AE0270E514C51B4F0093B508 /* PhysicsElements.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE0270E014C51B4F0093B508 /* PhysicsElements.cpp */; };
+               AE0270E614C51B4F0093B508 /* PhysicsTreeItemData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE0270E114C51B4F0093B508 /* PhysicsTreeItemData.cpp */; };
+               AE0270E714C51B4F0093B508 /* PhysicsView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE0270E214C51B4F0093B508 /* PhysicsView.cpp */; };
+               AE0270F214C51BA00093B508 /* sndfile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE0270F114C51BA00093B508 /* sndfile.framework */; };
+               AE02710C14C51C220093B508 /* DefaultNames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE02710A14C51C220093B508 /* DefaultNames.cpp */; };
+               AE02711214C51C510093B508 /* ShapeFusionDocManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE02711014C51C510093B508 /* ShapeFusionDocManager.cpp */; };
+               AE02712714C5201C0093B508 /* sndfile.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = AE0270F114C51BA00093B508 /* sndfile.framework */; };
+               AE33904A1290D7A2000DE273 /* shapefusion.icns in Resources */ = {isa = PBXBuildFile; fileRef = AE3390491290D7A2000DE273 /* shapefusion.icns */; };
+               F03A573C0D0381F00057BB53 /* GenericEndianBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F03A573B0D0381F00057BB53 /* GenericEndianBuffer.cpp */; };
+               F08B4C5A0AB0B31E00896399 /* ShapeFusionApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F08B4B780AB0AE4B00896399 /* ShapeFusionApp.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXBuildRule section */
+               F08B4D9F0AB0CF7500896399 /* PBXBuildRule */ = {
+                       isa = PBXBuildRule;
+                       compilerSpec = com.apple.compilers.gcc;
+                       fileType = sourcecode.cpp;
+                       isEditable = 1;
+                       outputFiles = (
+                       );
+               };
+/* End PBXBuildRule section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+               AE3390741290D895000DE273 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = "";
+                       dstSubfolderSpec = 10;
+                       files = (
+                               AE02712714C5201C0093B508 /* sndfile.framework in CopyFiles */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+               1F3345480BC95CA300A15A32 /* LittleEndianBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = LittleEndianBuffer.cpp; sourceTree = "<group>"; };
+               1F3345490BC95CA300A15A32 /* LittleEndianBuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = LittleEndianBuffer.h; sourceTree = "<group>"; };
+               1F84BCE90B8C760D000B4DC4 /* ShapesDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ShapesDocument.h; sourceTree = "<group>"; };
+               1F98572F0B8A2CDC00D0395F /* ShapeFusionMain.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ShapeFusionMain.cpp; sourceTree = "<group>"; };
+               1F9857300B8A2CDC00D0395F /* ShapeFusionMain.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ShapeFusionMain.h; sourceTree = "<group>"; };
+               1F9857310B8A2CDC00D0395F /* ShapeFusionMenus.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ShapeFusionMenus.cpp; sourceTree = "<group>"; };
+               1F9857320B8A2CDC00D0395F /* ShapeFusionMenus.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ShapeFusionMenus.h; sourceTree = "<group>"; };
+               1F9857E60B8A39BF00D0395F /* ShapesDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ShapesDocument.cpp; sourceTree = "<group>"; };
+               1F9857E80B8A39BF00D0395F /* ShapesView.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ShapesView.cpp; sourceTree = "<group>"; };
+               1F9857E90B8A39BF00D0395F /* ShapesView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ShapesView.h; sourceTree = "<group>"; };
+               1F9FB4EF0BF99DF000E8DBBD /* CTView.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CTView.cpp; sourceTree = "<group>"; };
+               1F9FB4F00BF99DF000E8DBBD /* CTView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CTView.h; sourceTree = "<group>"; };
+               1FAD073D0B94409100E04604 /* ShapesElements.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ShapesElements.cpp; sourceTree = "<group>"; };
+               1FAD073E0B94409100E04604 /* ShapesElements.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ShapesElements.h; sourceTree = "<group>"; };
+               1FAD85CC0BB1E9410024D113 /* SoundsDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SoundsDocument.cpp; sourceTree = "<group>"; };
+               1FAD85CD0BB1E9410024D113 /* SoundsDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SoundsDocument.h; sourceTree = "<group>"; };
+               1FAD85CE0BB1E9410024D113 /* SoundsElements.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SoundsElements.cpp; sourceTree = "<group>"; };
+               1FAD85CF0BB1E9410024D113 /* SoundsElements.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SoundsElements.h; sourceTree = "<group>"; };
+               1FAD85D00BB1E9410024D113 /* SoundsView.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SoundsView.cpp; sourceTree = "<group>"; };
+               1FAD85D10BB1E9410024D113 /* SoundsView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SoundsView.h; sourceTree = "<group>"; };
+               1FD357180BA21F2000360AA5 /* ShapesTreeItemData.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ShapesTreeItemData.cpp; sourceTree = "<group>"; };
+               1FD357190BA21F2000360AA5 /* ShapesTreeItemData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ShapesTreeItemData.h; sourceTree = "<group>"; };
+               1FE8DF870B9C4431003EF856 /* COPYING.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = COPYING.txt; sourceTree = "<group>"; };
+               1FE8DF880B9C4431003EF856 /* README.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = README.txt; sourceTree = "<group>"; };
+               1FEDD4610B9C3F9D00D69B62 /* utilities.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = utilities.cpp; sourceTree = "<group>"; };
+               1FEDD4620B9C3F9D00D69B62 /* utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = "<group>"; };
+               4DE10B4D0CC39C2E00BAEC76 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = /usr/lib/libiconv.dylib; sourceTree = "<absolute>"; };
+               4DE10B4F0CC39C4200BAEC76 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = "<absolute>"; };
+               4DE10B520CC39C8E00BAEC76 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+               4DE10B560CC39CAB00BAEC76 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
+               AE0270DE14C51B4F0093B508 /* PhysicsDocument.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PhysicsDocument.cpp; path = Physics/PhysicsDocument.cpp; sourceTree = "<group>"; };
+               AE0270DF14C51B4F0093B508 /* PhysicsEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PhysicsEditor.cpp; path = Physics/PhysicsEditor.cpp; sourceTree = "<group>"; };
+               AE0270E014C51B4F0093B508 /* PhysicsElements.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PhysicsElements.cpp; path = Physics/PhysicsElements.cpp; sourceTree = "<group>"; };
+               AE0270E114C51B4F0093B508 /* PhysicsTreeItemData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PhysicsTreeItemData.cpp; path = Physics/PhysicsTreeItemData.cpp; sourceTree = "<group>"; };
+               AE0270E214C51B4F0093B508 /* PhysicsView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PhysicsView.cpp; path = Physics/PhysicsView.cpp; sourceTree = "<group>"; };
+               AE0270E814C51B680093B508 /* PhysicsDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PhysicsDocument.h; path = Physics/PhysicsDocument.h; sourceTree = "<group>"; };
+               AE0270E914C51B680093B508 /* PhysicsElements.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PhysicsElements.h; path = Physics/PhysicsElements.h; sourceTree = "<group>"; };
+               AE0270EA14C51B680093B508 /* PhysicsTreeItemData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PhysicsTreeItemData.h; path = Physics/PhysicsTreeItemData.h; sourceTree = "<group>"; };
+               AE0270EB14C51B680093B508 /* PhysicsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PhysicsView.h; path = Physics/PhysicsView.h; sourceTree = "<group>"; };
+               AE0270F114C51BA00093B508 /* sndfile.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = sndfile.framework; path = /Library/Frameworks/sndfile.framework; sourceTree = "<absolute>"; };
+               AE02710A14C51C220093B508 /* DefaultNames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DefaultNames.cpp; sourceTree = "<group>"; };
+               AE02710B14C51C220093B508 /* DefaultNames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DefaultNames.h; sourceTree = "<group>"; };
+               AE02711014C51C510093B508 /* ShapeFusionDocManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShapeFusionDocManager.cpp; sourceTree = "<group>"; };
+               AE02711114C51C510093B508 /* ShapeFusionDocManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeFusionDocManager.h; sourceTree = "<group>"; };
+               AE3390491290D7A2000DE273 /* shapefusion.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = shapefusion.icns; path = Resources/shapefusion.icns; sourceTree = "<group>"; };
+               F03A573B0D0381F00057BB53 /* GenericEndianBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.cpp; path = GenericEndianBuffer.cpp; sourceTree = "<group>"; };
+               F03A573D0D0381F80057BB53 /* GenericEndianBuffer.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = GenericEndianBuffer.h; sourceTree = "<group>"; };
+               F08B4B780AB0AE4B00896399 /* ShapeFusionApp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShapeFusionApp.cpp; sourceTree = "<group>"; };
+               F08B4B7A0AB0AE4B00896399 /* FrameView.cpp */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.cpp; path = FrameView.cpp; sourceTree = "<group>"; };
+               F08B4B7B0AB0AE4B00896399 /* FrameBrowser.cpp */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.cpp; path = FrameBrowser.cpp; sourceTree = "<group>"; };
+               F08B4B7C0AB0AE4B00896399 /* CTBrowser.cpp */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.cpp; path = CTBrowser.cpp; sourceTree = "<group>"; };
+               F08B4B7D0AB0AE4B00896399 /* BitmapView.cpp */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.cpp; path = BitmapView.cpp; sourceTree = "<group>"; };
+               F08B4B7E0AB0AE4B00896399 /* BitmapBrowser.cpp */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.cpp; path = BitmapBrowser.cpp; sourceTree = "<group>"; };
+               F08B4B820AB0AE6C00896399 /* ShapeFusionApp.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 5; path = ShapeFusionApp.h; sourceTree = "<group>"; };
+               F08B4B840AB0AE6C00896399 /* FrameView.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = FrameView.h; sourceTree = "<group>"; };
+               F08B4B850AB0AE6C00896399 /* FrameBrowser.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = FrameBrowser.h; sourceTree = "<group>"; };
+               F08B4B860AB0AE6C00896399 /* CTBrowser.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = CTBrowser.h; sourceTree = "<group>"; };
+               F08B4B870AB0AE6C00896399 /* BitmapView.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = BitmapView.h; sourceTree = "<group>"; };
+               F08B4B880AB0AE6C00896399 /* BitmapBrowser.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = BitmapBrowser.h; sourceTree = "<group>"; };
+               F08B4C360AB0B06D00896399 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+               F08B4C370AB0B09A00896399 /* System.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = System.framework; path = /System/Library/Frameworks/System.framework; sourceTree = "<absolute>"; };
+               F08B4C440AB0B10000896399 /* ShapeFusion.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ShapeFusion.app; sourceTree = BUILT_PRODUCTS_DIR; };
+               F08B4C470AB0B10000896399 /* ShapeFusion-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ShapeFusion-Info.plist"; sourceTree = "<group>"; };
+               F08B4C760AB0B7E300896399 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
+               F08B4CB30AB0C0E700896399 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
+               F0966E020B551E4900820E4F /* SequenceView.cpp */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.cpp; path = SequenceView.cpp; sourceTree = "<group>"; };
+               F0966E040B551E5100820E4F /* SequenceView.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = SequenceView.h; sourceTree = "<group>"; };
+               F096F44E0AD2DD97005A633A /* BigEndianBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.cpp; path = BigEndianBuffer.cpp; sourceTree = "<group>"; };
+               F096F4500AD2DD9F005A633A /* BigEndianBuffer.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = BigEndianBuffer.h; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+               F08B4C420AB0B10000896399 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4DE10B410CC3992D00BAEC76 /* Carbon.framework in Frameworks */,
+                               4DE10B4A0CC39BF200BAEC76 /* IOKit.framework in Frameworks */,
+                               4DE10B4B0CC39BF400BAEC76 /* System.framework in Frameworks */,
+                               4DE10B500CC39C4200BAEC76 /* QuickTime.framework in Frameworks */,
+                               4DE10B530CC39C8E00BAEC76 /* Cocoa.framework in Frameworks */,
+                               4DE10B4E0CC39C2E00BAEC76 /* libiconv.dylib in Frameworks */,
+                               4DE10B570CC39CAB00BAEC76 /* libz.dylib in Frameworks */,
+                               AE0270F214C51BA00093B508 /* sndfile.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+               1F84BF630B8C8F5C000B4DC4 /* Shapes */ = {
+                       isa = PBXGroup;
+                       children = (
+                               1F9FB4EF0BF99DF000E8DBBD /* CTView.cpp */,
+                               1F9FB4F00BF99DF000E8DBBD /* CTView.h */,
+                               1FD357180BA21F2000360AA5 /* ShapesTreeItemData.cpp */,
+                               1FD357190BA21F2000360AA5 /* ShapesTreeItemData.h */,
+                               1FAD073D0B94409100E04604 /* ShapesElements.cpp */,
+                               1FAD073E0B94409100E04604 /* ShapesElements.h */,
+                               1F9857E60B8A39BF00D0395F /* ShapesDocument.cpp */,
+                               1F84BCE90B8C760D000B4DC4 /* ShapesDocument.h */,
+                               1F9857E80B8A39BF00D0395F /* ShapesView.cpp */,
+                               1F9857E90B8A39BF00D0395F /* ShapesView.h */,
+                               F08B4B7A0AB0AE4B00896399 /* FrameView.cpp */,
+                               F08B4B840AB0AE6C00896399 /* FrameView.h */,
+                               F08B4B7B0AB0AE4B00896399 /* FrameBrowser.cpp */,
+                               F08B4B850AB0AE6C00896399 /* FrameBrowser.h */,
+                               F08B4B7C0AB0AE4B00896399 /* CTBrowser.cpp */,
+                               F08B4B860AB0AE6C00896399 /* CTBrowser.h */,
+                               F08B4B7D0AB0AE4B00896399 /* BitmapView.cpp */,
+                               F08B4B870AB0AE6C00896399 /* BitmapView.h */,
+                               F08B4B7E0AB0AE4B00896399 /* BitmapBrowser.cpp */,
+                               F08B4B880AB0AE6C00896399 /* BitmapBrowser.h */,
+                               F0966E020B551E4900820E4F /* SequenceView.cpp */,
+                               F0966E040B551E5100820E4F /* SequenceView.h */,
+                               1FEDD4610B9C3F9D00D69B62 /* utilities.cpp */,
+                               1FEDD4620B9C3F9D00D69B62 /* utilities.h */,
+                       );
+                       path = Shapes;
+                       sourceTree = "<group>";
+               };
+               1FAD85C70BB1E9280024D113 /* Sounds */ = {
+                       isa = PBXGroup;
+                       children = (
+                               1FAD85CC0BB1E9410024D113 /* SoundsDocument.cpp */,
+                               1FAD85CD0BB1E9410024D113 /* SoundsDocument.h */,
+                               1FAD85CE0BB1E9410024D113 /* SoundsElements.cpp */,
+                               1FAD85CF0BB1E9410024D113 /* SoundsElements.h */,
+                               1FAD85D00BB1E9410024D113 /* SoundsView.cpp */,
+                               1FAD85D10BB1E9410024D113 /* SoundsView.h */,
+                       );
+                       path = Sounds;
+                       sourceTree = "<group>";
+               };
+               AE0270DD14C51B3A0093B508 /* Physics */ = {
+                       isa = PBXGroup;
+                       children = (
+                               AE0270E814C51B680093B508 /* PhysicsDocument.h */,
+                               AE0270E914C51B680093B508 /* PhysicsElements.h */,
+                               AE0270EA14C51B680093B508 /* PhysicsTreeItemData.h */,
+                               AE0270EB14C51B680093B508 /* PhysicsView.h */,
+                               AE0270DE14C51B4F0093B508 /* PhysicsDocument.cpp */,
+                               AE0270DF14C51B4F0093B508 /* PhysicsEditor.cpp */,
+                               AE0270E014C51B4F0093B508 /* PhysicsElements.cpp */,
+                               AE0270E114C51B4F0093B508 /* PhysicsTreeItemData.cpp */,
+                               AE0270E214C51B4F0093B508 /* PhysicsView.cpp */,
+                       );
+                       name = Physics;
+                       sourceTree = "<group>";
+               };
+               F08B4B580AB0ADBA00896399 = {
+                       isa = PBXGroup;
+                       children = (
+                               F08B4B720AB0AE0B00896399 /* Sources */,
+                               F08B4B750AB0AE1200896399 /* Resources */,
+                               F08B4B9E0AB0B02A00896399 /* External things */,
+                               F08B4C450AB0B10000896399 /* Products */,
+                       );
+                       sourceTree = "<group>";
+               };
+               F08B4B720AB0AE0B00896399 /* Sources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               AE0270DD14C51B3A0093B508 /* Physics */,
+                               1FAD85C70BB1E9280024D113 /* Sounds */,
+                               1F84BF630B8C8F5C000B4DC4 /* Shapes */,
+                               F08B4B780AB0AE4B00896399 /* ShapeFusionApp.cpp */,
+                               F08B4B820AB0AE6C00896399 /* ShapeFusionApp.h */,
+                               1F9857310B8A2CDC00D0395F /* ShapeFusionMenus.cpp */,
+                               1F9857320B8A2CDC00D0395F /* ShapeFusionMenus.h */,
+                               1F98572F0B8A2CDC00D0395F /* ShapeFusionMain.cpp */,
+                               1F9857300B8A2CDC00D0395F /* ShapeFusionMain.h */,
+                               F03A573B0D0381F00057BB53 /* GenericEndianBuffer.cpp */,
+                               F03A573D0D0381F80057BB53 /* GenericEndianBuffer.h */,
+                               F096F44E0AD2DD97005A633A /* BigEndianBuffer.cpp */,
+                               F096F4500AD2DD9F005A633A /* BigEndianBuffer.h */,
+                               1F3345480BC95CA300A15A32 /* LittleEndianBuffer.cpp */,
+                               1F3345490BC95CA300A15A32 /* LittleEndianBuffer.h */,
+                               AE02711014C51C510093B508 /* ShapeFusionDocManager.cpp */,
+                               AE02711114C51C510093B508 /* ShapeFusionDocManager.h */,
+                       );
+                       name = Sources;
+                       sourceTree = SOURCE_ROOT;
+               };
+               F08B4B750AB0AE1200896399 /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               AE3390491290D7A2000DE273 /* shapefusion.icns */,
+                               1FE8DF870B9C4431003EF856 /* COPYING.txt */,
+                               1FE8DF880B9C4431003EF856 /* README.txt */,
+                               F08B4C470AB0B10000896399 /* ShapeFusion-Info.plist */,
+                               AE02710A14C51C220093B508 /* DefaultNames.cpp */,
+                               AE02710B14C51C220093B508 /* DefaultNames.h */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               F08B4B9E0AB0B02A00896399 /* External things */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4DE10B560CC39CAB00BAEC76 /* libz.dylib */,
+                               4DE10B520CC39C8E00BAEC76 /* Cocoa.framework */,
+                               4DE10B4F0CC39C4200BAEC76 /* QuickTime.framework */,
+                               4DE10B4D0CC39C2E00BAEC76 /* libiconv.dylib */,
+                               F08B4C360AB0B06D00896399 /* Carbon.framework */,
+                               F08B4C370AB0B09A00896399 /* System.framework */,
+                               F08B4C760AB0B7E300896399 /* IOKit.framework */,
+                               F08B4CB30AB0C0E700896399 /* OpenGL.framework */,
+                               AE0270F114C51BA00093B508 /* sndfile.framework */,
+                       );
+                       name = "External things";
+                       sourceTree = "<group>";
+               };
+               F08B4C450AB0B10000896399 /* Products */ = {
+                       isa = PBXGroup;
+                       children = (
+                               F08B4C440AB0B10000896399 /* ShapeFusion.app */,
+                       );
+                       name = Products;
+                       sourceTree = "<group>";
+               };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+               F08B4C430AB0B10000896399 /* ShapeFusion */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = F08B4C480AB0B10000896399 /* Build configuration list for PBXNativeTarget "ShapeFusion" */;
+                       buildPhases = (
+                               F08B4C400AB0B10000896399 /* Resources */,
+                               F08B4C410AB0B10000896399 /* Sources */,
+                               F08B4C420AB0B10000896399 /* Frameworks */,
+                               AE3390741290D895000DE273 /* CopyFiles */,
+                       );
+                       buildRules = (
+                               F08B4D9F0AB0CF7500896399 /* PBXBuildRule */,
+                       );
+                       dependencies = (
+                       );
+                       name = ShapeFusion;
+                       productName = carbon_static;
+                       productReference = F08B4C440AB0B10000896399 /* ShapeFusion.app */;
+                       productType = "com.apple.product-type.application";
+               };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+               F08B4B5A0AB0ADBA00896399 /* Project object */ = {
+                       isa = PBXProject;
+                       buildConfigurationList = F08B4B5B0AB0ADBA00896399 /* Build configuration list for PBXProject "ShapeFusion" */;
+                       compatibilityVersion = "Xcode 2.4";
+                       developmentRegion = English;
+                       hasScannedForEncodings = 0;
+                       knownRegions = (
+                               English,
+                               Japanese,
+                               French,
+                               German,
+                       );
+                       mainGroup = F08B4B580AB0ADBA00896399;
+                       productRefGroup = F08B4C450AB0B10000896399 /* Products */;
+                       projectDirPath = "";
+                       projectRoot = "";
+                       targets = (
+                               F08B4C430AB0B10000896399 /* ShapeFusion */,
+                       );
+               };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+               F08B4C400AB0B10000896399 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               1FE8DF890B9C4431003EF856 /* COPYING.txt in Resources */,
+                               1FE8DF8A0B9C4431003EF856 /* README.txt in Resources */,
+                               AE33904A1290D7A2000DE273 /* shapefusion.icns in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+               F08B4C410AB0B10000896399 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               F08B4C5A0AB0B31E00896399 /* ShapeFusionApp.cpp in Sources */,
+                               1F9857330B8A2CDC00D0395F /* ShapeFusionMain.cpp in Sources */,
+                               1F9857340B8A2CDC00D0395F /* ShapeFusionMenus.cpp in Sources */,
+                               1F9857EA0B8A39BF00D0395F /* ShapesDocument.cpp in Sources */,
+                               1F9857EB0B8A39BF00D0395F /* ShapesView.cpp in Sources */,
+                               1F536BAE0B93426C00F51E49 /* CTBrowser.cpp in Sources */,
+                               1F9FB4F10BF99DF000E8DBBD /* CTView.cpp in Sources */,
+                               1F536BAC0B93426B00F51E49 /* BitmapBrowser.cpp in Sources */,
+                               1F536BAD0B93426C00F51E49 /* BitmapView.cpp in Sources */,
+                               1F536BAF0B93426D00F51E49 /* FrameBrowser.cpp in Sources */,
+                               1F536BB00B93426E00F51E49 /* FrameView.cpp in Sources */,
+                               1F536BB10B93426F00F51E49 /* SequenceView.cpp in Sources */,
+                               1FAD07400B94409100E04604 /* ShapesElements.cpp in Sources */,
+                               1FEDD4640B9C3F9D00D69B62 /* utilities.cpp in Sources */,
+                               1FD3571A0BA21F2000360AA5 /* ShapesTreeItemData.cpp in Sources */,
+                               1FAD85D20BB1E9410024D113 /* SoundsDocument.cpp in Sources */,
+                               1FAD85D30BB1E9410024D113 /* SoundsElements.cpp in Sources */,
+                               1FAD85D40BB1E9410024D113 /* SoundsView.cpp in Sources */,
+                               F03A573C0D0381F00057BB53 /* GenericEndianBuffer.cpp in Sources */,
+                               1FD941E10B92D5CD00DD1EEC /* BigEndianBuffer.cpp in Sources */,
+                               1F33454A0BC95CA300A15A32 /* LittleEndianBuffer.cpp in Sources */,
+                               AE0270E314C51B4F0093B508 /* PhysicsDocument.cpp in Sources */,
+                               AE0270E414C51B4F0093B508 /* PhysicsEditor.cpp in Sources */,
+                               AE0270E514C51B4F0093B508 /* PhysicsElements.cpp in Sources */,
+                               AE0270E614C51B4F0093B508 /* PhysicsTreeItemData.cpp in Sources */,
+                               AE0270E714C51B4F0093B508 /* PhysicsView.cpp in Sources */,
+                               AE02710C14C51C220093B508 /* DefaultNames.cpp in Sources */,
+                               AE02711214C51C510093B508 /* ShapeFusionDocManager.cpp in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+               F08B4B5C0AB0ADBA00896399 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ARCHS = (
+                                       ppc,
+                                       i386,
+                               );
+                               GCC_ENABLE_FIX_AND_CONTINUE = YES;
+                               GCC_OPTIMIZATION_LEVEL = 0;
+                               HEADER_SEARCH_PATHS = (
+                                       "$(WX_SRC_ROOT)/include/",
+                                       "$(WX_SRC_ROOT)/src/build/include",
+                               );
+                               LIBRARY_SEARCH_PATHS = "";
+                               MACOSX_DEPLOYMENT_TARGET = 10.4;
+                               SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+                               USER_HEADER_SEARCH_PATHS = "";
+                               WARNING_CFLAGS = "-Wall";
+                               WX_SRC_ROOT = "/Applications/wxMac-2.8.6";
+                       };
+                       name = Debug;
+               };
+               F08B4B5D0AB0ADBA00896399 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ARCHS = (
+                                       ppc,
+                                       i386,
+                               );
+                               GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+                               GCC_OPTIMIZATION_LEVEL = 2;
+                               HEADER_SEARCH_PATHS = (
+                                       "$(WX_SRC_ROOT)/include/",
+                                       "$(WX_SRC_ROOT)/src/build/include",
+                               );
+                               LIBRARY_SEARCH_PATHS = "";
+                               MACOSX_DEPLOYMENT_TARGET = 10.4;
+                               SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+                               USER_HEADER_SEARCH_PATHS = "";
+                               WX_SRC_ROOT = "/Applications/wxMac-2.8.6";
+                       };
+                       name = Release;
+               };
+               F08B4C490AB0B10000896399 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS = (
+                                       "_FILE_OFFSET_BITS=64",
+                                       _LARGE_FILES,
+                                       __WXMAC__,
+                               );
+                               GCC_VERSION = 4.0;
+                               HEADER_SEARCH_PATHS = (
+                                       "/usr/local/lib/wx/include/mac-unicode-release-static-2.8",
+                                       "/usr/local/include/wx-2.8",
+                                       /Library/Frameworks/sndfile.framework/Headers,
+                               );
+                               INFOPLIST_FILE = "ShapeFusion-Info.plist";
+                               LIBRARY_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "$(WX_LIB_ROOT)",
+                               );
+                               OTHER_LDFLAGS = (
+                                       "-framework",
+                                       IOKit,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       System,
+                                       "-framework",
+                                       QuickTime,
+                                       "-framework",
+                                       OpenGL,
+                                       "-framework",
+                                       AGL,
+                                       "/usr/local/lib/libwx_macu_richtext-2.8.a",
+                                       "/usr/local/lib/libwx_macu_aui-2.8.a",
+                                       "/usr/local/lib/libwx_macu_xrc-2.8.a",
+                                       "/usr/local/lib/libwx_macu_qa-2.8.a",
+                                       "/usr/local/lib/libwx_macu_html-2.8.a",
+                                       "/usr/local/lib/libwx_macu_adv-2.8.a",
+                                       "/usr/local/lib/libwx_macu_core-2.8.a",
+                                       "/usr/local/lib/libwx_base_carbonu_xml-2.8.a",
+                                       "/usr/local/lib/libwx_base_carbonu_net-2.8.a",
+                                       "/usr/local/lib/libwx_base_carbonu-2.8.a",
+                                       "-framework",
+                                       WebKit,
+                                       "-lwxregexu-2.8",
+                                       "-lwxexpat-2.8",
+                                       "-lwxtiff-2.8",
+                                       "-lwxjpeg-2.8",
+                                       "-lwxpng-2.8",
+                                       "-lz",
+                                       "-lpthread",
+                                       "-liconv",
+                               );
+                               PRODUCT_NAME = ShapeFusion;
+                               WRAPPER_EXTENSION = app;
+                               WX_LIB_ROOT = /usr/local/lib;
+                               WX_SRC_ROOT = /usr/local/lib/wx;
+                               _FILE_OFFSET_BITS = "64 _LARGE_FILES __WXMAC__";
+                       };
+                       name = Debug;
+               };
+               F08B4C4A0AB0B10000896399 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               DEAD_CODE_STRIPPING = YES;
+                               GCC_PREPROCESSOR_DEFINITIONS = (
+                                       "_FILE_OFFSET_BITS=64",
+                                       _LARGE_FILES,
+                                       __WXMAC__,
+                               );
+                               GCC_VERSION = 4.0;
+                               HEADER_SEARCH_PATHS = (
+                                       "/usr/local/lib/wx/include/mac-unicode-release-static-2.8",
+                                       "/usr/local/include/wx-2.8",
+                                       /Library/Frameworks/sndfile.framework/Headers,
+                               );
+                               INFOPLIST_FILE = "ShapeFusion-Info.plist";
+                               LIBRARY_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "$(WX_LIB_ROOT)",
+                               );
+                               OTHER_LDFLAGS = (
+                                       "-framework",
+                                       IOKit,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       System,
+                                       "-framework",
+                                       QuickTime,
+                                       "-framework",
+                                       OpenGL,
+                                       "-framework",
+                                       AGL,
+                                       "/usr/local/lib/libwx_macu_richtext-2.8.a",
+                                       "/usr/local/lib/libwx_macu_aui-2.8.a",
+                                       "/usr/local/lib/libwx_macu_xrc-2.8.a",
+                                       "/usr/local/lib/libwx_macu_qa-2.8.a",
+                                       "/usr/local/lib/libwx_macu_html-2.8.a",
+                                       "/usr/local/lib/libwx_macu_adv-2.8.a",
+                                       "/usr/local/lib/libwx_macu_core-2.8.a",
+                                       "/usr/local/lib/libwx_base_carbonu_xml-2.8.a",
+                                       "/usr/local/lib/libwx_base_carbonu_net-2.8.a",
+                                       "/usr/local/lib/libwx_base_carbonu-2.8.a",
+                                       "-framework",
+                                       WebKit,
+                                       "-lwxregexu-2.8",
+                                       "-lwxexpat-2.8",
+                                       "-lwxtiff-2.8",
+                                       "-lwxjpeg-2.8",
+                                       "-lwxpng-2.8",
+                                       "-lz",
+                                       "-lpthread",
+                                       "-liconv",
+                               );
+                               PRODUCT_NAME = ShapeFusion;
+                               STRIP_INSTALLED_PRODUCT = YES;
+                               WRAPPER_EXTENSION = app;
+                               WX_LIB_ROOT = /usr/local/lib;
+                               WX_SRC_ROOT = /usr/local/lib/wx;
+                               _FILE_OFFSET_BITS = "64 _LARGE_FILES __WXMAC__";
+                       };
+                       name = Release;
+               };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+               F08B4B5B0AB0ADBA00896399 /* Build configuration list for PBXProject "ShapeFusion" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               F08B4B5C0AB0ADBA00896399 /* Debug */,
+                               F08B4B5D0AB0ADBA00896399 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               F08B4C480AB0B10000896399 /* Build configuration list for PBXNativeTarget "ShapeFusion" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               F08B4C490AB0B10000896399 /* Debug */,
+                               F08B4C4A0AB0B10000896399 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+/* End XCConfigurationList section */
+       };
+       rootObject = F08B4B5A0AB0ADBA00896399 /* Project object */;
+}
diff --git a/ShapeFusionApp.cpp b/ShapeFusionApp.cpp
new file mode 100644 (file)
index 0000000..bbc537c
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "ShapeFusionApp.h"
+#include "ShapeFusionMenus.h"
+#include "ShapesDocument.h"
+#include "ShapesView.h"
+#include "SoundsDocument.h"
+#include "SoundsView.h"
+#include "PhysicsDocument.h"
+#include "PhysicsView.h"
+
+ShapeFusionMain *frame = (ShapeFusionMain *)NULL;
+
+IMPLEMENT_APP(ShapeFusionApp)
+
+ShapeFusionApp::ShapeFusionApp(void)
+{
+    m_docManager = (ShapeFusionDocManager *)NULL;
+}
+
+bool ShapeFusionApp::OnInit(void)
+{
+       if (!wxApp::OnInit())
+               return false;
+       
+       // so that we can import every sort of bitmap format
+       wxInitAllImageHandlers();
+               
+       // Create a document manager
+       m_docManager = new ShapeFusionDocManager;
+
+       // Create a template relating drawing documents to their views
+       (void) new wxDocTemplate(m_docManager, _T("Shapes"), _T("*"), _T(""), _T(""), _T("Shapes"), _T("Shapes"),
+               CLASSINFO(ShapesDocument), CLASSINFO(ShapesView));
+       (void) new wxDocTemplate(m_docManager, _T("Sounds"), _T("*"), _T(""), _T(""), _T("Sounds"), _T("Sounds"),
+               CLASSINFO(SoundsDocument), CLASSINFO(SoundsView));
+
+       (void) new wxDocTemplate(m_docManager, _T("Physics"), _T("*"), _T(""), _T(""), _T("Physics"), _T("Physics"), CLASSINFO(PhysicsDocument), CLASSINFO(PhysicsView));
+
+#ifdef __WXMAC__
+       //TODO: Put correct file extension values here
+//    wxFileName::MacRegisterDefaultTypeAndCreator( wxT("*") , 'WXMB' , 'WXMA' );
+//    wxFileName::MacRegisterDefaultTypeAndCreator( wxT("*") , 'WXMB' , 'WXMA' );
+#endif
+    
+    // Create the main frame window
+#ifdef __WXMAC__
+       // a hack to make the frame invisible on MacOS, which is more Mac-like
+       // http://www.wxwidgets.org/wiki/index.php/WxMac_Issues#The_Mac_OS_menu_bar
+       frame = new ShapeFusionMain(m_docManager, (wxFrame *)NULL, wxID_ANY, _T("ShapeFusion Workspace"), wxPoint(5,5), wxSize(0,0), 0);
+#else
+    frame = new ShapeFusionMain(m_docManager, (wxFrame *)NULL, wxID_ANY, _T("ShapeFusion Workspace"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE);
+#endif
+
+    // Give it an icon (this is ignored in MDI mode: uses resources)
+#ifdef __WXMSW__
+    frame->SetIcon(wxIcon(_T("doc_icn")));
+#endif
+
+    wxMenuBar *menu_bar = new wxMenuBar;
+
+       CreateFileMenu(menu_bar);
+       CreateEditMenu(menu_bar);
+       CreateHelpMenu(menu_bar);
+    
+       // Associate the menu bar with the frame
+       frame->SetMenuBar(menu_bar);
+
+       //FIXME: This doesn't work
+       //wxMenuItem *menuItem = menu_bar->FindItem(FILE_MENU_HISTORY);
+       //m_docManager->FileHistoryUseMenu(menuItem->GetMenu());
+    
+    frame->Centre(wxBOTH);
+    frame->Show(true);
+    
+    SetTopWindow(frame);
+    return true;
+}
+
+int ShapeFusionApp::OnExit(void)
+{
+    delete m_docManager;
+    return 0;
+}
+
+/*
+* Centralised code for creating a document frame.
+* Called when a new view is created (after a New/Open event)
+*/
+wxFrame *ShapeFusionApp::CreateChildFrame(wxDocument *doc, wxView *view, const wxString title, wxPoint point, wxSize size, long style)
+{
+    // Make a child frame
+    wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, GetMainFrame(), wxID_ANY, title,
+        point, size, style);
+    
+    wxMenuBar *menu_bar = new wxMenuBar;
+    
+       CreateFileMenu(menu_bar);
+    CreateEditMenu(menu_bar);
+       CreateHelpMenu(menu_bar);
+       
+    // Associate the menu bar with the frame
+    subframe->SetMenuBar(menu_bar);
+       
+       //FIXME: This doesn't work
+       //wxMenuItem *menuItem = menu_bar->FindItem(FILE_MENU_HISTORY);
+       //m_docManager->FileHistoryUseMenu(menuItem->GetMenu());
+       
+    subframe->Centre(wxBOTH);
+    
+    return subframe;
+}
+
+ShapeFusionMain *GetMainFrame(void)
+{
+    return frame;
+}
diff --git a/ShapeFusionApp.h b/ShapeFusionApp.h
new file mode 100644 (file)
index 0000000..2a7283a
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef SHAPEFUSIONAPP_H
+#define SHAPEFUSIONAPP_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "wx/docview.h"
+#include "ShapeFusionDocManager.h"
+#include "ShapeFusionMain.h"
+
+class ShapeFusionApp: public wxApp {
+public:
+       ShapeFusionApp(void);
+       bool OnInit(void);
+       int OnExit(void);
+       
+       wxFrame *CreateChildFrame(wxDocument *doc, wxView *view, const wxString title, wxPoint point, wxSize size, long style = wxDEFAULT_FRAME_STYLE);
+
+protected:
+       ShapeFusionDocManager*  m_docManager;
+};
+
+DECLARE_APP(ShapeFusionApp);
+
+ShapeFusionMain *GetMainFrame(void);
+
+#endif
diff --git a/ShapeFusionDocManager.cpp b/ShapeFusionDocManager.cpp
new file mode 100644 (file)
index 0000000..d98f240
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "ShapeFusionDocManager.h"
+
+#include "BigEndianBuffer.h"
+
+#include <wx/filename.h>
+#include <wx/wfstream.h>
+
+static wxDocTemplate* FindTemplate(wxList& templates, const wxString& description)
+{
+       for (unsigned int i = 0; i < templates.GetCount(); ++i) {
+               wxDocTemplate* temp = reinterpret_cast<wxDocTemplate*>(templates.Item(i)->GetData());
+               if (temp->GetDescription() == description) {
+                       return temp;
+               }
+       }
+
+       return 0;
+} 
+
+wxDocTemplate* ShapeFusionDocManager::FindTemplateForPath(const wxString& path)
+{
+       // if we recognize the extension, assume it's correct
+       wxFileName filename(path);
+       wxString ext = filename.GetExt();
+       
+       if (ext == _("sndA") || ext == _("snd2")) {
+               return ::FindTemplate(GetTemplates(), _("Sounds"));
+       } else if (ext == _("shpA") || ext == _("shp2")) {
+               return ::FindTemplate(GetTemplates(), _("Shapes"));
+       }
+
+       wxFileInputStream stream(path);
+       if (!stream.IsOk()) {
+               return 0;
+       }
+
+
+       // check for sounds file
+       {
+               stream.SeekI(0, wxFromStart);
+
+               unsigned char header[8];
+               stream.Read(header, 8);
+
+               BigEndianBuffer buffer(header, 4);
+               
+               unsigned long version = buffer.ReadULong();
+               if ((version == 0 || version == 1) 
+                   && strncmp(reinterpret_cast<const char*>(&header[4]), "snd2", 4) == 0) {
+                       return ::FindTemplate(GetTemplates(), _("Sounds"));
+               }
+       }
+
+       stream.SeekI(0, wxFromEnd);
+       long filesize = stream.TellI();
+       stream.SeekI(0, wxFromStart);
+
+       // check for shapes file
+       {
+               bool is_shapes = true;
+               for (int i = 0; i < 32; ++i) {
+                       unsigned char header[32];
+                       stream.Read(header, 32);
+                       
+                       BigEndianBuffer buffer(header, 20);
+                       unsigned long status_flags = buffer.ReadULong();
+                       long offset = buffer.ReadLong();
+                       long length = buffer.ReadLong();
+                       long offset16 = buffer.ReadLong();
+                       long length16 = buffer.ReadLong();
+
+                       if (status_flags != 0
+                           || (offset != -1 && (offset >= filesize || offset + length > filesize))
+                           || (offset16 != -1 && (offset16 >= filesize || offset16 + length16 > filesize))) {
+                               is_shapes = false;
+                               break;
+                       }
+               }
+
+               if (is_shapes) {
+                       return ::FindTemplate(GetTemplates(), _("Shapes"));
+               }
+       }
+
+       // check for physics
+       {
+               stream.SeekI(0, wxFromStart);
+               unsigned char header[128];
+               stream.Read(header, 128);
+               
+               BigEndianBuffer header_buffer(header, 128);
+               int version = header_buffer.ReadShort();
+               int data_version = header_buffer.ReadShort();
+               if ((version == 0 || version == 1 || version == 2 || version == 4) && (data_version == 0 || data_version == 1 || data_version == 2)) {
+                       header_buffer.Position(72);
+                       long directory_offset = header_buffer.ReadLong();
+                       if (directory_offset >= filesize)
+                               return 0;
+
+                       unsigned char tag[4];
+                       stream.Read(tag, 4);
+                       if (strncmp(reinterpret_cast<const char*>(tag), "MNpx", 4) == 0) {
+                               return ::FindTemplate(GetTemplates(), _("Physics"));
+                       }
+               }
+       }
+       
+       return 0;       
+}
+
+wxDocTemplate* ShapeFusionDocManager::SelectDocumentPath(wxDocTemplate** templates, int noTemplates, wxString& path, long, bool)
+{
+       wxString pathTmp = wxFileSelector(_("Select a file"),
+                                           m_lastDirectory);
+
+       wxDocTemplate* theTemplate = 0;
+
+       if (!pathTmp.empty()) {
+               if (!wxFileExists(pathTmp))
+               {
+                       wxString msgTitle;
+                       if (!wxTheApp->GetAppName().empty()) {
+                               msgTitle = wxTheApp->GetAppName();
+                       } else {
+                               msgTitle = wxString(_("File error"));
+                       }
+
+                       (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK | wxICON_EXCLAMATION);
+                       
+                       path = wxEmptyString;
+                       return 0;
+               }
+               m_lastDirectory = wxPathOnly(pathTmp);
+               
+               path = pathTmp;
+
+               theTemplate = FindTemplateForPath(path);
+               
+               if (!theTemplate)
+               {
+                       (void) wxMessageBox(_("Sorry, the format for this file is unknown."), _("Open File"), wxOK | wxICON_EXCLAMATION);
+               }
+               
+               return FindTemplateForPath(path);
+       } else {
+               path = wxEmptyString;
+       }
+
+       return theTemplate;
+                                           
+}
diff --git a/ShapeFusionDocManager.h b/ShapeFusionDocManager.h
new file mode 100644 (file)
index 0000000..f29578b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef SHAPEFUSIONDOCMANAGER_H
+#define SHAPEFUSIONDOCMANAGER_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+#include "wx/docview.h"
+
+class ShapeFusionDocManager : public wxDocManager {
+public:
+       wxDocTemplate* SelectDocumentPath(wxDocTemplate** templates, int noTemplates, wxString& path, long flags, bool save);
+       wxDocTemplate* FindTemplateForPath(const wxString& path);
+};
+
+#endif
diff --git a/ShapeFusionMain.cpp b/ShapeFusionMain.cpp
new file mode 100644 (file)
index 0000000..636b3d7
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "ShapeFusionMain.h"
+#include "ShapeFusionMenus.h"
+
+/*
+* This is the top-level window of the application.
+*/
+
+IMPLEMENT_CLASS(ShapeFusionMain, wxDocParentFrame)
+BEGIN_EVENT_TABLE(ShapeFusionMain, wxDocParentFrame)
+    EVT_MENU(ABOUT_MENU, ShapeFusionMain::OnAbout)
+    EVT_MENU_RANGE(FILE_HISTORY_FILE1, FILE_HISTORY_FILE9, ShapeFusionMain::OnMenuHistory)
+END_EVENT_TABLE()
+
+ShapeFusionMain::ShapeFusionMain(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title,
+                 const wxPoint& pos, const wxSize& size, const long type):
+wxDocParentFrame(manager, frame, id, title, pos, size, type)
+{
+}
+
+void ShapeFusionMain::OnAbout(wxCommandEvent& WXUNUSED(event))
+{
+        wxMessageDialog *dlg = new wxMessageDialog(this,
+                                                               wxT("ShapeFusion 0.5\nhttp://shapefusion.sourceforge.net\n\nCopyright 2000-2008, Tito Dal Canton\n\n"
+                                                                       "An editor for Marathon II, Marathon Infinity and AlephOne shapes and sounds files. "
+                                                                       "Released under the terms of the GNU General Public License: for more information "
+                                                                       "see the COPYING file that comes with ShapeFusion."),
+                                                               wxT("About ShapeFusion"), wxOK | wxICON_INFORMATION);
+        dlg->ShowModal();
+        dlg->Destroy();
+}
+
+void ShapeFusionMain::OnMenuHistory(wxCommandEvent& event)
+{
+       wxString f(m_docManager->GetHistoryFile(event.GetId() - FILE_HISTORY_FILE1));
+       if (!f.empty())
+               (void)m_docManager->CreateDocument(f, wxDOC_SILENT);
+}
+
diff --git a/ShapeFusionMain.h b/ShapeFusionMain.h
new file mode 100644 (file)
index 0000000..953ad53
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __FUSIONMAIN_H__
+#define __FUSIONMAIN_H__
+
+#include "wx/docview.h"
+
+// Define a new frame
+class ShapeFusionMain: public wxDocParentFrame
+{
+       DECLARE_CLASS(FusionMain)
+
+public:
+       ShapeFusionMain(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title,
+                                       const wxPoint& pos, const wxSize& size, const long type);
+       void OnAbout(wxCommandEvent& event);
+       void OnMenuHistory(wxCommandEvent& event);
+       
+       DECLARE_EVENT_TABLE()
+};
+
+#endif
+
diff --git a/ShapeFusionMenus.cpp b/ShapeFusionMenus.cpp
new file mode 100644 (file)
index 0000000..5358fdc
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "ShapeFusionMenus.h"
+
+void CreateFileMenu(wxMenuBar *menu_bar)
+{
+       wxMenu  *file_menu,
+                       *recent_file_menu;
+/*                     *file_new_menu,
+                       *file_open_menu;*/
+       
+       // We create our two submenus
+/*     file_new_menu = new wxMenu();
+       file_new_menu->Append(FILE_MENU_NEW_SHAPES, wxT("Shapes file"));
+       file_new_menu->Append(FILE_MENU_NEW_PHYSICS, wxT("Physics file"));
+       file_new_menu->Append(FILE_MENU_NEW_MAP, wxT("Map file"));
+       file_new_menu->Append(FILE_MENU_NEW_SOUNDS, wxT("Sounds file"));
+       file_open_menu = new wxMenu();
+       file_open_menu->Append(FILE_MENU_OPEN_SHAPES, wxT("Shapes file"));
+       file_open_menu->Append(FILE_MENU_OPEN_PHYSICS, wxT("Physics file"));
+       file_open_menu->Append(FILE_MENU_OPEN_MAP, wxT("Map file"));
+       file_open_menu->Append(FILE_MENU_OPEN_SOUNDS, wxT("Sounds file"));*/
+       // We create the recent menu here...
+       recent_file_menu = new wxMenu();
+       
+       // We create the 'main' File menu
+       file_menu = new wxMenu();
+//     file_menu->Append(FILE_MENU_NEW, wxT("New..."), file_new_menu);
+//     file_menu->Append(FILE_MENU_OPEN, wxT("Open..."), file_open_menu);
+//     file_menu->Append(FILE_MENU_NEW, wxT("New...\tCtrl+N"));
+       file_menu->Append(FILE_MENU_OPEN, wxT("Open...\tCtrl+O"));
+       file_menu->Append(FILE_MENU_HISTORY, wxT("Open Recent..."), recent_file_menu);
+       file_menu->Append(FILE_MENU_CLOSE, wxT("&Close\tCtrl+W"));
+       file_menu->AppendSeparator();
+       file_menu->Append(FILE_MENU_SAVE, wxT("&Save\tCtrl+S"));
+       file_menu->Append(FILE_MENU_SAVEAS, wxT("Save as...\tCtrl+Shift+S"));
+       file_menu->Append(FILE_MENU_REVERT, wxT("&Revert"));
+       file_menu->AppendSeparator();
+       file_menu->Append(FILE_MENU_PRINT, _T("&Print..."));
+       file_menu->Append(FILE_MENU_PRINT_SETUP, _T("Print &Setup..."));
+       file_menu->Append(FILE_MENU_PREVIEW, _T("Print Pre&view"));
+       file_menu->AppendSeparator();
+       file_menu->Append(FILE_MENU_QUIT, wxT("&Quit\tAlt+F4"));
+       
+       file_menu->Enable(FILE_MENU_SAVE, false);
+       file_menu->Enable(FILE_MENU_SAVEAS, false);
+       file_menu->Enable(FILE_MENU_CLOSE, false);
+       
+       // We add the File menu to the passed menubar
+       menu_bar->Append(file_menu, wxT("&File"));
+}
+
+void CreateEditMenu(wxMenuBar *menu_bar)
+{
+       wxMenu  *edit_menu;
+       
+       edit_menu = new wxMenu();
+       edit_menu->Append(EDIT_MENU_UNDO, wxT("&Undo\tCtrl+Z"));
+       edit_menu->Append(EDIT_MENU_REDO, wxT("&Redo\tCtrl+Shift+Z"));
+    edit_menu->AppendSeparator();
+       edit_menu->Append(EDIT_MENU_CUT, wxT("&Cut\tCtrl+X"));
+       edit_menu->Append(EDIT_MENU_COPY, wxT("&Copy\tCtrl+C"));
+       edit_menu->Append(EDIT_MENU_PASTE, wxT("&Paste\tCtrl+V"));
+    edit_menu->AppendSeparator();
+       edit_menu->Append(EDIT_MENU_DELETE, wxT("&Delete"));
+       
+       edit_menu->Enable(EDIT_MENU_CUT, false);
+       edit_menu->Enable(EDIT_MENU_COPY, false);
+       edit_menu->Enable(EDIT_MENU_PASTE, false);
+       edit_menu->Enable(EDIT_MENU_DELETE, false);
+       
+       // We add the Edit menu to the passed menubar
+       menu_bar->Append(edit_menu, wxT("&Edit"));
+}
+
+void CreateHelpMenu(wxMenuBar *menu_bar)
+{
+       wxMenu *help_menu;
+       
+       help_menu = new wxMenu();
+       help_menu->Append(ABOUT_MENU, wxT("About ShapeFusion"));
+       help_menu->Append(HELP_MENU, wxT("ShapeFusion Help"));
+
+       menu_bar->Append(help_menu, wxT("&Help"));
+}
+
+void CreateViewMenu(wxMenuBar *menu_bar)
+{
+       // view menu
+       wxMenu  *view_menu,
+                       *view_colortable_submenu,
+                       *view_tnsize_submenu;
+       
+       // We create our two submenus
+       view_colortable_submenu = new wxMenu();
+       for (unsigned int i = 0; i < 8; i++) {
+               view_colortable_submenu->AppendRadioItem(VIEW_MENU_COLORTABLE_0 + i, wxString::Format(wxT("%d"), i));
+               view_colortable_submenu->Enable(VIEW_MENU_COLORTABLE_0 + i, false);
+       }
+       
+       view_tnsize_submenu = new wxMenu();
+       view_tnsize_submenu->AppendRadioItem(VIEW_MENU_TNSIZE_SMALL, wxT("Small"));
+       view_tnsize_submenu->AppendRadioItem(VIEW_MENU_TNSIZE_MEDIUM, wxT("Medium"));
+       view_tnsize_submenu->AppendRadioItem(VIEW_MENU_TNSIZE_LARGE, wxT("Large"));
+       view_tnsize_submenu->AppendRadioItem(VIEW_MENU_TNSIZE_AUTO, wxT("Best fit"));
+       for (unsigned int i = VIEW_MENU_TNSIZE_SMALL; i <= VIEW_MENU_TNSIZE_AUTO; i++)
+               view_tnsize_submenu->Check(i, i == VIEW_MENU_TNSIZE_MEDIUM);
+       
+       // Now the main View menu
+       view_menu = new wxMenu();
+       view_menu->Append(VIEW_MENU_COLOR_TABLE, wxT("Use color table"), view_colortable_submenu);
+       view_menu->Append(VIEW_MENU_THUMBNAIL_SIZE, wxT("Thumbnail size"), view_tnsize_submenu);
+       view_menu->AppendCheckItem(VIEW_MENU_TRANSPARENCY, wxT("Show transparent pixels"));
+       view_menu->AppendCheckItem(VIEW_MENU_CENTERORIGIN, wxT("Fix frame origins"));
+
+       // We add that to the passed menubar
+       menu_bar->Append(view_menu, wxT("&View"));
+}
+
+void CreateShapesMenu(wxMenuBar *menu_bar)
+{
+       wxMenu *shapes_menu;
+       
+       // We create and build the Shapes menu
+       shapes_menu = new wxMenu();
+       shapes_menu->Append(SHAPES_MENU_ADDCOLORTABLE, wxT("New color table..."));
+       shapes_menu->Append(SHAPES_MENU_SAVECOLORTABLE, wxT("Export color table to GIMP..."));
+       shapes_menu->Append(SHAPES_MENU_SAVECOLORTABLETOPS, wxT("Export color table to PhotoShop..."));
+       shapes_menu->AppendSeparator();
+       shapes_menu->Append(SHAPES_MENU_ADDBITMAP, wxT("New bitmap..."));
+       shapes_menu->Append(SHAPES_MENU_EXPORTBITMAP, wxT("Export bitmap..."));
+       shapes_menu->Append(SHAPES_MENU_EXPORTMASK, wxT("Export bitmap mask..."));
+       shapes_menu->Append(SHAPES_MENU_EXPORTBITMAPS, wxT("Export all bitmaps..."));
+       shapes_menu->Append(SHAPES_MENU_EXPORTMASKS, wxT("Export all bitmap masks..."));
+       shapes_menu->AppendSeparator();
+       shapes_menu->Append(SHAPES_MENU_ADDFRAME, wxT("New frame"));
+       shapes_menu->AppendSeparator();
+       shapes_menu->Append(SHAPES_MENU_ADDSEQUENCE, wxT("New sequence"));
+       shapes_menu->AppendSeparator();
+       shapes_menu->Append(SHAPES_MENU_IMPORTPATCH, wxT("Apply Shapes Patch..."));
+       shapes_menu->Append(SHAPES_MENU_GENERATEPATCH, wxT("Export Shapes Patch..."));
+       
+       // Let's disable all these items...
+       shapes_menu->Enable(SHAPES_MENU_ADDCOLORTABLE, false);
+       shapes_menu->Enable(SHAPES_MENU_SAVECOLORTABLE, false);
+       shapes_menu->Enable(SHAPES_MENU_SAVECOLORTABLETOPS, false);
+       shapes_menu->Enable(SHAPES_MENU_ADDBITMAP, false);
+       shapes_menu->Enable(SHAPES_MENU_EXPORTBITMAP, false);
+       shapes_menu->Enable(SHAPES_MENU_EXPORTMASK, false);
+       shapes_menu->Enable(SHAPES_MENU_EXPORTBITMAPS, false);
+       shapes_menu->Enable(SHAPES_MENU_EXPORTMASKS, false);
+       shapes_menu->Enable(SHAPES_MENU_ADDFRAME, false);
+       shapes_menu->Enable(SHAPES_MENU_ADDSEQUENCE, false);
+       
+       // .. and add the whole to the menuBar
+       menu_bar->Append(shapes_menu, wxT("&Shapes"));
+}
+
+void CreateSoundsMenu(wxMenuBar *menu_bar)
+{
+       wxMenu  *sounds_menu;
+       
+       // We create and build the Sounds menu
+       sounds_menu = new wxMenu();
+       sounds_menu->Append(SOUNDS_MENU_ADDCLASS, wxT("Add new sound class"));
+       sounds_menu->AppendSeparator();
+       sounds_menu->Append(SOUNDS_MENU_EXPORT, wxT("Export selected sound"));
+       sounds_menu->Append(SOUNDS_MENU_IMPORT, wxT("Import sound"));
+       
+       // Let's disable them ...
+       sounds_menu->Enable(SOUNDS_MENU_ADDCLASS, false);
+       sounds_menu->Enable(SOUNDS_MENU_EXPORT, false);
+       sounds_menu->Enable(SOUNDS_MENU_IMPORT, false);
+       
+       // ... and add the whole to the menu_bar
+       menu_bar->Append(sounds_menu, wxT("S&ounds"));
+}
+
diff --git a/ShapeFusionMenus.h b/ShapeFusionMenus.h
new file mode 100644 (file)
index 0000000..aac651a
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef SHAPEFUSIONMENUS_H
+#define SHAPEFUSIONMENUS_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+
+enum {
+       // Application Menus (we just use wx Indexes here)
+       FILE_MENU_NEW = wxID_NEW,
+       FILE_MENU_OPEN = wxID_OPEN,
+       FILE_MENU_CLOSE = wxID_CLOSE,
+       FILE_MENU_QUIT = wxID_EXIT,
+       FILE_MENU_SAVE = wxID_SAVE,
+       FILE_MENU_SAVEAS = wxID_SAVEAS,
+       FILE_MENU_REVERT = wxID_REVERT,
+       FILE_MENU_PRINT = wxID_PRINT,
+       FILE_MENU_PRINT_SETUP = wxID_PRINT_SETUP,
+       FILE_MENU_PREVIEW = wxID_PREVIEW,
+       ABOUT_MENU = wxID_ABOUT,
+       HELP_MENU = wxID_HELP,
+       FILE_HISTORY_FILE1 = wxID_FILE1,
+       FILE_HISTORY_FILE9 = wxID_FILE9,
+       // Edit Menu
+       EDIT_MENU_UNDO = wxID_UNDO,
+       EDIT_MENU_REDO = wxID_REDO,
+       EDIT_MENU_CUT = wxID_CUT,
+       EDIT_MENU_COPY = wxID_COPY,
+       EDIT_MENU_PASTE = wxID_PASTE,
+       EDIT_MENU_DELETE = wxID_DELETE,
+       // We put our menus that don't come from wx here,
+       // so they'll have menu ID starting from 1
+       FILE_MENU_NEW_SHAPES = 1,
+       FILE_MENU_NEW_PHYSICS,
+       FILE_MENU_NEW_MAP,
+       FILE_MENU_NEW_SOUNDS,
+       FILE_MENU_OPEN_SHAPES,
+       FILE_MENU_OPEN_PHYSICS,
+       FILE_MENU_OPEN_MAP,
+       FILE_MENU_OPEN_SOUNDS,
+       FILE_MENU_HISTORY,
+       // Shapes editing menus
+       // View Menu
+       VIEW_MENU_TRANSPARENCY,
+       VIEW_MENU_CENTERORIGIN,
+       // Thumbnails submenu
+       VIEW_MENU_THUMBNAIL_SIZE,
+       VIEW_MENU_TNSIZE_SMALL,
+       VIEW_MENU_TNSIZE_MEDIUM,
+       VIEW_MENU_TNSIZE_LARGE,
+       VIEW_MENU_TNSIZE_AUTO,
+       // Color Tables submenu
+       VIEW_MENU_COLOR_TABLE,
+       VIEW_MENU_COLORTABLE_0,
+       VIEW_MENU_COLORTABLE_7 = VIEW_MENU_COLORTABLE_0 + 7,
+       // Shapes menu
+       SHAPES_MENU_ADDCOLORTABLE,
+       SHAPES_MENU_SAVECOLORTABLE,
+       SHAPES_MENU_SAVECOLORTABLETOPS,
+       SHAPES_MENU_ADDBITMAP,
+       SHAPES_MENU_EXPORTBITMAP,
+       SHAPES_MENU_EXPORTMASK,
+       SHAPES_MENU_EXPORTBITMAPS,
+       SHAPES_MENU_EXPORTMASKS,
+       SHAPES_MENU_ADDFRAME,
+       SHAPES_MENU_ADDSEQUENCE,
+       SHAPES_MENU_GENERATEPATCH,
+       SHAPES_MENU_IMPORTPATCH,
+       // Sounds menu
+       SOUNDS_MENU_ADDCLASS,
+       SOUNDS_MENU_EXPORT,
+       SOUNDS_MENU_IMPORT
+};
+
+void CreateFileMenu(wxMenuBar *menu_bar);
+void CreateEditMenu(wxMenuBar *menu_bar);
+void CreateHelpMenu(wxMenuBar *menu_bar);
+void CreateViewMenu(wxMenuBar *menu_bar);
+void CreateShapesMenu(wxMenuBar *menu_bar);
+void CreateSoundsMenu(wxMenuBar *menu_bar);
+#endif
+
diff --git a/Shapes/BitmapBrowser.cpp b/Shapes/BitmapBrowser.cpp
new file mode 100644 (file)
index 0000000..e3a69c4
--- /dev/null
@@ -0,0 +1,390 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include "wx/image.h"
+#include "BitmapBrowser.h"
+#include "utilities.h"
+
+DEFINE_EVENT_TYPE(wxEVT_BITMAPBROWSER)
+DEFINE_EVENT_TYPE(wxEVT_BITMAPBROWSER_DELETE)
+
+BEGIN_EVENT_TABLE(BitmapBrowser, wxScrolledWindow)
+       EVT_PAINT(BitmapBrowser::OnPaint)
+       EVT_SIZE(BitmapBrowser::OnSize)
+       EVT_LEFT_DOWN(BitmapBrowser::OnMouseDown)
+       EVT_RIGHT_DOWN(BitmapBrowser::OnMouseDown)
+       EVT_KEY_DOWN(BitmapBrowser::OnKeyDown)
+END_EVENT_TABLE()
+
+BitmapBrowser::BitmapBrowser(wxWindow *parent, wxWindowID id):
+       wxScrolledWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER | wxFULL_REPAINT_ON_RESIZE),
+       mColorTable(NULL), mSelection(-1), mNumCols(0), mNumRows(0), mFrozenCount(0)
+{
+       SetBackgroundColour(wxColour(255, 255, 255));
+       mThumbnailPen.SetColour(200, 200, 200);
+       mSelectionPen.SetColour(0, 0, 0);
+       mSelectionPen.SetWidth(3);
+       SetScrollRate(0, 2);
+       mThumbnailSize = 64;
+       mMargin = 7;
+       mWhiteTransparency = true;
+       mAutoSize = false;
+}
+
+void BitmapBrowser::OnPaint(wxPaintEvent& e)
+{
+       wxPaintDC   tempdc(this);
+       int                     cw, ch, rx, ry;
+
+       DoPrepareDC(tempdc);
+       GetClientSize(&cw, &ch);
+       CalcUnscrolledPosition(0, 0, &rx, &ry);
+       // draw thumbnails
+       tempdc.SetPen(mThumbnailPen);
+       tempdc.SetBrush(*wxTRANSPARENT_BRUSH);
+       for (int i = 0; i < (int)mBitmaps.size(); i++) {
+               int     x = mThumbnailPositions[i].x,
+                       y = mThumbnailPositions[i].y;
+
+               if (y + mThumbnailSize < ry)
+                       continue;
+               if (y > ry + ch)
+                       break;
+                       
+               int     bw = mThumbnails[i].GetWidth(),
+                       bh = mThumbnails[i].GetHeight();
+
+               if (i == mSelection) {
+                       tempdc.DrawBitmap(mThumbnails[i], x + mThumbnailSize/2 - bw/2, y + mThumbnailSize/2 - bh/2);
+                       tempdc.SetPen(mSelectionPen);
+                       tempdc.DrawRectangle(x-2, y-2, mThumbnailSize+4, mThumbnailSize+4);
+                       tempdc.SetPen(mThumbnailPen);
+               } else {
+                       tempdc.DrawRectangle(x-1, y-1, mThumbnailSize+2, mThumbnailSize+2);
+                       tempdc.DrawBitmap(mThumbnails[i], x + mThumbnailSize/2 - bw/2, y + mThumbnailSize/2 - bh/2);
+               }
+       }
+}
+
+// widget resized, recalculate virtual size to correctly wrap thumbnails
+void BitmapBrowser::OnSize(wxSizeEvent& e)
+{
+       UpdateVirtualSize();
+}
+
+// handle clicks received by the widget
+void BitmapBrowser::OnMouseDown(wxMouseEvent& e)
+{
+       wxClientDC      dc(this);
+       wxPoint         mouse;
+
+       DoPrepareDC(dc);
+       mouse = e.GetLogicalPosition(dc);
+       switch (e.GetButton()) {
+               case wxMOUSE_BTN_LEFT:
+                       // handle bitmap selection
+                       {
+                               int     new_selection = -1;
+
+                               for (unsigned int i = 0; i < mThumbnailPositions.size(); i++) {
+                                       wxRect  test(mThumbnailPositions[i].x, mThumbnailPositions[i].y, mThumbnailSize, mThumbnailSize);
+
+                                       if (test.Contains(mouse)) {
+                                               new_selection = i;
+                                               break;
+                                       }
+                               }
+                               if (new_selection != mSelection) {
+                                       mSelection = new_selection;
+                                       Refresh();
+
+                                       // send selection event
+                                       wxCommandEvent  event(wxEVT_BITMAPBROWSER, GetId());
+
+                                       event.SetEventObject(this);
+                                       event.SetInt(mSelection);
+                                       GetEventHandler()->ProcessEvent(event);
+                               }
+                       }
+                       break;
+               case wxMOUSE_BTN_RIGHT:
+                       break;
+       }
+       e.Skip();
+}
+
+// handle keydown events
+void BitmapBrowser::OnKeyDown(wxKeyEvent &e)
+{
+       switch (e.GetKeyCode()) {
+               case WXK_LEFT:
+               case WXK_RIGHT:
+               case WXK_UP:
+               case WXK_DOWN:
+                       {
+                               int     new_selection = mSelection;
+
+                               if (mSelection >= 0 && mSelection < (int)mBitmaps.size()) {
+                                       switch (e.GetKeyCode()) {
+                                               case WXK_LEFT:
+                                                       if (mSelection % mNumCols > 0)
+                                                               new_selection--;
+                                                       break;
+                                               case WXK_RIGHT:
+                                                       if (mSelection % mNumCols < (mNumCols-1))
+                                                               new_selection++;
+                                                       break;
+                                               case WXK_UP:
+                                                       if (mSelection / mNumCols > 0)
+                                                               new_selection -= mNumCols;
+                                                       break;
+                                               case WXK_DOWN:
+                                                       if (mSelection / mNumCols < (mNumRows-1))
+                                                               new_selection += mNumCols;
+                                                       break;
+                                       }
+                               } else if (mBitmaps.size() > 0) {
+                                       new_selection = 0;
+                               }
+                               if (new_selection != mSelection && new_selection >= 0
+                                               && new_selection < (int)mBitmaps.size()) {
+                                       // TODO scroll to show the new selection
+                                       mSelection = new_selection;
+                                       Refresh();
+
+                                       // send bitmap selection event
+                                       wxCommandEvent  event(wxEVT_BITMAPBROWSER, GetId());
+
+                                       event.SetEventObject(this);
+                                       event.SetInt(mSelection);
+                                       GetEventHandler()->ProcessEvent(event);
+                               }
+                       }
+                       break;
+               case WXK_DELETE:
+                       // send a bitmap delete event
+                       if (mSelection >= 0 && mSelection < (int)mBitmaps.size()) {
+                               wxCommandEvent  event(wxEVT_BITMAPBROWSER_DELETE, GetId());
+
+                               event.SetEventObject(this);
+                               event.SetInt(mSelection);
+                               GetEventHandler()->ProcessEvent(event);
+                       }
+                       break;
+               default:
+                       e.Skip();
+                       break;
+       }
+}
+
+// the Freeze()/Thaw() combo is necessary to get a reasonably
+// responsive interface. Otherwise we would be doing bursts
+// of UpdateVirtualSize() and potentially RebuildThumbnails()
+// every time the user changes collection
+void BitmapBrowser::Freeze(void)
+{
+       mFrozenCount++;
+}
+
+void BitmapBrowser::Thaw(void)
+{
+       if (mFrozenCount > 0) {
+               mFrozenCount--;
+               if (mFrozenCount == 0) {
+                       UpdateVirtualSize();
+                       Refresh();
+               }
+       }
+}
+
+int BitmapBrowser::GetSelection(void) const
+{
+       return mSelection;
+}
+
+// set the thumbnail size in pixels. Specify -1 to enable best-fit mode.
+void BitmapBrowser::SetThumbnailSize(int size)
+{
+       if (size > 0) {
+               mThumbnailSize = size;
+               mAutoSize = false;
+       } else {
+               mAutoSize = true;
+       }
+       if (mFrozenCount == 0) {
+               UpdateVirtualSize();
+               if (!mAutoSize)
+                       RebuildThumbnails();
+               Refresh();
+       }
+}
+
+void BitmapBrowser::SetTranspPixelsDisplay(bool show)
+{
+       mWhiteTransparency = show;
+       if (mFrozenCount == 0) {
+               RebuildThumbnails();
+               Refresh();
+       }
+}
+
+// add a new ShapesBitmap to the thumbnail list
+void BitmapBrowser::AddBitmap(ShapesBitmap *bp)
+{
+       if (bp != NULL) {
+               if (bp->Pixels() != NULL) {
+                       mBitmaps.push_back(bp);
+                       mThumbnails.push_back(CreateThumbnail(bp));
+                       if (mFrozenCount == 0) {
+                               UpdateVirtualSize();
+                               Refresh();
+                       }
+               } else {
+                       wxLogError(wxT("[BitmapBrowser] Added a bitmap with NULL pixels"));
+               }
+       }
+}
+
+// clear the thumbnail list
+void BitmapBrowser::Clear(void)
+{
+       mThumbnails.clear();
+       mBitmaps.clear();
+       mThumbnailPositions.clear();
+       mSelection = -1;
+       UpdateVirtualSize();
+       if (mFrozenCount == 0)
+               Refresh();
+}
+
+// call before adding bitmaps!
+void BitmapBrowser::SetColorTable(ShapesColorTable *ct)
+{
+       mColorTable = ct;
+       if (mFrozenCount == 0) {
+               RebuildThumbnails();
+               Refresh();
+       }
+}
+
+// calculate and set the wxWindow virtual size, based on the
+// number of thumbnails, thumbnail dimensions and given visible
+// size. Also pre-calculate thumbnail positions
+void BitmapBrowser::UpdateVirtualSize(void)
+{
+       wxClientDC              dc(this);
+       unsigned int    numbitmaps = mBitmaps.size();
+       int                             width, height;
+
+       GetClientSize(&width, &height);
+       if (numbitmaps < 1) {
+               SetVirtualSize(0, 0);
+               return;
+       }
+
+       if (mAutoSize) {
+               // calculate the best mThumbnailSize
+               // (maximum value not requiring window scrolling)
+               int     max_bitmap_dimension = 10,
+                       new_tn_size;
+
+               SetScrollRate(0, 0);
+               // find greatest dimension among all bitmaps
+               for (unsigned int i = 0; i < numbitmaps; i++) {
+                       if (mBitmaps[i]->Width() > max_bitmap_dimension)
+                               max_bitmap_dimension = mBitmaps[i]->Width();
+                       if (mBitmaps[i]->Height() > max_bitmap_dimension)
+                               max_bitmap_dimension = mBitmaps[i]->Height();
+               }
+               // FIXME a better algorithm, without looping?
+               for (new_tn_size = mMargin; ; new_tn_size++) {
+                       int     numcols = (width - mMargin) / (new_tn_size + mMargin),
+                               numrows = (numcols > 0) ? (numbitmaps / numcols) : numbitmaps;
+
+                       if (numrows * numcols < (int)numbitmaps)
+                               numrows++;
+                       int     total_height = numrows * (new_tn_size + mMargin) + mMargin;
+
+                       if (total_height > height || (new_tn_size + 2 * mMargin) > width) {
+                               new_tn_size--;
+                               break;
+                       }
+                       if (new_tn_size >= max_bitmap_dimension) {
+                               // no point in wasting window space with huge
+                               // thumbnails showing small bitmaps at their center
+                               new_tn_size = max_bitmap_dimension;
+                               break;
+                       }
+               }
+               if (new_tn_size != mThumbnailSize) {
+                       mThumbnailSize = new_tn_size;
+                       RebuildThumbnails();
+               }
+       } else {
+               SetScrollRate(0, 2);
+       }
+
+       mNumCols = (width - mMargin) / (mThumbnailSize + mMargin);
+       mNumRows = (mNumCols > 0) ? (numbitmaps / mNumCols) : numbitmaps;
+
+       if (mNumRows * mNumCols < (int)numbitmaps)
+               mNumRows++;
+
+       SetVirtualSize(width, mNumRows * (mThumbnailSize + mMargin) + mMargin);
+
+       // recalculate thumbnail positions
+       int     x = mMargin,
+               y = mMargin;
+
+       mThumbnailPositions.clear();
+       for (unsigned int i = 0; i < numbitmaps; i++) {
+               mThumbnailPositions.push_back(wxPoint(x, y));
+
+               x += mThumbnailSize + mMargin;
+               if (x + mThumbnailSize + mMargin > width) {
+                       x = mMargin;
+                       y += mThumbnailSize + mMargin;
+               }
+       }
+}
+
+// transform a ShapesBitmap to a wxBitmap thumbnail
+wxBitmap BitmapBrowser::CreateThumbnail(ShapesBitmap *bp)
+{
+       wxImage newimg;
+
+       if (mColorTable)
+               newimg = ShapesBitmapToImage(bp, mColorTable, mWhiteTransparency);
+       return ImageThumbnail(newimg, mThumbnailSize, true);
+}
+
+void BitmapBrowser::RebuildThumbnail(unsigned int i)
+{
+       if (i < mBitmaps.size())
+               mThumbnails[i] = CreateThumbnail(mBitmaps[i]);
+}
+
+// just re-decode the ShapesBitmaps to their thumbnail previews,
+// without touching window sizes or thumbnail positions.
+// Useful to update the display at the end of SetColorTable or after
+// altering the ShapesBitmaps
+void BitmapBrowser::RebuildThumbnails(void)
+{
+       for (unsigned int i = 0; i < mBitmaps.size(); i++)
+               mThumbnails[i] = CreateThumbnail(mBitmaps[i]);
+}
+
diff --git a/Shapes/BitmapBrowser.h b/Shapes/BitmapBrowser.h
new file mode 100644 (file)
index 0000000..8ba3b2e
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+//
+// BitmapBrowser
+// A widget for displaying a list of ShapesBitmap's as a scrollable list
+// of selectable thumbnails, which tries to fill the width of the widget
+// and flow accordingly.
+//
+
+#ifndef BITMAPBROWSER_H
+#define BITMAPBROWSER_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "ShapesElements.h"
+
+DECLARE_EVENT_TYPE(wxEVT_BITMAPBROWSER, -1)
+DECLARE_EVENT_TYPE(wxEVT_BITMAPBROWSER_DELETE, -1)
+
+class BitmapBrowser: public wxScrolledWindow {
+private:
+       vector<ShapesBitmap*>   mBitmaps;                       // pointers to the encoded bitmaps
+       vector<wxBitmap>                mThumbnails;            // scaled/rendered bitmap thumbnails
+       ShapesColorTable                *mColorTable;           // which palette to use for display
+       vector<wxPoint>                 mThumbnailPositions;    // thumbnail positions within window
+       wxCoord                                 mThumbnailSize,
+                                                       mMargin;                        // margin between thumbnails and window edges
+       bool                                    mAutoSize,                      // auto-calculate best thumbnail size
+                                                       mWhiteTransparency;     // hide transparent pixels
+       int                                             mSelection,                     // selected thumbnail
+                                                       mNumCols,
+                                                       mNumRows;
+       wxPen                                   mThumbnailPen,
+                                                       mSelectionPen;
+       unsigned int                    mFrozenCount;
+
+       wxBitmap CreateThumbnail(ShapesBitmap *bp);
+       void UpdateVirtualSize(void);
+
+protected:
+       DECLARE_EVENT_TABLE();
+
+public:
+       BitmapBrowser(wxWindow *parent, wxWindowID id);
+       // event handlers
+       void OnPaint(wxPaintEvent& e);
+       void OnSize(wxSizeEvent& e);
+       void OnMouseDown(wxMouseEvent& e);
+       void OnKeyDown(wxKeyEvent& e);
+       // wx things
+       void Freeze(void);
+       void Thaw(void);
+       // access
+       int GetSelection(void) const;
+       void SetThumbnailSize(int size);
+       void SetTranspPixelsDisplay(bool show);
+       void AddBitmap(ShapesBitmap *bp);
+       void SetColorTable(ShapesColorTable *ct);
+       void Clear(void);
+       // utilities
+       void RebuildThumbnail(unsigned int i);
+       void RebuildThumbnails(void);
+};
+
+#endif
diff --git a/Shapes/BitmapView.cpp b/Shapes/BitmapView.cpp
new file mode 100644 (file)
index 0000000..c949df6
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include "BitmapView.h"
+#include "utilities.h"
+
+BEGIN_EVENT_TABLE(BitmapView, wxScrolledWindow)
+       EVT_PAINT(BitmapView::OnPaint)
+       EVT_LEFT_DOWN(BitmapView::OnDrag)
+       EVT_LEFT_UP(BitmapView::OnDrag)
+       EVT_MOTION(BitmapView::OnDrag)
+       EVT_SIZE(BitmapView::OnSize)
+END_EVENT_TABLE()
+
+BitmapView::BitmapView(wxWindow *parent):
+       wxScrolledWindow(parent, -1, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER | wxFULL_REPAINT_ON_RESIZE),
+       mEncBmp(NULL), mColorTable(NULL), mDragging(false)
+{
+       SetBackgroundColour(wxColour(255, 255, 255));
+       SetScrollRate(1, 1);
+       mWhiteTransparency = true;
+       mInvisiblePen.SetColour(255, 255, 255);
+}
+
+void BitmapView::OnPaint(wxPaintEvent& e)
+{
+       wxPaintDC   tempdc(this);
+       int                     vw, vh, cw, ch;
+
+       GetVirtualSize(&vw, &vh);
+       DoPrepareDC(tempdc);
+       GetClientSize(&cw, &ch);
+       tempdc.SetPen(mInvisiblePen);
+       if (mEncBmp != NULL && mColorTable != NULL)
+               tempdc.DrawBitmap(mDecBmp, vw/2 - mDecBmp.GetWidth()/2, vh/2 - mDecBmp.GetHeight()/2);
+}
+
+// handle mouse drag (pan view)
+void BitmapView::OnDrag(wxMouseEvent &e)
+{
+       if (e.ButtonDown()) {
+               // start panning
+               int scroll_x, scroll_y;
+
+               GetViewStart(&scroll_x, &scroll_y);
+               mDragging = true;
+               mDragStartX = e.GetPosition().x + scroll_x;
+               mDragStartY = e.GetPosition().y + scroll_y;
+       } else if (e.Dragging() && mDragging) {
+               // pan
+               int     dx = mDragStartX - e.GetPosition().x,
+                       dy = mDragStartY - e.GetPosition().y;
+
+               Scroll(dx, dy);
+       } else if (e.ButtonUp()) {
+               // end panning
+               mDragging = false;
+       }
+}
+
+void BitmapView::OnSize(wxSizeEvent &e)
+{
+       int cw, ch,
+               vw = (mEncBmp == NULL) ? 0 : mEncBmp->Width(),
+               vh = (mEncBmp == NULL) ? 0 : mEncBmp->Height();
+       
+       GetClientSize(&cw, &ch);
+       if (vw < cw)
+               vw = cw;
+       if (vh < ch)
+               vh = ch;
+       SetVirtualSize(vw, vh);
+}
+
+void BitmapView::SetTranspPixelsDisplay(bool show)
+{
+       mWhiteTransparency = show;
+       if (mEncBmp != NULL && mEncBmp->Pixels() != NULL && mColorTable != NULL)
+               mDecBmp = wxBitmap(ShapesBitmapToImage(mEncBmp, mColorTable, mWhiteTransparency));
+       Refresh();
+}
+
+// add a new ShapesBitmap to the thumbnail list
+void BitmapView::SetBitmap(ShapesBitmap *bp)
+{
+       mEncBmp = bp;
+       if (mEncBmp != NULL) {
+               if (mEncBmp->Pixels() != NULL) {
+                       // adjust sizes
+                       int     cw, ch,
+                               vw = mEncBmp->Width(),
+                               vh = mEncBmp->Height();
+
+                       GetClientSize(&cw, &ch);
+                       if (vw < cw)
+                               vw = cw;
+                       if (vh < ch)
+                               vh = ch;
+                       SetVirtualSize(vw, vh);
+                       // decode bitmap
+                       if (mColorTable != NULL)
+                               mDecBmp = wxBitmap(ShapesBitmapToImage(mEncBmp, mColorTable, mWhiteTransparency));
+                       Refresh();
+               } else {
+                       wxLogError(wxT("[BitmapView] Addes a bitmap with NULL pixels"));
+                       SetVirtualSize(0, 0);
+               }
+       } else {
+               SetVirtualSize(0, 0);
+       }
+}
+
+ShapesBitmap *BitmapView::GetBitmap(void) const
+{
+       return mEncBmp;
+}
+
+// call this before SettingBitmap!
+void BitmapView::SetColorTable(ShapesColorTable *ct)
+{
+       mColorTable = ct;
+       if (mEncBmp != NULL && mEncBmp->Pixels() != NULL && mColorTable != NULL)
+               mDecBmp = wxBitmap(ShapesBitmapToImage(mEncBmp, mColorTable, mWhiteTransparency));
+       Refresh();
+}
+
diff --git a/Shapes/BitmapView.h b/Shapes/BitmapView.h
new file mode 100644 (file)
index 0000000..60bf8c6
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+//
+// BitmapView
+// A widget for displaying a single, full size ShapesBitmap
+//
+
+#ifndef BITMAPVIEW_H
+#define BITMAPVIEW_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "ShapesElements.h"
+
+class BitmapView: public wxScrolledWindow {
+private:
+       ShapesBitmap            *mEncBmp;                       // encoded bitmap
+       wxBitmap                        mDecBmp;                        // ready-to-draw bitmap
+       ShapesColorTable        *mColorTable;           // which palette to use for display
+       bool                            mWhiteTransparency;     // hide transparent pixels
+       wxPen                           mInvisiblePen;
+
+       bool                            mDragging;
+       int                                     mDragStartX,
+                                               mDragStartY;
+
+protected:
+       DECLARE_EVENT_TABLE();
+
+public:
+       BitmapView(wxWindow *parent);
+       // event handlers
+       void OnPaint(wxPaintEvent &e);
+       void OnSize(wxSizeEvent &e);
+       void OnDrag(wxMouseEvent &e);
+       // access
+       void SetTranspPixelsDisplay(bool show);
+       void SetBitmap(ShapesBitmap *bp);
+       ShapesBitmap *GetBitmap(void) const;
+       void SetColorTable(ShapesColorTable *ct);
+};
+
+#endif
diff --git a/Shapes/CTBrowser.cpp b/Shapes/CTBrowser.cpp
new file mode 100644 (file)
index 0000000..ccffd1c
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include "CTBrowser.h"
+
+DEFINE_EVENT_TYPE(wxEVT_CTBROWSER)
+
+BEGIN_EVENT_TABLE(CTBrowser, wxScrolledWindow)
+       EVT_PAINT(CTBrowser::OnPaint)
+       EVT_SIZE(CTBrowser::OnSize)
+       EVT_LEFT_DOWN(CTBrowser::OnMouseDown)
+       EVT_KEY_DOWN(CTBrowser::OnKeyDown)
+END_EVENT_TABLE()
+
+CTBrowser::CTBrowser(wxWindow *parent):
+       wxScrolledWindow(parent, -1, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER | wxFULL_REPAINT_ON_RESIZE),
+       mSampleW(1), mSampleH(20), mSelection(-1)
+{
+       SetBackgroundColour(wxColour(255, 255, 255));
+       mInvisiblePen.SetColour(0, 0, 0);
+       mInvisiblePen.SetStyle(wxTRANSPARENT);
+       mSelectionPen.SetColour(0, 0, 0);
+       mSelectionPen.SetWidth(3);
+       SetScrollRate(2, 2);
+       mMargin = 10;
+}
+
+void CTBrowser::OnPaint(wxPaintEvent& e)
+{
+       wxPaintDC       tempdc(this);
+       int                     visible_w, visible_h,
+                               x = mMargin, y = mMargin;
+
+       DoPrepareDC(tempdc);
+       GetClientSize(&visible_w, &visible_h);
+       tempdc.SetPen(mInvisiblePen);
+       // draw color samples
+       for (unsigned int i = 0; i < mColorTables.size(); i++) {
+               wxBrush brush(wxColour(0, 0, 0), wxSOLID);
+
+               // mark selected ct
+               if ((int)i == mSelection) {
+                       tempdc.SetPen(mSelectionPen);
+                       tempdc.SetBrush(*wxWHITE_BRUSH);
+                       tempdc.DrawRectangle(x-3, y-3, mSampleW*mColorsPerTable+6, mSampleH+6);
+                       tempdc.SetPen(mInvisiblePen);
+                       tempdc.SetBrush(*wxTRANSPARENT_BRUSH);
+               }
+               // draw a square for each color
+               for (unsigned int j = 0; j < mColorsPerTable; j++) {
+                       brush.SetColour(mColorTables[i]->GetColor(j)->Red() >> 8,
+                                                       mColorTables[i]->GetColor(j)->Green() >> 8,
+                                                       mColorTables[i]->GetColor(j)->Blue() >> 8);
+                       tempdc.SetBrush(brush);
+                       tempdc.DrawRectangle(x, y, mSampleW, mSampleH);
+                       if (mColorTables[i]->GetColor(j)->Luminescent()) {
+                               // display the self-luminescent color flag
+                               tempdc.SetBrush(*wxWHITE_BRUSH);
+                               tempdc.DrawRectangle(x + 2, y + 2, 2, 2);
+                       }
+                       x += mSampleW;
+               }
+               x = mMargin;
+               y += mSampleH + mMargin;
+       }
+}
+
+// widget resized, recalculate virtual size to correctly wrap thumbnails
+void CTBrowser::OnSize(wxSizeEvent& e)
+{
+       UpdateVirtualSize();
+}
+
+void CTBrowser::OnMouseDown(wxMouseEvent& e)
+{
+       wxClientDC      dc(this);
+       wxPoint         mouse;
+       
+       DoPrepareDC(dc);
+       mouse = e.GetLogicalPosition(dc);
+       switch (e.GetButton()) {
+               case wxMOUSE_BTN_LEFT:  // ct selection
+                       {
+                               int     new_selection = -1;
+                               
+                               for (unsigned int i = 0; i < mColorTables.size(); i++) {
+                                       wxRect  test(mMargin, mMargin + i * (mSampleH + mMargin), mSampleW*mColorsPerTable, mSampleH);
+
+                                       if (test.Contains(mouse)) {
+                                               new_selection = i;
+                                               break;
+                                       }
+                               }
+                               if (new_selection != mSelection) {
+                                       mSelection = new_selection;
+                                       Refresh();
+                                       // send selection event
+                                       wxCommandEvent  event(wxEVT_CTBROWSER, GetId());
+
+                                       event.SetEventObject(this);
+                                       event.SetInt(mSelection);
+                                       GetEventHandler()->ProcessEvent(event);
+                               }
+                       }
+                       break;
+       }
+       e.Skip();
+}
+
+void CTBrowser::OnKeyDown(wxKeyEvent &e)
+{
+       int new_selection = mSelection;
+
+       if (mSelection >= 0 && mSelection < (int)mColorTables.size()) {
+               // arrow keys move the selection
+               switch (e.GetKeyCode()) {
+                       case WXK_UP:
+                               if (mSelection > 0)
+                                       new_selection--;
+                               break;
+                       case WXK_DOWN:
+                               if (mSelection < ((int)mColorTables.size()-1))
+                                       new_selection++;
+                               break;
+                       default:
+                               e.Skip();
+               }
+       } else if (mColorTables.size() > 0 && (e.GetKeyCode() == WXK_UP || e.GetKeyCode() == WXK_DOWN)) {
+               new_selection = 0;
+       }
+       if (new_selection != mSelection) {
+               mSelection = new_selection;
+               Refresh();
+               // send selection event
+               wxCommandEvent  event(wxEVT_CTBROWSER, GetId());
+               
+               event.SetEventObject(this);
+               event.SetInt(mSelection);
+               GetEventHandler()->ProcessEvent(event);
+       }
+}
+
+// add a new ShapesColorTable to the list
+void CTBrowser::AddColorTable(ShapesColorTable *ctp)
+{
+       if (ctp == NULL)
+               return;
+       mColorsPerTable = ctp->ColorCount();
+       mColorTables.push_back(ctp);
+       UpdateVirtualSize();
+       Refresh();
+}
+
+// clear the color table list
+void CTBrowser::Clear(void)
+{
+       mColorTables.clear();
+       mSelection = -1;
+       mColorsPerTable = 0;
+       UpdateVirtualSize();
+//     Refresh();      // not needed since the ShapesEditor only clears before refilling
+}
+
+int CTBrowser::GetSelection(void) const
+{
+       return mSelection;
+}
+
+// calculate and set the wxWindow virtual size,
+// based on the number of color tables, colors per table,
+// color sample dimensions and given visible size
+void CTBrowser::UpdateVirtualSize(void)
+{
+       wxClientDC      dc(this);
+       int                     numcts = mColorTables.size(),
+                               width, height;
+
+       GetClientSize(&width, &height);
+       // calculate best sample_w
+       for (int w = 1; w < mSampleH; w++) {
+               if (2*mMargin + w*(int)mColorsPerTable > width) {
+                       mSampleW = w - 1;
+                       break;
+               }
+       }
+       if (mSampleW < 1)
+               mSampleW = 1;
+       SetVirtualSize(2*mMargin + mSampleW*mColorsPerTable, mMargin + numcts * (mSampleH + mMargin));
+}
+
diff --git a/Shapes/CTBrowser.h b/Shapes/CTBrowser.h
new file mode 100644 (file)
index 0000000..6c05b50
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+//
+// CTBrowser
+// Widget for displaying a list of ShapesColorTable's. Each color table
+// is show as a matrix of color samples. The width of each sample will
+// adjust to fit inside the available widget width, while the sample
+// height is fixed.
+//
+
+#ifndef CTBROWSER_H
+#define CTBROWSER_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "ShapesElements.h"
+
+DECLARE_EVENT_TYPE(wxEVT_CTBROWSER, -1)
+
+class CTBrowser: public wxScrolledWindow {
+private:
+       vector<ShapesColorTable*>       mColorTables;           // array of pointers to color tables
+       unsigned int                            mColorsPerTable;
+       wxCoord                                         mSampleW, mSampleH,     // size of color samples
+                                                               mMargin;
+       wxPen                                           mInvisiblePen,
+                                                               mSelectionPen;
+       int                                                     mSelection;
+
+       void UpdateVirtualSize(void);
+
+protected:
+       DECLARE_EVENT_TABLE();
+
+public:
+       CTBrowser(wxWindow *parent);
+       void OnPaint(wxPaintEvent& e);
+       void OnSize(wxSizeEvent& e);
+       void OnMouseDown(wxMouseEvent& e);
+       void OnKeyDown(wxKeyEvent &e);
+
+       void AddColorTable(ShapesColorTable *ctp);
+       void Clear(void);
+
+       int GetSelection(void) const;
+};
+
+#endif
diff --git a/Shapes/CTView.cpp b/Shapes/CTView.cpp
new file mode 100644 (file)
index 0000000..19bf18d
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include "CTView.h"
+#include <wx/colordlg.h>
+
+DEFINE_EVENT_TYPE(wxEVT_CTVIEW_SELECTION)
+DEFINE_EVENT_TYPE(wxEVT_CTVIEW_COLOR)
+
+BEGIN_EVENT_TABLE(CTView, wxPanel)
+       EVT_PAINT(CTView::OnPaint)
+       EVT_SIZE(CTView::OnSize)
+       EVT_LEFT_DOWN(CTView::OnMouseDown)
+       EVT_LEFT_DCLICK(CTView::OnMouseDoubleClick)
+END_EVENT_TABLE()
+
+// icon for the self-luminescent flag
+static char *self_luminescent_icon_xpm[] = {
+"8 8 2 1",
+"   c None",
+".  c #000000",
+"        ",
+" .      ",
+" ..     ",
+" ...    ",
+" ....   ",
+" .....  ",
+" ...... ",
+"        "};
+
+CTView::CTView(wxWindow *parent):
+       wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER | wxFULL_REPAINT_ON_RESIZE),
+       mColorTable(NULL), mSwatchSize(0), mMargin(7), mLightBulbIcon(self_luminescent_icon_xpm)
+{
+       SetBackgroundColour(wxColour(255, 255, 255));
+       mInvisiblePen.SetColour(0, 0, 0);
+       mInvisiblePen.SetStyle(wxTRANSPARENT);
+       mSelectionPen.SetColour(0, 0, 0);
+       mSelectionPen.SetWidth(3);
+}
+
+void CTView::OnPaint(wxPaintEvent& e)
+{
+       if (mColorTable == NULL)
+               return;
+
+       wxPaintDC               tempdc(this);
+       wxBrush                 brush(wxColour(0, 0, 0), wxSOLID);
+       unsigned int    x = mMargin, y = mMargin;
+       int                             width, height;
+
+       tempdc.GetSize(&width, &height);
+       tempdc.SetPen(mInvisiblePen);
+       for (unsigned int j = 0; j < mColorTable->ColorCount(); j++) {
+               // draw selection marker
+               if (mSelectionMask[j]) {
+                       tempdc.SetPen(mSelectionPen);
+                       tempdc.SetBrush(*wxWHITE_BRUSH);
+                       tempdc.DrawRectangle(x-3, y-3, mSwatchSize+6, mSwatchSize+6);
+                       tempdc.SetPen(mInvisiblePen);
+               }
+               // draw color swatch
+               brush.SetColour(mColorTable->GetColor(j)->Red() >> 8,
+                                               mColorTable->GetColor(j)->Green() >> 8,
+                                               mColorTable->GetColor(j)->Blue() >> 8);
+               tempdc.SetBrush(brush);
+               tempdc.DrawRectangle(x, y, mSwatchSize, mSwatchSize);
+               if (mColorTable->GetColor(j)->Luminescent()) {
+                       // display self-luminescent color flag
+                       tempdc.SetBrush(*wxWHITE_BRUSH);
+                       tempdc.DrawBitmap(mLightBulbIcon, x, y + mSwatchSize - mLightBulbIcon.GetHeight(), true);
+               }
+               x += mSwatchSize + mMargin;
+               if ((int)(x + mSwatchSize + mMargin) >= width) {
+                       x = mMargin;
+                       y += mSwatchSize + mMargin;
+               }
+       }
+}
+
+void CTView::OnSize(wxSizeEvent &e)
+{
+       CalculateSwatchSize();
+}
+
+void CTView::OnMouseDown(wxMouseEvent& e)
+{
+       wxPoint                 mouse = e.GetPosition();
+       unsigned int    x = mMargin, y = mMargin;
+       int                             width, height;
+       bool                    found = false;
+
+       GetClientSize(&width, &height);
+       switch (e.GetButton()) {
+               case wxMOUSE_BTN_LEFT:
+                       // first deselect all, if we're not doing multiple selection
+                       if (!wxGetMouseState().ShiftDown()) {
+                               for (unsigned int j = 0; j < mColorTable->ColorCount(); j++)
+                                       mSelectionMask[j] = false;
+                       }
+                       // check for clicks inside a color swatch
+                       for (unsigned int j = 0; j < mColorTable->ColorCount(); j++) {
+                               wxRect  test(x, y, mSwatchSize, mSwatchSize);
+
+                               if (test.Contains(mouse)) {
+                                       mSelectionMask[j] = true;
+                                       found = true;
+                                       break;
+                               }
+                               x += mSwatchSize + mMargin;
+                               if ((int)(x + mSwatchSize + mMargin) >= width) {
+                                       x = mMargin;
+                                       y += mSwatchSize + mMargin;
+                               }
+                       }
+                       Refresh();
+                       // send selection event (telling just how many items are selected)
+                       {
+                               wxCommandEvent  event(wxEVT_CTVIEW_SELECTION, GetId());
+                               int                             selectedCount = 0;
+
+                               for (unsigned int j = 0; j < mColorTable->ColorCount(); j++)
+                                       selectedCount += mSelectionMask[j] ? 1 : 0;
+                               event.SetEventObject(this);
+                               event.SetInt(selectedCount);
+                               GetEventHandler()->ProcessEvent(event);
+                       }
+                       break;
+       }
+       e.Skip();
+}
+
+// handle double-clicks on swatches, showing the
+// color chooser to alter the swatch color
+void CTView::OnMouseDoubleClick(wxMouseEvent& e)
+{
+       wxPoint                 mouse = e.GetPosition();
+       unsigned int    x = mMargin, y = mMargin;
+       int                             width, height;
+
+       GetClientSize(&width, &height);
+       for (unsigned int j = 0; j < mColorTable->ColorCount(); j++) {
+               wxRect  test(x, y, mSwatchSize, mSwatchSize);
+
+               if (test.Contains(mouse)) {
+                       // FIXME is it ok to set the CTView as the parent?
+                       wxColour        newColor = ::wxGetColourFromUser(this,
+                                                                               wxColour(mColorTable->GetColor(j)->Red() >> 8,
+                                                                               mColorTable->GetColor(j)->Green() >> 8,
+                                                                               mColorTable->GetColor(j)->Blue() >> 8));
+
+                       if (newColor.Ok()) {
+                               mColorTable->GetColor(j)->SetRed(newColor.Red() << 8);
+                               mColorTable->GetColor(j)->SetGreen(newColor.Green() << 8);
+                               mColorTable->GetColor(j)->SetBlue(newColor.Blue() << 8);
+                       }
+                       Refresh();
+                       // send an event to let the world know
+                       wxCommandEvent  event(wxEVT_CTVIEW_COLOR, GetId());
+
+                       event.SetEventObject(this);
+                       event.SetInt(j);
+                       GetEventHandler()->ProcessEvent(event);
+                       break;
+               }
+               x += mSwatchSize + mMargin;
+               if ((int)(x + mSwatchSize + mMargin) >= width) {
+                       x = mMargin;
+                       y += mSwatchSize + mMargin;
+               }
+       }
+       e.Skip();
+}
+
+void CTView::SetColorTable(ShapesColorTable *ct)
+{
+       bool    need_recalc = (ct != NULL) && (mColorTable != NULL)
+                               && (ct->ColorCount() != mColorTable->ColorCount());
+
+       mColorTable = ct;
+       // update selection mask
+       mSelectionMask.clear();
+       if (mColorTable != NULL) {
+               for (unsigned int i = 0; i < mColorTable->ColorCount(); i++)
+                       mSelectionMask.push_back(false);
+       }
+       // visual updates
+       if (need_recalc)
+               CalculateSwatchSize();
+       Refresh();
+}
+
+vector<bool> CTView::GetSelection(void) const
+{
+       return mSelectionMask;
+}
+
+// calculate best swatch size fitting into the widget area
+void CTView::CalculateSwatchSize(void)
+{
+       if (mColorTable != NULL) {
+               int                             width, height;
+               unsigned int    new_swatch_size = 2;
+
+               GetVirtualSize(&width, &height);
+               mSwatchSize = 0;
+               while (mSwatchSize == 0) {
+                       // FIXME faster & more elegant math please
+                       unsigned int    x = mMargin, y = mMargin;
+
+                       for (unsigned int i = 0; i < mColorTable->ColorCount(); i++) {
+                               x += new_swatch_size + mMargin;
+                               if ((int)(x + new_swatch_size + mMargin) >= width) {
+                                       x = mMargin;
+                                       y += new_swatch_size + mMargin;
+                                       if ((int)(y + new_swatch_size + mMargin) >= height) {
+                                               mSwatchSize = new_swatch_size - 1;
+                                               break;
+                                       }
+                               }
+                       }
+                       new_swatch_size++;
+               }
+       } else {
+               mSwatchSize = 0;
+       }
+}
+
diff --git a/Shapes/CTView.h b/Shapes/CTView.h
new file mode 100644 (file)
index 0000000..3f6886d
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+//
+// CTView
+// A widget for displaying a ShapesColorTable. We don't derive
+// wxScrolledWindow because IMO the purpose of the widget doesn't
+// require scrolling.
+//
+
+#ifndef CTVIEW_H
+#define CTVIEW_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "ShapesElements.h"
+
+DECLARE_EVENT_TYPE(wxEVT_CTVIEW_SELECTION, -1)
+DECLARE_EVENT_TYPE(wxEVT_CTVIEW_COLOR, -1)
+
+class CTView: public wxPanel {
+private:
+       ShapesColorTable        *mColorTable;           // link to the color table
+       wxPen                           mInvisiblePen,
+                                               mSelectionPen;
+       unsigned int            mSwatchSize,
+                                               mMargin;
+       wxBitmap                        mLightBulbIcon;
+       vector<bool>            mSelectionMask;
+
+protected:
+       DECLARE_EVENT_TABLE();
+       void CalculateSwatchSize(void);
+
+public:
+       CTView(wxWindow *parent);
+       // event handlers
+       void OnPaint(wxPaintEvent &e);
+       void OnSize(wxSizeEvent &e);
+       void OnMouseDown(wxMouseEvent& e);
+       void OnMouseDoubleClick(wxMouseEvent& e);
+       // access
+       void SetColorTable(ShapesColorTable *ct);
+       vector<bool> GetSelection(void) const;
+};
+
+#endif
diff --git a/Shapes/FrameBrowser.cpp b/Shapes/FrameBrowser.cpp
new file mode 100644 (file)
index 0000000..025df93
--- /dev/null
@@ -0,0 +1,428 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+//
+// FrameBrowser
+// A widget for displaying a list of ShapesFrame's
+// as a scrollable list of selectable thumbnails. Each thumbnail
+// displays the frame's associated bitmap, altered with
+// the specified mirror transformations.
+// 
+#include "wx/image.h"
+#include "FrameBrowser.h"
+#include "utilities.h"
+
+DEFINE_EVENT_TYPE(wxEVT_FRAMEBROWSER)
+DEFINE_EVENT_TYPE(wxEVT_FRAMEBROWSER_DELETE)
+
+BEGIN_EVENT_TABLE(FrameBrowser, wxScrolledWindow)
+       EVT_PAINT(FrameBrowser::OnPaint)
+       EVT_SIZE(FrameBrowser::OnSize)
+       EVT_LEFT_DOWN(FrameBrowser::OnMouseDown)
+       EVT_RIGHT_DOWN(FrameBrowser::OnMouseDown)
+       EVT_KEY_DOWN(FrameBrowser::OnKeyDown)
+END_EVENT_TABLE()
+
+FrameBrowser::FrameBrowser(wxWindow *parent, wxWindowID id):
+       wxScrolledWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER | wxFULL_REPAINT_ON_RESIZE),
+       mColorTable(NULL), mNumCols(0), mNumRows(0), mFrozenCount(0)
+{
+       SetBackgroundColour(wxColour(255, 255, 255));
+       mThumbnailPen.SetColour(200, 200, 200);
+       mSelectionPen.SetColour(0, 0, 0);
+       mSelectionPen.SetWidth(3);
+       SetScrollRate(0, 2);
+       mThumbnailSize = 64;
+       mAutoSize = false;
+       mMargin = 7;
+       mWhiteTransparency = true;
+       mSelection = -1;
+}
+
+void FrameBrowser::OnPaint(wxPaintEvent& e)
+{
+       wxPaintDC   tempdc(this);
+       int                     cw, ch, rx, ry;
+
+       DoPrepareDC(tempdc);
+       GetClientSize(&cw, &ch);
+       CalcUnscrolledPosition(0, 0, &rx, &ry);
+       // draw thumbnails
+       tempdc.SetPen(mThumbnailPen);
+       tempdc.SetBrush(*wxTRANSPARENT_BRUSH);
+       for (unsigned int i = 0; i < mThumbnails.size(); i++) {
+               int     x = mThumbnailPositions[i].x,
+                       y = mThumbnailPositions[i].y;
+
+               if (y + mThumbnailSize < ry)
+                       continue;
+               if (y > ry + ch)
+                       break;
+
+               int     bw = mThumbnails[i].GetWidth(),
+                       bh = mThumbnails[i].GetHeight();
+
+               if ((int)i == mSelection) {
+                       tempdc.DrawBitmap(mThumbnails[i], x + mThumbnailSize/2 - bw/2, y + mThumbnailSize/2 - bh/2);
+                       tempdc.SetPen(mSelectionPen);
+                       tempdc.DrawRectangle(x-2, y-2, mThumbnailSize+4, mThumbnailSize+4);
+                       tempdc.SetPen(mThumbnailPen);
+               } else {
+                       tempdc.DrawRectangle(x-1, y-1, mThumbnailSize+2, mThumbnailSize+2);
+                       tempdc.DrawBitmap(mThumbnails[i], x + mThumbnailSize/2 - bw/2, y + mThumbnailSize/2 - bh/2);
+               }
+       }
+}
+
+// widget resized, recalculate virtual size to correctly wrap thumbnails
+void FrameBrowser::OnSize(wxSizeEvent& e)
+{
+       UpdateVirtualSize();
+}
+
+void FrameBrowser::OnMouseDown(wxMouseEvent& e)
+{
+       wxClientDC      dc(this);
+       wxPoint         mouse;
+
+       DoPrepareDC(dc);
+       mouse = e.GetLogicalPosition(dc);
+       switch (e.GetButton()) {
+               case wxMOUSE_BTN_LEFT:
+                       // handle frame selection
+                       {
+                               int     new_selection = -1;
+
+                               for (unsigned int i = 0; i < mThumbnailPositions.size(); i++) {
+                                       wxRect  test(mThumbnailPositions[i].x, mThumbnailPositions[i].y,
+                                                                       mThumbnailSize, mThumbnailSize);
+
+                                       if (test.Contains(mouse)) {
+                                               new_selection = i;
+                                               break;
+                                       }
+                               }
+                               if (new_selection != mSelection) {
+                                       mSelection = new_selection;
+                                       Refresh();
+
+                                       // send selection event
+                                       wxCommandEvent  event(wxEVT_FRAMEBROWSER, GetId());
+
+                                       event.SetEventObject(this);
+                                       event.SetInt(mSelection);
+                                       GetEventHandler()->ProcessEvent(event);
+                               }
+                       }
+                       break;
+               case wxMOUSE_BTN_RIGHT:
+                       break;
+       }
+       e.Skip();
+}
+
+void FrameBrowser::OnKeyDown(wxKeyEvent &e)
+{
+       switch (e.GetKeyCode()) {
+               case WXK_LEFT:
+               case WXK_RIGHT:
+               case WXK_UP:
+               case WXK_DOWN:
+                       {
+                               int new_selection = mSelection;
+
+                               if (mSelection >= 0 && mSelection < (int)mFrames.size()) {
+                                       switch (e.GetKeyCode()) {
+                                               case WXK_LEFT:
+                                                       if (mSelection % mNumCols > 0)
+                                                               new_selection--;
+                                                       break;
+                                               case WXK_RIGHT:
+                                                       if (mSelection % mNumCols < (mNumCols-1))
+                                                               new_selection++;
+                                                       break;
+                                               case WXK_UP:
+                                                       if (mSelection / mNumCols > 0)
+                                                               new_selection -= mNumCols;
+                                                       break;
+                                               case WXK_DOWN:
+                                                       if (mSelection / mNumCols < (mNumRows-1))
+                                                               new_selection += mNumCols;
+                                                       break;
+                                       }
+                               } else if (mFrames.size() > 0) {
+                                       new_selection = 0;
+                               }
+                               if (new_selection != mSelection && new_selection >= 0
+                                               && new_selection < (int)mFrames.size()) {
+                                       // TODO scroll to show the new selection
+                                       mSelection = new_selection;
+                                       Refresh();
+                                       
+                                       // send frame selection event
+                                       wxCommandEvent  event(wxEVT_FRAMEBROWSER, GetId());
+                                       
+                                       event.SetEventObject(this);
+                                       event.SetInt(mSelection);
+                                       GetEventHandler()->ProcessEvent(event);
+                               }
+                       }
+                       break;
+               case WXK_DELETE:
+                       // send a frame delete event
+                       if (mSelection >= 0 && mSelection < (int)mFrames.size()) {
+                               wxCommandEvent  event(wxEVT_FRAMEBROWSER_DELETE, GetId());
+
+                               event.SetEventObject(this);
+                               event.SetInt(mSelection);
+                               GetEventHandler()->ProcessEvent(event);
+                       }
+                       break;
+               default:
+                       e.Skip();
+                       break;
+       }
+}
+
+// the Freeze()/Thaw() combo is necessary to get a reasonably
+// responsive interface. Otherwise we would be doing bursts
+// of UpdateVirtualSize() and potentially RebuildThumbnails()
+// every time the user changes collection
+void FrameBrowser::Freeze(void)
+{
+       mFrozenCount++;
+}
+
+void FrameBrowser::Thaw(void)
+{
+       if (mFrozenCount > 0) {
+               mFrozenCount--;
+               if (mFrozenCount == 0) {
+                       UpdateVirtualSize();
+                       Refresh();
+               }
+       }
+}
+
+int FrameBrowser::GetSelection(void) const
+{
+       return mSelection;
+}
+
+void FrameBrowser::SetThumbnailSize(int size)
+{
+       if (size > 0) {
+               mThumbnailSize = size;
+               mAutoSize = false;
+       } else {
+               mAutoSize = true;
+       }
+       if (mFrozenCount == 0) {
+               UpdateVirtualSize();
+               if (!mAutoSize)
+                       RebuildThumbnails();
+               Refresh();
+       }
+}
+
+void FrameBrowser::SetTranspPixelsDisplay(bool show)
+{
+       mWhiteTransparency = show;
+       if (mFrozenCount == 0) {
+               RebuildThumbnails();
+               Refresh();
+       }
+}
+
+// add a new ShapesFrame to the thumbnail list
+void FrameBrowser::AddFrame(ShapesFrame *fp)
+{
+       if (fp != NULL) {
+               mFrames.push_back(fp);
+               mThumbnails.push_back(CreateThumbnail(fp));
+               if (mFrozenCount == 0) {
+                       UpdateVirtualSize();
+                       Refresh();
+               }
+       }
+}
+
+// add a ShapesBitmap to the bitmap pointer list.
+// Call before adding frames!
+void FrameBrowser::AddBitmap(ShapesBitmap *bp)
+{
+       if (bp != NULL) {
+               if (bp->Pixels() != NULL)
+                       mBitmaps.push_back(bp);
+               else
+                       wxLogError(wxT("FrameBrowser: someone tried to add a bitmap with NULL pixels"));
+       }
+}
+
+// clear the thumbnail list
+void FrameBrowser::Clear(void)
+{
+       mThumbnails.clear();
+       mFrames.clear();
+       mBitmaps.clear();
+       mThumbnailPositions.clear();
+       mSelection = -1;
+       if (mFrozenCount == 0) {
+               UpdateVirtualSize();
+               Refresh();
+       }
+}
+
+// clear just the bitmap pointer list
+void FrameBrowser::ClearBitmaps(void)
+{
+       mBitmaps.clear();
+}
+
+// call before adding frames!
+void FrameBrowser::SetColorTable(ShapesColorTable *ct)
+{
+       mColorTable = ct;
+       if (mFrozenCount == 0) {
+               RebuildThumbnails();
+               Refresh();
+       }
+}
+
+// calculate and set the wxWindow virtual size, based on the
+// number of thumbnails, thumbnail dimensions and given visible
+// size. Also pre-calculate thumbnail positions
+void FrameBrowser::UpdateVirtualSize(void)
+{
+       wxClientDC      dc(this);
+       int                     numframes = mThumbnails.size(),
+                               width, height;
+
+       GetClientSize(&width, &height);
+       if (numframes < 1) {
+               SetVirtualSize(0, 0);
+               return;
+       }
+
+       if (mAutoSize && numframes > 0) {
+               // calculate the best tn_size
+               // (its maximum value not requiring window scrolling)
+               int     max_bitmap_dimension = 10,
+                       new_tn_size;
+
+               SetScrollRate(0, 0);
+               // find greatest dimension among all referenced bitmaps
+               for (unsigned int i = 0; i < mFrames.size(); i++) {
+                       int     bitmapindex = mFrames[i]->BitmapIndex();
+
+                       if (bitmapindex < 0 || bitmapindex >= (int)mBitmaps.size())
+                               continue;
+                       if (mBitmaps[bitmapindex]->Width() > max_bitmap_dimension)
+                               max_bitmap_dimension = mBitmaps[bitmapindex]->Width();
+                       if (mBitmaps[bitmapindex]->Height() > max_bitmap_dimension)
+                               max_bitmap_dimension = mBitmaps[bitmapindex]->Height();
+               }
+               // start with a small size (margin) and increase it until overflow
+               for (new_tn_size = mMargin; ; new_tn_size++) {
+                       int     numcols = (width - mMargin) / (new_tn_size + mMargin),
+                               numrows = (numcols > 0) ? (numframes / numcols) : numframes;
+
+                       if (numrows * numcols < numframes)
+                               numrows++;
+                       int     total_height = numrows * (new_tn_size + mMargin) + mMargin;
+
+                       if (total_height > height || (new_tn_size + 2 * mMargin) > width) {
+                               // here we are
+                               new_tn_size--;
+                               break;
+                       }
+                       if (new_tn_size >= max_bitmap_dimension) {
+                               // no point in wasting window space with huge
+                               // thumbnails showing small bitmaps at their center
+                               new_tn_size = max_bitmap_dimension;
+                               break;
+                       }
+               }
+               if (new_tn_size != mThumbnailSize) {
+                       mThumbnailSize = new_tn_size;
+                       RebuildThumbnails();
+               }
+       } else {
+               SetScrollRate(0, 2);
+       }
+
+       mNumCols = (width - mMargin) / (mThumbnailSize + mMargin);
+       mNumRows = (mNumCols > 0) ? (numframes / mNumCols) : numframes;
+
+       if (mNumRows * mNumCols < numframes)
+               mNumRows++;
+
+       SetVirtualSize(width, mNumRows * (mThumbnailSize + mMargin) + mMargin);
+
+       // recalculate thumbnail positions
+       int     x = mMargin, y = mMargin;
+
+       mThumbnailPositions.clear();
+       for (int i = 0; i < numframes; i++) {
+               mThumbnailPositions.push_back(wxPoint(x, y));
+
+               x += mThumbnailSize + mMargin;
+               if (x + mThumbnailSize + mMargin > width) {
+                       x = mMargin;
+                       y += mThumbnailSize + mMargin;
+               }
+       }
+}
+
+// transform an ShapesFrame to a wxBitmap thumbnail
+wxBitmap FrameBrowser::CreateThumbnail(ShapesFrame *fp)
+{
+       if (fp->BitmapIndex() < 0 || fp->BitmapIndex() >= (int)mBitmaps.size()) {
+               // invalid or unset bitmap
+               return BadThumbnail(mThumbnailSize);
+       } else {
+               // valid bitmap
+               ShapesBitmap    *bp = mBitmaps[fp->BitmapIndex()];
+               wxImage                 newimg(bp->Width(), bp->Height());
+
+               // decode the bitmap to a wxImage
+               if (mColorTable)
+                       newimg = ShapesBitmapToImage(bp, mColorTable, mWhiteTransparency);
+
+               // apply frame transformations
+               if (fp->IsXmirrored())
+                       newimg = newimg.Mirror(true);
+               if (fp->IsYmirrored())
+                       newimg = newimg.Mirror(false);
+
+               return ImageThumbnail(newimg, mThumbnailSize, true);
+       }
+}
+
+void FrameBrowser::RebuildThumbnail(unsigned int i)
+{
+       if (i < mThumbnails.size() && i < mFrames.size())
+               mThumbnails[i] = CreateThumbnail(mFrames[i]);
+}
+
+// redecode frames to bitmaps (after color table change, frame parameter variations etc)
+void FrameBrowser::RebuildThumbnails(void)
+{
+       for (unsigned int i = 0; i < mFrames.size(); i++)
+               mThumbnails[i] = CreateThumbnail(mFrames[i]);
+}
+
diff --git a/Shapes/FrameBrowser.h b/Shapes/FrameBrowser.h
new file mode 100644 (file)
index 0000000..a728869
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+//
+// FrameBrowser
+// A widget for displaying a list of ShapesFrame's as a scrollable list
+// of selectable thumbnails. Each thumbnail displays the frame's
+// associated bitmap, altered with the specified mirror transformations.
+//
+
+#ifndef FRAMEBROWSER_H
+#define FRAMEBROWSER_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "ShapesElements.h"
+
+DECLARE_EVENT_TYPE(wxEVT_FRAMEBROWSER, -1)
+DECLARE_EVENT_TYPE(wxEVT_FRAMEBROWSER_DELETE, -1)
+
+class FrameBrowser: public wxScrolledWindow {
+private:
+       vector<ShapesFrame*>    mFrames;                        // pointers to frames
+       vector<ShapesBitmap*>   mBitmaps;                       // pointers to bitmaps
+       vector<wxBitmap>                mThumbnails;            // scaled/rendered frame thumbnails
+       ShapesColorTable                *mColorTable;           // which palette to use for display
+       vector<wxPoint>                 mThumbnailPositions;    // thumbnail positions within window
+       wxCoord                                 mThumbnailSize,
+                                                       mMargin;                        // margin between thumbnails and window edges
+       bool                                    mAutoSize,
+                                                       mWhiteTransparency;
+       int                                             mSelection,
+                                                       mNumCols,
+                                                       mNumRows;
+       wxPen                                   mThumbnailPen,
+                                                       mSelectionPen;
+       unsigned int                    mFrozenCount;
+
+       wxBitmap CreateThumbnail(ShapesFrame *fp);
+       void UpdateVirtualSize(void);
+
+protected:
+       DECLARE_EVENT_TABLE();
+
+public:
+       FrameBrowser(wxWindow *parent, wxWindowID id);
+       // event handlers
+       void OnPaint(wxPaintEvent& e);
+       void OnSize(wxSizeEvent& e);
+       void OnMouseDown(wxMouseEvent& e);
+       void OnKeyDown(wxKeyEvent& e);
+       // wx things
+       void Freeze(void);
+       void Thaw(void);
+       // access methods
+       int GetSelection(void) const;
+       void SetThumbnailSize(int size);
+       void SetTranspPixelsDisplay(bool show);
+       void AddFrame(ShapesFrame *fp);
+       void AddBitmap(ShapesBitmap *bp);
+       void SetColorTable(ShapesColorTable *ct);
+       void Clear(void);
+       void ClearBitmaps(void);
+       // utilities
+       void RebuildThumbnail(unsigned int i);
+       void RebuildThumbnails(void);
+};
+
+#endif
diff --git a/Shapes/FrameView.cpp b/Shapes/FrameView.cpp
new file mode 100644 (file)
index 0000000..abad672
--- /dev/null
@@ -0,0 +1,315 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include "wx/image.h"
+#include "FrameView.h"
+#include "utilities.h"
+
+DEFINE_EVENT_TYPE(wxEVT_FRAMEVIEW_DRAG)
+
+BEGIN_EVENT_TABLE(FrameView, wxScrolledWindow)
+       EVT_PAINT(FrameView::OnPaint)
+       EVT_LEFT_DOWN(FrameView::OnDrag)
+       EVT_LEFT_UP(FrameView::OnDrag)
+       EVT_MOTION(FrameView::OnDrag)
+       EVT_SIZE(FrameView::OnSize)
+END_EVENT_TABLE()
+
+FrameView::FrameView(wxWindow *parent, wxWindowID id):
+       wxScrolledWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER | wxFULL_REPAINT_ON_RESIZE),
+       mFrame(NULL), mEncBmp(NULL), mColorTable(NULL), mPanning(false), mDraggingOrigin(false), mDraggingKey(false), mNearOrigin(false), mNearKey(false)
+{
+       SetBackgroundColour(wxColour(255, 255, 255));
+       SetScrollRate(1, 1);
+       EnableScrolling(false, false);
+       // origin cursor pen
+       mOriginPen.SetColour(0, 128, 128);
+       // key cursor pen
+       mKeypointPen.SetColour(128, 0, 128);
+       // mouse cursors
+       mPanCursor = wxCursor(wxCURSOR_ARROW);
+       mPointCursor = wxCursor(wxCURSOR_CROSS);
+       mWhiteTransparency = true;
+       mCenterOrigin = false;
+}
+
+void FrameView::OnPaint(wxPaintEvent& e)
+{
+       wxPaintDC   tempdc(this);
+       int                     vw, vh, cw, ch;
+
+       GetVirtualSize(&vw, &vh);
+       DoPrepareDC(tempdc);
+       GetClientSize(&cw, &ch);
+       if (mFrame != NULL && mColorTable != NULL) {
+               if (mEncBmp != NULL) {
+                       int     origin_x, origin_y;
+
+                       if (mCenterOrigin) {
+                               origin_x = vw/2 - mFrame->OriginX();
+                               origin_y = vh/2 - mFrame->OriginY();
+                       } else {
+                               origin_x = vw/2 - mDecBmp.GetWidth()/2;
+                               origin_y = vh/2 - mDecBmp.GetHeight()/2;
+                       }
+                       // draw bitmap
+                       tempdc.DrawBitmap(mDecBmp, origin_x, origin_y);
+                       // mark bitmap origin
+                       tempdc.SetPen(mOriginPen);
+                       tempdc.CrossHair(mFrame->OriginX() + origin_x, mFrame->OriginY() + origin_y);
+                       tempdc.DrawCircle(mFrame->OriginX() + origin_x, mFrame->OriginY() + origin_y, 2);
+                       // mark bitmap keypoint
+                       tempdc.SetPen(mKeypointPen);
+                       tempdc.CrossHair(mFrame->KeyX() + origin_x, mFrame->KeyY() + origin_y);
+                       tempdc.DrawCircle(mFrame->KeyX() + origin_x, mFrame->KeyY() + origin_y, 2);
+                       // origin & key labels
+                       wxString        origin_label = wxT("Origin"),
+                                               key_label = wxT("Keypoint");
+                       int                     text1w, text1h, text2w, text2h;
+
+                       tempdc.SetFont(*wxSMALL_FONT);
+                       tempdc.GetTextExtent(origin_label, &text1w, &text1h);
+                       tempdc.GetTextExtent(key_label, &text2w, &text2h);
+                       tempdc.SetTextForeground(wxColour(0, 128, 128));
+                       if (mFrame->OriginY() + origin_y >= text1h + 2)
+                               tempdc.DrawText(origin_label, vw - text1w - 2, mFrame->OriginY() + origin_y - text1h - 2);
+                       else
+                               tempdc.DrawText(origin_label, vw - text1w - 2, mFrame->OriginY() + origin_y + 2);
+                       tempdc.SetTextForeground(wxColour(128, 0, 128));
+                       if (mFrame->KeyY() + origin_y >= text2h + 2)
+                               tempdc.DrawText(key_label, vw - text2w - 2, mFrame->KeyY() + origin_y - text2h - 2);
+                       else
+                               tempdc.DrawText(key_label, vw - text2w - 2, mFrame->KeyY() + origin_y + 2);
+               } else {
+                       wxString        no_bmp_label = wxT("No associated bitmap");
+                       int                     text_w, text_h,
+                                               origin_x = vw/2, origin_y = vh/2;
+
+                       tempdc.GetTextExtent(no_bmp_label, &text_w, &text_h);
+                       origin_x -= text_w / 2;
+                       origin_y -= text_h / 2;
+                       tempdc.SetTextForeground(wxColour(255, 0, 0));
+                       tempdc.DrawText(no_bmp_label, origin_x, origin_y);
+               }
+       }
+}
+
+// handle mouse drag (pan view, edit origin/keypoint)
+void FrameView::OnDrag(wxMouseEvent &e)
+{
+       if (mFrame == NULL || mEncBmp == NULL || mCenterOrigin)
+               return;
+
+       if (e.ButtonDown()) {
+               int scroll_x, scroll_y;
+
+               GetViewStart(&scroll_x, &scroll_y);
+               if (mNearOrigin) {
+                       // start dragging origin
+                       mDraggingOrigin = true;
+               } else if (mNearKey) {
+                       // start dragging keypoint
+                       mDraggingKey = true;
+               } else {
+                       // start panning
+                       mPanning = true;
+                       mDragStartX = e.GetPosition().x + scroll_x;
+                       mDragStartY = e.GetPosition().y + scroll_y;
+               }
+       } else if (e.Dragging()) {
+               if (mPanning) {
+                       // pan
+                       int     dx = mDragStartX - e.GetPosition().x,
+                               dy = mDragStartY - e.GetPosition().y;
+
+                       Scroll(dx, dy);
+               } else if (mDraggingOrigin) {
+                       // set origin
+                       int     vw, vh, scroll_x, scroll_y, origin_x, origin_y;
+
+                       GetVirtualSize(&vw, &vh);
+                       GetViewStart(&scroll_x, &scroll_y);
+                       origin_x = vw/2 - mDecBmp.GetWidth()/2;
+                       origin_y = vh/2 - mDecBmp.GetHeight()/2;
+                       mFrame->SetOriginX(e.GetPosition().x + scroll_x - origin_x);
+                       mFrame->SetOriginY(e.GetPosition().y + scroll_y - origin_y);
+                       // send an event so that other gui elements can update
+                       wxCommandEvent  event(wxEVT_FRAMEVIEW_DRAG, GetId());
+
+                       event.SetEventObject(this);
+                       //event.SetInt(j);
+                       GetEventHandler()->ProcessEvent(event);
+                       Refresh();
+               } else if (mDraggingKey) {
+                       // set keypoint
+                       int vw, vh, scroll_x, scroll_y, origin_x, origin_y;
+
+                       GetVirtualSize(&vw, &vh);
+                       GetViewStart(&scroll_x, &scroll_y);
+                       origin_x = vw/2 - mDecBmp.GetWidth()/2;
+                       origin_y = vh/2 - mDecBmp.GetHeight()/2;
+                       mFrame->SetKeyX(e.GetPosition().x + scroll_x - origin_x);
+                       mFrame->SetKeyY(e.GetPosition().y + scroll_y - origin_y);
+                       // send an event so that other gui elements can update
+                       wxCommandEvent  event(wxEVT_FRAMEVIEW_DRAG, GetId());
+
+                       event.SetEventObject(this);
+                       //event.SetInt(j);
+                       GetEventHandler()->ProcessEvent(event);
+                       Refresh();
+               }
+       } else if (e.ButtonUp()) {
+               mPanning = mDraggingOrigin = mDraggingKey = false;
+       } else if (e.Moving()) {
+               // mouse moved without buttons
+               int     vw, vh, scroll_x, scroll_y;
+
+               GetVirtualSize(&vw, &vh);
+               GetViewStart(&scroll_x, &scroll_y);
+
+               int origin_x = vw/2 - mDecBmp.GetWidth()/2,
+                       origin_y = vh/2 - mDecBmp.GetHeight()/2,
+                       x = e.GetPosition().x + scroll_x,
+                       y = e.GetPosition().y + scroll_y,
+                       delta_x,
+                       delta_y,
+                       dist_origin,
+                       dist_keypoint;
+
+               delta_x = x - (mFrame->OriginX() + origin_x);
+               delta_y = y - (mFrame->OriginY() + origin_y);
+               dist_origin = delta_x*delta_x + delta_y*delta_y;
+               delta_x = x - (mFrame->KeyX() + origin_x);
+               delta_y = y - (mFrame->KeyY() + origin_y);
+               dist_keypoint = delta_x*delta_x + delta_y*delta_y;
+               // are we near origin or keypoint?
+               if (dist_origin < 25) {
+                       SetCursor(mPointCursor);
+                       mNearOrigin = true;
+                       mNearKey = false;
+               } else if (dist_keypoint < 25) {
+                       SetCursor(mPointCursor);
+                       mNearOrigin = false;
+                       mNearKey = true;
+               } else {
+                       SetCursor(mPanCursor);
+                       mNearOrigin = mNearKey = false;
+               }
+       }
+}
+
+void FrameView::OnSize(wxSizeEvent &e)
+{
+       int cw, ch,
+               vw = (mFrame == NULL || mEncBmp == NULL || mCenterOrigin) ? 0 : mEncBmp->Width(),
+               vh = (mFrame == NULL || mEncBmp == NULL || mCenterOrigin) ? 0 : mEncBmp->Height();
+
+       GetClientSize(&cw, &ch);
+       if (mEncBmp != NULL && mEncBmp->Pixels() != NULL) {
+               if (vw < cw)
+                       vw = cw;
+               if (vh < ch)
+                       vh = ch;
+       } else {
+               vw = cw;
+               vh = ch;
+       }
+       SetVirtualSize(vw, vh);
+}
+
+void FrameView::SetTranspPixelsDisplay(bool show)
+{
+       mWhiteTransparency = show;
+       SetBitmap(mEncBmp);
+       Refresh();
+}
+
+void FrameView::SetCenterOrigin(bool center)
+{
+       mCenterOrigin = center;
+       SetBitmap(mEncBmp);
+       Refresh();
+}
+
+// associate a frame
+void FrameView::SetFrame(ShapesFrame *fp)
+{
+       mFrame = fp;
+       SetBitmap(mEncBmp);
+       Refresh();
+}
+
+ShapesFrame *FrameView::GetFrame(void) const
+{
+       return mFrame;
+}
+
+// associate a bitmap to display (we could do this in SetFrame
+// but we would need a pointer to the original Shapes object)
+void FrameView::SetBitmap(ShapesBitmap *bp)
+{
+       int     cw, ch;
+
+       GetClientSize(&cw, &ch);
+       mEncBmp = bp;
+       if (bp != NULL) {
+               if (bp->Pixels() != NULL) {
+                       if (mCenterOrigin) {
+                               // no scrolling
+                               SetVirtualSize(cw, ch);
+                       } else {
+                               // adjust sizes to make scrolling work
+                               int     vw = mEncBmp->Width(),
+                                       vh = mEncBmp->Height();
+
+                               if (vw < cw)
+                                       vw = cw;
+                               if (vh < ch)
+                                       vh = ch;
+                               SetVirtualSize(vw, vh);
+                       }
+                       // decode bitmap
+                       if (mColorTable != NULL) {
+                               wxImage img = ShapesBitmapToImage(bp, mColorTable, mWhiteTransparency);
+
+                               // apply transformations
+                               if (mFrame) {
+                                       if (mFrame->IsXmirrored())
+                                               img = img.Mirror(true);
+                                       if (mFrame->IsYmirrored())
+                                               img = img.Mirror(false);
+                               }
+                               mDecBmp = wxBitmap(img);
+                       }
+                       Refresh();
+               } else {
+                       wxLogError(wxT("[FrameView] Added a bitmap with NULL pixels"));
+                       SetVirtualSize(cw, ch);
+               }
+       } else {
+               SetVirtualSize(cw, ch);
+       }
+}
+
+// call this before Set'tingBitmap!
+void FrameView::SetColorTable(ShapesColorTable *ct)
+{
+       mColorTable = ct;
+       SetBitmap(mEncBmp);
+       Refresh();
+}
+
diff --git a/Shapes/FrameView.h b/Shapes/FrameView.h
new file mode 100644 (file)
index 0000000..fa670eb
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+//
+// FrameView
+// A widget for displaying a single, full size frame
+//
+
+#ifndef FRAMEVIEW_H
+#define FRAMEVIEW_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "ShapesElements.h"
+
+DECLARE_EVENT_TYPE(wxEVT_FRAMEVIEW_DRAG, -1)
+
+class FrameView: public wxScrolledWindow {
+private:
+       ShapesFrame                     *mFrame;                        // frame data
+       ShapesBitmap            *mEncBmp;                       // encoded bitmap
+       wxBitmap                        mDecBmp;                        // ready-to-draw associated frame bitmap
+       ShapesColorTable        *mColorTable;           // which palette to use for display
+       bool                            mWhiteTransparency;     // hide transparent pixels
+       wxPen                           mOriginPen,
+                                               mKeypointPen;
+       wxCursor                        mPanCursor,
+                                               mPointCursor;
+
+       bool                            mPanning,
+                                               mDraggingOrigin,
+                                               mDraggingKey,
+                                               mNearOrigin,
+                                               mNearKey,
+                                               mCenterOrigin;  // center frame origin rather than frame bitmap
+       int                                     mDragStartX,
+                                               mDragStartY;
+
+protected:
+       DECLARE_EVENT_TABLE();
+
+public:
+       FrameView(wxWindow *parent, wxWindowID id);
+       // event handlers
+       void OnPaint(wxPaintEvent &e);
+       void OnSize(wxSizeEvent &e);
+       void OnDrag(wxMouseEvent &e);
+       // access
+       void SetTranspPixelsDisplay(bool show);
+       void SetCenterOrigin(bool center);
+       void SetFrame(ShapesFrame *fp);
+       ShapesFrame *GetFrame(void) const;
+       void SetBitmap(ShapesBitmap *bp);
+       void SetColorTable(ShapesColorTable *ct);
+};
+
+#endif
diff --git a/Shapes/Makefile.am b/Shapes/Makefile.am
new file mode 100644 (file)
index 0000000..03c4a88
--- /dev/null
@@ -0,0 +1,11 @@
+## Process this file with automake to produce Makefile.in 
+
+noinst_LIBRARIES = libshapes.a
+
+libshapes_a_SOURCES = BitmapBrowser.h BitmapView.h CTBrowser.h         \
+       CTView.h FrameBrowser.h FrameView.h SequenceView.h              \
+       ShapesDocument.h ShapesElements.h ShapesTreeItemData.h          \
+       ShapesView.h utilities.h BitmapBrowser.cpp BitmapView.cpp       \
+       CTBrowser.cpp CTView.cpp FrameBrowser.cpp FrameView.cpp         \
+       SequenceView.cpp ShapesDocument.cpp ShapesElements.cpp          \
+       ShapesView.cpp ShapesTreeItemData.cpp utilities.cpp
diff --git a/Shapes/Makefile.in b/Shapes/Makefile.in
new file mode 100644 (file)
index 0000000..bb26db4
--- /dev/null
@@ -0,0 +1,484 @@
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = Shapes
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libshapes_a_AR = $(AR) $(ARFLAGS)
+libshapes_a_LIBADD =
+am_libshapes_a_OBJECTS = BitmapBrowser.$(OBJEXT) BitmapView.$(OBJEXT) \
+       CTBrowser.$(OBJEXT) CTView.$(OBJEXT) FrameBrowser.$(OBJEXT) \
+       FrameView.$(OBJEXT) SequenceView.$(OBJEXT) \
+       ShapesDocument.$(OBJEXT) ShapesElements.$(OBJEXT) \
+       ShapesView.$(OBJEXT) ShapesTreeItemData.$(OBJEXT) \
+       utilities.$(OBJEXT)
+libshapes_a_OBJECTS = $(am_libshapes_a_OBJECTS)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+       -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libshapes_a_SOURCES)
+DIST_SOURCES = $(libshapes_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SNDFILE_CFLAGS = @SNDFILE_CFLAGS@
+SNDFILE_LIBS = @SNDFILE_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+WX_CFLAGS = @WX_CFLAGS@
+WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@
+WX_CONFIG_PATH = @WX_CONFIG_PATH@
+WX_CPPFLAGS = @WX_CPPFLAGS@
+WX_CXXFLAGS = @WX_CXXFLAGS@
+WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@
+WX_LIBS = @WX_LIBS@
+WX_LIBS_STATIC = @WX_LIBS_STATIC@
+WX_RESCOMP = @WX_RESCOMP@
+WX_VERSION = @WX_VERSION@
+WX_VERSION_MAJOR = @WX_VERSION_MAJOR@
+WX_VERSION_MICRO = @WX_VERSION_MICRO@
+WX_VERSION_MINOR = @WX_VERSION_MINOR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+noinst_LIBRARIES = libshapes.a
+libshapes_a_SOURCES = BitmapBrowser.h BitmapView.h CTBrowser.h         \
+       CTView.h FrameBrowser.h FrameView.h SequenceView.h              \
+       ShapesDocument.h ShapesElements.h ShapesTreeItemData.h          \
+       ShapesView.h utilities.h BitmapBrowser.cpp BitmapView.cpp       \
+       CTBrowser.cpp CTView.cpp FrameBrowser.cpp FrameView.cpp         \
+       SequenceView.cpp ShapesDocument.cpp ShapesElements.cpp          \
+       ShapesView.cpp ShapesTreeItemData.cpp utilities.cpp
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Shapes/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu Shapes/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libshapes.a: $(libshapes_a_OBJECTS) $(libshapes_a_DEPENDENCIES) 
+       -rm -f libshapes.a
+       $(libshapes_a_AR) libshapes.a $(libshapes_a_OBJECTS) $(libshapes_a_LIBADD)
+       $(RANLIB) libshapes.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitmapBrowser.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitmapView.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CTBrowser.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CTView.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FrameBrowser.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FrameView.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SequenceView.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShapesDocument.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShapesElements.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShapesTreeItemData.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShapesView.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utilities.Po@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am
+
+
+# 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/Shapes/SequenceView.cpp b/Shapes/SequenceView.cpp
new file mode 100644 (file)
index 0000000..3d02513
--- /dev/null
@@ -0,0 +1,613 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/ 
+#include "wx/image.h"
+#include "wx/dcbuffer.h"
+#include "SequenceView.h"
+#include "ShapesDocument.h"
+#include "utilities.h"
+
+DEFINE_EVENT_TYPE(wxEVT_SEQUENCEVIEW)
+
+BEGIN_EVENT_TABLE(SequenceView, wxScrolledWindow)
+       EVT_PAINT(SequenceView::OnPaint)
+       EVT_SIZE(SequenceView::OnSize)
+       EVT_LEFT_DOWN(SequenceView::OnMouseDown)
+       EVT_LEFT_DCLICK(SequenceView::OnMouseDoubleClick)
+       EVT_RIGHT_DOWN(SequenceView::OnMouseDown)
+       EVT_LEFT_UP(SequenceView::OnMouseUp)
+       EVT_KEY_DOWN(SequenceView::OnKeyDown)
+       EVT_MOTION(SequenceView::OnMouseMove)
+END_EVENT_TABLE()
+
+const char     arrow_left_bits[] = { 0x08, 0x0c, 0x0e, 0x0f, 0x0e, 0x0c, 0x08 },
+                       arrow_right_bits[] = { 0x01, 0x03, 0x07, 0x0f, 0x07, 0x03, 0x01 };
+
+const int THUMB_ARROW_MARGIN = 2;
+const int THUMB_ARROW_BUTTON_MARGIN = 2;
+
+SequenceView::SequenceView(wxWindow *parent, wxWindowID id):
+       wxScrolledWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER | wxFULL_REPAINT_ON_RESIZE),
+       mColorTable(NULL), mThumbnailSize(64), mMargin(7), mPrevBtnIcon(arrow_left_bits, 4, 7),
+       mNextBtnIcon(arrow_right_bits, 4, 7), mAutoSize(false), mSelection(-1), mFrameIndexes(NULL), mView(0)
+{
+       SetBackgroundStyle(wxBG_STYLE_CUSTOM);
+       SetBackgroundColour(wxColour(255, 255, 255));
+       mThumbnailPen.SetColour(200, 200, 200);
+       mSelectionPen.SetColour(0, 0, 0);
+       mSelectionPen.SetWidth(3);
+       mAngleBrush.SetColour(200, 200, 200);
+       SetScrollRate(2, 2);
+       mAngleLabelSpace = 30;  // TODO get this from real font extent
+       mWhiteTransparency = true;
+       mNumberOfViews = 0;
+       mFramesPerView = 0;
+       mAnimationType = UNANIMATED;
+}
+
+void SequenceView::OnPaint(wxPaintEvent& e)
+{
+       wxAutoBufferedPaintDC   tempdc(this);
+       wxPoint         mouse;
+       int                     cw, ch, rx, ry;
+
+       if (mFrameIndexes == NULL)
+               return;
+
+       DoPrepareDC(tempdc);
+       tempdc.Clear();
+       GetClientSize(&cw, &ch);
+       CalcUnscrolledPosition(0, 0, &rx, &ry);
+       // get mouse position in scrolled coords
+       mouse = ScreenToClient(wxGetMousePosition());
+       mouse.x += rx;
+       mouse.y += ry;
+       // draw thumbnails
+       tempdc.SetPen(mThumbnailPen);
+       tempdc.SetBrush(*wxTRANSPARENT_BRUSH);
+       tempdc.SetTextForeground(wxColour(0, 0, 0));
+       tempdc.SetBackgroundMode(wxTRANSPARENT);
+       for (unsigned int i = 0; i < mThumbnails.size(); i++) {
+               int     x = mThumbnailPositions[i].x,
+                       y = mThumbnailPositions[i].y,
+                       bw = mThumbnails[i].GetWidth(),
+                       bh = mThumbnails[i].GetHeight();
+
+               if ((int)i == mSelection) {
+                       tempdc.DrawBitmap(mThumbnails[i], x + mThumbnailSize/2 - bw/2, y + mThumbnailSize/2 - bh/2);
+                       tempdc.SetPen(mSelectionPen);
+                       tempdc.DrawRectangle(x-2, y-2, mThumbnailSize+4, mThumbnailSize+4);
+                       tempdc.SetPen(mThumbnailPen);
+               } else {
+                       tempdc.DrawRectangle(x-1, y-1, mThumbnailSize+2, mThumbnailSize+2);
+                       tempdc.DrawBitmap(mThumbnails[i], x + mThumbnailSize/2 - bw/2, y + mThumbnailSize/2 - bh/2);
+               }
+               // draw arrow buttons if mouse is over this thumbnail
+               wxRect  tnrect(x, y, mThumbnailSize, mThumbnailSize);
+
+               if (tnrect.Contains(mouse)) {
+                       wxString        label = wxString::Format(wxT("%d"), (*mFrameIndexes)[i]);
+                       int                     labelw, labelh;
+
+                       tempdc.SetFont(*wxSMALL_FONT);
+                       tempdc.DrawBitmap(mPrevBtnIcon, x + 2, y + mThumbnailSize - mPrevBtnIcon.GetHeight() - 2);
+                       tempdc.DrawBitmap(mNextBtnIcon, x + mThumbnailSize - mNextBtnIcon.GetWidth() - 2, y + mThumbnailSize - mNextBtnIcon.GetHeight() - 2);
+                       tempdc.GetTextExtent(label, &labelw, &labelh);
+                       tempdc.SetTextForeground(wxColour(255, 255, 255));
+                       tempdc.DrawText(label, x + (mThumbnailSize-labelw) / 2 - 1, y + mThumbnailSize - labelh - 2);
+                       tempdc.DrawText(label, x + (mThumbnailSize-labelw) / 2 + 1, y + mThumbnailSize - labelh - 2);
+                       tempdc.DrawText(label, x + (mThumbnailSize-labelw) / 2, y + mThumbnailSize - labelh - 2 - 1);
+                       tempdc.DrawText(label, x + (mThumbnailSize-labelw) / 2, y + mThumbnailSize - labelh - 2 + 1);
+                       tempdc.SetTextForeground(wxColour(0, 0, 0));
+                       tempdc.DrawText(label, x + (mThumbnailSize-labelw) / 2, y + mThumbnailSize - labelh - 2);
+               }
+       }
+       if (mThumbnails.size() > 0 && mAnimationType != UNANIMATED && mAnimationType != ANIMATED_1) {
+               // draw angle labels
+               char            *deg = "°";
+               wxString        deg2(deg, wxConvISO8859_1);     // FIXME does not work on OS X (draws infinity char)
+
+               tempdc.SetFont(*wxSMALL_FONT);
+               tempdc.SetBrush(mAngleBrush);
+               for (int i = 0; i < mNumberOfViews; i++) {
+                       wxString        label = wxString::Format(wxT("%d"), i * 360 / mNumberOfViews) + deg2;
+                       int                     tw, th;
+       
+                       tempdc.GetTextExtent(label, &tw, &th);
+                       tempdc.DrawRectangle(mMargin-1, mMargin + i * (mThumbnailSize + mMargin) - 1, mAngleLabelSpace+2, mThumbnailSize+2);
+                       tempdc.DrawText(label, mMargin + mAngleLabelSpace - tw, mMargin + i * (mThumbnailSize + mMargin) + mThumbnailSize/2 - th/2);
+               }
+       }
+}
+
+// widget resized, recalculate virtual size to correctly wrap thumbnails
+void SequenceView::OnSize(wxSizeEvent& e)
+{
+       UpdateVirtualSize();
+}
+
+void SequenceView::OnMouseDown(wxMouseEvent& e)
+{
+       wxClientDC      dc(this);
+       wxPoint         mouse;
+
+       DoPrepareDC(dc);
+       mouse = e.GetLogicalPosition(dc);
+       switch (e.GetButton()) {
+               case wxMOUSE_BTN_LEFT:
+                       // handle frame selection
+                       {
+                               int     new_selection = -1;
+
+                               for (unsigned int i = 0; i < mThumbnailPositions.size(); i++) {
+                                       wxRect  test(mThumbnailPositions[i].x, mThumbnailPositions[i].y,
+                                                                       mThumbnailSize, mThumbnailSize);
+
+                                       if (test.Contains(mouse)) {
+                                               new_selection = i;
+                                               break;
+                                       }
+                               }
+                               if (new_selection != mSelection) {
+                                       mSelection = new_selection;
+                                       Refresh();
+
+                                       // send selection event
+                                       wxCommandEvent  event(wxEVT_SEQUENCEVIEW, GetId());
+
+                                       event.SetEventObject(this);
+                                       event.SetInt(mSelection);
+                                       GetEventHandler()->ProcessEvent(event);
+                               }
+                       }
+                       break;
+               case wxMOUSE_BTN_RIGHT:
+                       break;
+       }
+       e.Skip();
+}
+
+void SequenceView::OnMouseUp(wxMouseEvent& e)
+{
+       wxClientDC  dc(this);
+       wxPoint     mouse;
+       
+       DoPrepareDC(dc);
+       mouse = e.GetLogicalPosition(dc);
+       switch (e.GetButton()) {
+               case wxMOUSE_BTN_LEFT:
+                       // clicks on the little arrows change the associated frame index
+                       // FIXME mouse tracking like real buttons (starting with a mouse down)
+                       {
+                               // find wether the mouse was released over a thumbnail
+                               int touched_thumbnail = -1;
+                               
+                               for (unsigned int i = 0; i < mThumbnailPositions.size(); i++) {
+                                       wxRect  test(mThumbnailPositions[i].x, mThumbnailPositions[i].y,
+                                                                       mThumbnailSize, mThumbnailSize);
+                                       
+                                       if (test.Contains(mouse)) {
+                                               touched_thumbnail = i;
+                                               break;
+                                       }
+                               }
+                               if (touched_thumbnail > -1) {
+                                       // find wether an arrow was touched
+                                       if (GetPrevArrowButtonRect(touched_thumbnail).Contains(mouse)) {
+                                               if ((*mFrameIndexes)[touched_thumbnail] > -1) {
+                                                       (*mFrameIndexes)[touched_thumbnail]--;
+                                                       RebuildThumbnail(touched_thumbnail);
+                                                       Refresh();
+                                                       if (mView) {
+                                                               static_cast<ShapesDocument*>(mView->GetDocument())->Modify(true);
+                                                       }
+                                               }
+                                       } else if (GetNextArrowButtonRect(touched_thumbnail).Contains(mouse)) {
+                                               if ((*mFrameIndexes)[touched_thumbnail] < ((int)mFrames.size()-1)) {
+                                                       (*mFrameIndexes)[touched_thumbnail]++;
+                                                       RebuildThumbnail(touched_thumbnail);
+                                                       Refresh();
+                                                       if (mView) {
+                                                               static_cast<ShapesDocument*>(mView->GetDocument())->Modify(true);
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       break;
+       }
+       e.Skip();
+}
+
+void SequenceView::OnMouseMove(wxMouseEvent &e)
+{
+       Refresh();
+}
+
+void SequenceView::OnKeyDown(wxKeyEvent &e)
+{
+       if (e.ShiftDown()) {
+               // edit frame index of selection
+               switch (e.GetKeyCode()) {
+                       case WXK_LEFT:
+                               if (mSelection >= 0) {
+                                       if ((*mFrameIndexes)[mSelection] > -1) {
+                                               (*mFrameIndexes)[mSelection]--;
+                                               RebuildThumbnail(mSelection);
+                                               Refresh();
+                                               if (mView) {
+                                                       static_cast<ShapesDocument*>(mView->GetDocument())->Modify(true);
+                                               }
+                                       }
+                               }
+                               break;
+                       case WXK_RIGHT:
+                               if (mSelection >= 0) {
+                                       if ((*mFrameIndexes)[mSelection] < ((int)mFrames.size()-1)) {
+                                               (*mFrameIndexes)[mSelection]++;
+                                               RebuildThumbnail(mSelection);
+                                               Refresh();
+                                               if (mView) {
+                                                       static_cast<ShapesDocument*>(mView->GetDocument())->Modify(true);
+                                               }
+                                       }
+                               }
+                               break;
+                       default:
+                               e.Skip();
+                               break;
+               }
+       } else {
+               // edit selection with arrow keys
+               int     new_selection = mSelection;
+
+               if (mSelection >= 0 && mSelection < (mNumberOfViews * mFramesPerView)) {
+                       switch (e.GetKeyCode()) {
+                               case WXK_LEFT:
+                                       if (mSelection % mFramesPerView > 0)
+                                               new_selection--;
+                                       break;
+                               case WXK_RIGHT:
+                                       if (mSelection % mFramesPerView < (mFramesPerView-1))
+                                               new_selection++;
+                                       break;
+                               case WXK_UP:
+                                       if (mSelection / mFramesPerView > 0)
+                                               new_selection -= mFramesPerView;
+                                       break;
+                               case WXK_DOWN:
+                                       if (mSelection / mFramesPerView < (mNumberOfViews-1))
+                                               new_selection += mFramesPerView;
+                                       break;
+                               case WXK_RETURN:
+                               case WXK_NUMPAD_ENTER:
+                                       PopupFrameIndexDialog(mSelection);
+                                       break;
+                               default:
+                                       e.Skip();
+                       }
+               } else if (mNumberOfViews * mFramesPerView > 0) {
+                       new_selection = 0;
+               }
+               // TODO scroll to show the new position
+               if (new_selection != mSelection) {
+                       mSelection = new_selection;
+                       Refresh();
+                       
+                       // send selection event
+                       wxCommandEvent  event(wxEVT_SEQUENCEVIEW, GetId());
+
+                       event.SetEventObject(this);
+                       event.SetInt(mSelection);
+                       GetEventHandler()->ProcessEvent(event);
+               }
+       }
+}
+
+void SequenceView::OnMouseDoubleClick(wxMouseEvent& e)
+{
+       wxClientDC dc(this);
+       wxPoint mouse;
+
+       DoPrepareDC(dc);
+       mouse = e.GetLogicalPosition(dc);
+       switch (e.GetButton()) {
+       case wxMOUSE_BTN_LEFT: 
+       {
+               int selection = -1;
+               for (unsigned int i = 0; i < mThumbnailPositions.size(); ++i) {
+                       wxRect test(mThumbnailPositions[i].x, mThumbnailPositions[i].y, mThumbnailSize, mThumbnailSize);
+                       if (test.Contains(mouse)) {
+                               selection = i;
+                               break;
+                       }
+               }
+               
+               if (selection != -1) {
+                       if (!GetPrevArrowButtonRect(selection).Contains(mouse) &&
+                           !GetNextArrowButtonRect(selection).Contains(mouse)) {       
+                               PopupFrameIndexDialog(selection);
+                       }
+               }
+       }
+       break;
+       }
+}
+
+int SequenceView::GetSelection(void) const
+{
+       return mSelection;
+}
+
+void SequenceView::SetThumbnailSize(int size)
+{
+       if (size > 0) {
+               mThumbnailSize = size;
+               mAutoSize = false;
+       } else {
+               mAutoSize = true;
+       }
+       UpdateVirtualSize();
+       if (!mAutoSize)
+               RebuildThumbnails();
+       Refresh();
+}
+
+void SequenceView::SetTranspPixelsDisplay(bool show)
+{
+       mWhiteTransparency = show;
+       RebuildThumbnails();
+       Refresh();
+}
+
+// add a new ShapesFrame to the thumbnail list
+void SequenceView::AddFrame(ShapesFrame *fp)
+{
+       if (fp != NULL)
+               mFrames.push_back(fp);
+}
+
+// add a ShapesBitmap to the bitmap pointer list. Call before adding frames!
+void SequenceView::AddBitmap(ShapesBitmap *bp)
+{
+       if (bp != NULL) {
+               if (bp->Pixels() != NULL)
+                       mBitmaps.push_back(bp);
+               else
+                       wxLogError(wxT("SequenceView: someone tried to add a bitmap with NULL pixels"));
+       }
+}
+
+// set sequence parameters: frames per view, animation type and frame index array.
+// Guess number of views from animation type. Also create thumbnails (add frames,
+// bitmaps and set color table before!)
+void SequenceView::SetSeqParameters(int animtype, int fpv, vector<short> *indexes, wxView* view)
+{
+       mAnimationType = animtype;
+       mNumberOfViews = ActualNumberOfViews(animtype);
+       mFramesPerView = fpv;
+       mFrameIndexes = indexes;
+       mView = view;
+       RebuildThumbnails();
+       UpdateVirtualSize();
+       Refresh();
+}
+
+// clear the thumbnail list
+void SequenceView::Clear(void)
+{
+       mThumbnails.clear();
+       mFrames.clear();
+       mBitmaps.clear();
+       mThumbnailPositions.clear();
+       mSelection = -1;
+       UpdateVirtualSize();
+       Refresh();
+}
+
+// call before adding frames!
+void SequenceView::SetColorTable(ShapesColorTable *ct)
+{
+       mColorTable = ct;
+       RebuildThumbnails();
+       Refresh();
+}
+
+// calculate and set the wxWindow virtual size, based on the
+// number of thumbnails, thumbnail dimensions and given visible
+// size. Also pre-calculate thumbnail positions
+// FIXME behave like a FrameBrowser if mAnimationType == UNANIMATED,
+// because frames are just to be chosen randomly and not really
+// an animation. 
+void SequenceView::UpdateVirtualSize(void)
+{
+       wxClientDC      dc(this);
+       int                     numframes = mThumbnails.size(),
+                               width, height,
+                               additional_pad = (mAnimationType == UNANIMATED || mAnimationType == ANIMATED_1)
+                                                                       ? 0 : (mAngleLabelSpace + mMargin);
+
+       if (numframes < 1 || mFrameIndexes == NULL) {
+               SetVirtualSize(0, 0);
+               return;
+       }
+       GetClientSize(&width, &height);
+       if (mAutoSize && numframes > 0) {
+               // calculate the best tn_size
+               // (its maximum value not requiring window scrolling)
+               int     max_bitmap_dimension = 0,
+                       new_tn_size;
+
+               SetScrollRate(0, 0);
+               // find greatest dimension among all referenced bitmaps
+               for (unsigned int i = 0; i < mFrameIndexes->size(); i++) {
+                       int     frame_index = (*mFrameIndexes)[i];
+
+                       if (frame_index < 0 || frame_index >= (int)mFrames.size())
+                               continue;
+
+                       int     bitmap_index = mFrames[frame_index]->BitmapIndex();
+
+                       if (bitmap_index < 0 || bitmap_index >= (int)mBitmaps.size())
+                               continue;
+                       if (mBitmaps[bitmap_index]->Width() > max_bitmap_dimension)
+                               max_bitmap_dimension = mBitmaps[bitmap_index]->Width();
+                       if (mBitmaps[bitmap_index]->Height() > max_bitmap_dimension)
+                               max_bitmap_dimension = mBitmaps[bitmap_index]->Height();
+               }
+               // start with a minimum size and increase it until overflow
+               for (new_tn_size = 2*mMargin; ; new_tn_size++) {
+                       int     numcols = mFramesPerView,
+                               numrows = mNumberOfViews,
+                               total_width = numcols * (new_tn_size + mMargin) + mMargin + additional_pad,
+                               total_height = numrows * (new_tn_size + mMargin) + mMargin;
+
+                       if (total_width > width || total_height > height) {
+                               // here we are
+                               new_tn_size--;
+                               break;
+                       }
+                       if (max_bitmap_dimension > 0 && new_tn_size >= max_bitmap_dimension) {
+                               // no point in wasting window space with huge
+                               // thumbnails showing small bitmaps at their center
+                               break;
+                       }
+               }
+               if (new_tn_size != mThumbnailSize) {
+                       mThumbnailSize = new_tn_size;
+                       RebuildThumbnails();
+               }
+       } else {
+               SetScrollRate(2, 2);
+       }
+
+       // now row & column count is simply mNumberOfViews and mFramesPerView,
+       // not the mess needed in the FrameBrowser
+       int     numcols = mFramesPerView,
+               numrows = mNumberOfViews;
+
+       SetVirtualSize(numcols * (mThumbnailSize + mMargin) + mMargin + additional_pad,
+                                       numrows * (mThumbnailSize + mMargin) + mMargin);
+
+       // recalculate thumbnail positions
+       mThumbnailPositions.clear();
+       for (int r = 0; r < numrows; r++) {
+               for (int c = 0; c < numcols; c++)
+                       mThumbnailPositions.push_back(wxPoint(mMargin + (mThumbnailSize + mMargin) * c + additional_pad,
+                                                                                       mMargin + (mThumbnailSize + mMargin) * r));
+       }
+}
+
+// transform an ShapesFrame to a wxBitmap thumbnail
+wxBitmap SequenceView::CreateThumbnail(ShapesFrame *fp)
+{
+       if (fp->BitmapIndex() < 0 || fp->BitmapIndex() >= (int)mBitmaps.size()) {
+               // invalid or unset bitmap
+               // FIXME we are rebuilding this wxBitmap each time! Build it once
+               // and store it somewhere (rebuild upon tn_size change)
+               return BadThumbnail(mThumbnailSize);
+       } else {
+               // valid bitmap
+               ShapesBitmap    *bp = mBitmaps[fp->BitmapIndex()];
+               wxImage                 newimg(bp->Width(), bp->Height());
+
+               // decode the bitmap to a wxImage
+               if (mColorTable)
+                       newimg = ShapesBitmapToImage(bp, mColorTable, mWhiteTransparency);
+
+               // apply frame transformations
+               if (fp->IsXmirrored())
+                       newimg = newimg.Mirror(true);
+               if (fp->IsYmirrored())
+                       newimg = newimg.Mirror(false);
+
+               // TODO apply transfer mode
+
+               return ImageThumbnail(newimg, mThumbnailSize, true);
+       }
+}
+
+void SequenceView::RebuildThumbnail(unsigned int i)
+{
+       if (i < mThumbnails.size() && i < mFrameIndexes->size()) {
+               if ((*mFrameIndexes)[i] >= 0 && (*mFrameIndexes)[i] < (int)mFrames.size())
+                       mThumbnails[i] = CreateThumbnail(mFrames[(*mFrameIndexes)[i]]);
+               else
+                       mThumbnails[i] = BadThumbnail(mThumbnailSize);
+       }
+}
+
+// redecode frames to bitmaps (after color table change, frame parameter variations etc)
+void SequenceView::RebuildThumbnails(void)
+{
+       mThumbnails.clear();
+       if (mFrameIndexes != NULL) {
+               for (unsigned int i = 0; i < mFrameIndexes->size(); i++) {
+                       if ((*mFrameIndexes)[i] >= 0 && (*mFrameIndexes)[i] < (int)mFrames.size())
+                               mThumbnails.push_back(CreateThumbnail(mFrames[(*mFrameIndexes)[i]]));
+                       else
+                               mThumbnails.push_back(BadThumbnail(mThumbnailSize));
+               }
+       }
+}
+
+void SequenceView::PopupFrameIndexDialog(int selection)
+{
+       long v = 0;
+       if (wxGetTextFromUser(_("Change frame:"), _("Chage frame"), wxString::Format(wxT("%i"), (*mFrameIndexes)[selection]), GetParent()).ToLong(&v)) {
+               if (v >= -1 && v <= static_cast<int>(mFrames.size()) - 1) {
+                       (*mFrameIndexes)[selection] = v;
+                       RebuildThumbnail(selection);
+                       Refresh();
+                       if (mView) {
+                               static_cast<ShapesDocument*>(mView->GetDocument())->Modify(true);
+                       }
+               }
+       }
+}
+
+wxRect SequenceView::GetNextArrowButtonRect(int thumbnail_index) const
+{
+       int thumb_x = mThumbnailPositions[thumbnail_index].x;
+       int thumb_y = mThumbnailPositions[thumbnail_index].y;
+
+       int x = thumb_x + mThumbnailSize - mNextBtnIcon.GetWidth() - THUMB_ARROW_MARGIN;
+       int y = thumb_y + mThumbnailSize - mNextBtnIcon.GetHeight() - THUMB_ARROW_MARGIN;
+       int w = mPrevBtnIcon.GetWidth();
+       int h = mPrevBtnIcon.GetHeight();
+
+       return wxRect(x - THUMB_ARROW_BUTTON_MARGIN,
+                     y - THUMB_ARROW_BUTTON_MARGIN,
+                     w + 2 * THUMB_ARROW_BUTTON_MARGIN,
+                     h + 2 * THUMB_ARROW_BUTTON_MARGIN);
+}
+
+wxRect SequenceView::GetPrevArrowButtonRect(int thumbnail_index) const
+{
+       int thumb_x = mThumbnailPositions[thumbnail_index].x;
+       int thumb_y = mThumbnailPositions[thumbnail_index].y;
+
+       int x = thumb_x + THUMB_ARROW_MARGIN;
+       int y = thumb_y + mThumbnailSize - mNextBtnIcon.GetHeight() - THUMB_ARROW_MARGIN;
+       int w = mPrevBtnIcon.GetWidth();
+       int h = mPrevBtnIcon.GetHeight();
+
+       return wxRect(x - THUMB_ARROW_BUTTON_MARGIN, 
+                     y - THUMB_ARROW_BUTTON_MARGIN,
+                     w + 2 * THUMB_ARROW_BUTTON_MARGIN,
+                     h + 2 * THUMB_ARROW_BUTTON_MARGIN);
+}
diff --git a/Shapes/SequenceView.h b/Shapes/SequenceView.h
new file mode 100644 (file)
index 0000000..5e291e0
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+//
+// SequenceView
+// An editor widget for sequence frames. It displays the frames of a
+// sequence keeping them organized in views.
+//
+
+#ifndef SEQUENCEVIEW_H
+#define SEQUENCEVIEW_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "wx/docview.h"
+#include "ShapesElements.h"
+
+DECLARE_EVENT_TYPE(wxEVT_SEQUENCEVIEW, -1)
+
+class SequenceView: public wxScrolledWindow {
+private:
+       vector<ShapesFrame*>    mFrames;                // pointers to frames
+       vector<ShapesBitmap*>   mBitmaps;               // pointers to bitmaps
+       vector<wxBitmap>                mThumbnails;    // scaled/rendered frame thumbnails
+       ShapesColorTable                *mColorTable;           // which palette to use for display
+       vector<wxPoint>                 mThumbnailPositions;    // thumbnail positions within window
+       wxCoord                                 mThumbnailSize,
+                                                       mMargin,                        // margin between thumbnails and window edges
+                                                       mAngleLabelSpace;
+       wxBitmap                                mPrevBtnIcon,
+                                                       mNextBtnIcon;
+       bool                                    mAutoSize,
+                                                       mWhiteTransparency;
+       int                                             mSelection;                     // selected thumbnail
+       wxPen                                   mThumbnailPen,
+                                                       mSelectionPen;
+       wxBrush                                 mAngleBrush;
+
+       int                                             mNumberOfViews,
+                                                       mFramesPerView,
+                                                       mAnimationType;
+       vector<short>                   *mFrameIndexes;
+
+       wxBitmap CreateThumbnail(ShapesFrame *fp);
+       void UpdateVirtualSize(void);
+
+       void PopupFrameIndexDialog(int index);
+       wxView* mView;
+
+       wxRect GetNextArrowButtonRect(int thumbnail_index) const;
+       wxRect GetPrevArrowButtonRect(int thumbnail_index) const;
+
+protected:
+       DECLARE_EVENT_TABLE();
+
+public:
+       SequenceView(wxWindow *parent, wxWindowID id);
+       // event handlers
+       void OnPaint(wxPaintEvent& e);
+       void OnSize(wxSizeEvent& e);
+       void OnMouseDown(wxMouseEvent& e);
+       void OnMouseMove(wxMouseEvent &e);
+       void OnMouseUp(wxMouseEvent& e);
+       void OnKeyDown(wxKeyEvent& e);
+       void OnMouseDoubleClick(wxMouseEvent& e);
+       // access methods
+       int GetSelection(void) const;
+       void SetThumbnailSize(int size);
+       void SetTranspPixelsDisplay(bool show);
+       void AddFrame(ShapesFrame *fp);
+       void AddBitmap(ShapesBitmap *bp);
+       void SetColorTable(ShapesColorTable *ct);
+       void SetSeqParameters(int animtype, int fpv, vector<short> *indexes, wxView* view);
+       void Clear(void);
+       // utilities
+       void RebuildThumbnail(unsigned int i);
+       void RebuildThumbnails(void);
+};
+
+#endif
diff --git a/Shapes/ShapesDocument.cpp b/Shapes/ShapesDocument.cpp
new file mode 100644 (file)
index 0000000..ea279ce
--- /dev/null
@@ -0,0 +1,344 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+#include "wx/datstrm.h"
+#include "ShapesDocument.h"
+
+IMPLEMENT_DYNAMIC_CLASS(ShapesDocument, wxDocument)
+
+ShapesDocument::ShapesDocument():
+       wxDocument(), ShapesElement(false)
+{
+
+}
+
+ShapesDocument::~ShapesDocument()
+{
+
+}
+
+unsigned int ShapesDocument::CollectionCount(void) const
+{
+       return mCollections.size();
+}
+
+// collection data access
+int ShapesDocument::CollectionStatus(unsigned int id)
+{
+       return mCollections[id]->Status();
+}
+
+unsigned int ShapesDocument::CollectionFlags(unsigned int id) const
+{
+       return mCollections[id]->Flags();
+}
+
+bool ShapesDocument::CollectionDefined(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->Defined(chunk);
+}
+
+int ShapesDocument::CollectionVersion(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->Version(chunk);
+}
+
+int ShapesDocument::CollectionType(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->Type(chunk);
+}
+
+unsigned int ShapesDocument::CollectionFlags(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->Flags(chunk);
+}
+
+int ShapesDocument::CollectionScaleFactor(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->ScaleFactor(chunk);
+}
+
+unsigned int ShapesDocument::CollectionBitmapCount(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->BitmapCount(chunk);
+}
+
+unsigned int ShapesDocument::CollectionColorTableCount(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->ColorTableCount(chunk);
+}
+
+unsigned int ShapesDocument::CollectionFrameCount(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->FrameCount(chunk);
+}
+
+unsigned int ShapesDocument::CollectionSequenceCount(unsigned int id, unsigned int chunk) const
+{
+       return mCollections[id]->SequenceCount(chunk);
+}
+
+ShapesColorTable *ShapesDocument::GetColorTable(unsigned int coll, unsigned int chunk, unsigned int ct) const
+{
+       return mCollections[coll]->GetColorTable(chunk, ct);
+}
+
+ShapesBitmap *ShapesDocument::GetBitmap(unsigned int coll, unsigned int chunk, unsigned int bitmap) const
+{
+       return mCollections[coll]->GetBitmap(chunk, bitmap);
+}
+
+ShapesFrame *ShapesDocument::GetFrame(unsigned int coll, unsigned int chunk, unsigned int frame) const
+{
+       return mCollections[coll]->GetFrame(chunk, frame);
+}
+
+ShapesSequence *ShapesDocument::GetSequence(unsigned int coll, unsigned int chunk, unsigned int seq) const
+{
+       return mCollections[coll]->GetSequence(chunk, seq);
+}
+
+ShapesChunk* ShapesDocument::GetChunk(unsigned int coll, unsigned int chunk) const
+{
+       return mCollections[coll]->GetChunk(chunk);
+}
+
+// collection alteration
+void ShapesDocument::InsertColorTable(ShapesColorTable *ct, unsigned int coll, unsigned int chunk)
+{
+       mCollections[coll]->InsertColorTable(ct, chunk);
+}
+
+void ShapesDocument::DeleteColorTable(unsigned int coll, unsigned int chunk, unsigned int ct)
+{
+       mCollections[coll]->DeleteColorTable(chunk, ct);
+}
+
+void ShapesDocument::InsertBitmap(ShapesBitmap *b, unsigned int coll, unsigned int chunk)
+{
+       mCollections[coll]->InsertBitmap(b, chunk);
+}
+
+void ShapesDocument::DeleteBitmap(unsigned int coll, unsigned int chunk, unsigned int b)
+{
+       mCollections[coll]->DeleteBitmap(chunk, b);
+}
+
+void ShapesDocument::InsertFrame(ShapesFrame *f, unsigned int coll, unsigned int chunk)
+{
+       mCollections[coll]->InsertFrame(f, chunk);
+}
+
+void ShapesDocument::DeleteFrame(unsigned int coll, unsigned int chunk, unsigned int f)
+{
+       mCollections[coll]->DeleteFrame(chunk, f);
+}
+
+void ShapesDocument::InsertSequence(ShapesSequence *s, unsigned int coll, unsigned int chunk)
+{
+       mCollections[coll]->InsertSequence(s, chunk);
+}
+
+void ShapesDocument::DeleteSequence(unsigned int coll, unsigned int chunk, unsigned int s)
+{
+       mCollections[coll]->DeleteSequence(chunk, s);
+}
+
+bool ShapesDocument::DoOpenDocument(const wxString& file)
+{
+       bool wxOpen = wxDocument::DoOpenDocument(file);
+       
+       if (!(wxOpen && mGoodData)) {
+               wxLogError(wxT("[ShapesDocument] There was an error while loading, see log"));
+               return false;
+       }
+       return true;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD ostream& ShapesDocument::SaveObject(wxSTD ostream& stream)
+#else
+wxOutputStream& ShapesDocument::SaveObject(wxOutputStream& stream)
+#endif
+{
+       unsigned int    collectionCount = CollectionCount();
+       
+       // compose and write the collection header block
+       BigEndianBuffer raw_headers(SIZEOF_collection_header * collectionCount);
+       long                    running_offset = SIZEOF_collection_header * collectionCount;
+
+       for (unsigned int i = 0; i < collectionCount; i++) {
+               ShapesCollection        *coll = mCollections[i];
+
+               raw_headers.WriteShort(coll->Status());
+               raw_headers.WriteUShort(coll->Flags());
+               // 8-bit version
+               if (coll->Defined(COLL_VERSION_8BIT)) {
+                       unsigned int    collSize = coll->SizeInFile(COLL_VERSION_8BIT);
+
+                       raw_headers.WriteLong(running_offset);
+                       raw_headers.WriteLong(collSize);
+                       running_offset += collSize;
+               } else {
+                       raw_headers.WriteLong(-1);
+                       raw_headers.WriteLong(0);
+               }
+               // truecolor version
+               if (coll->Defined(COLL_VERSION_TRUECOLOR)) {
+                       unsigned int    collSize = coll->SizeInFile(COLL_VERSION_TRUECOLOR);
+
+                       raw_headers.WriteLong(running_offset);
+                       raw_headers.WriteLong(collSize);
+                       running_offset += collSize;
+               } else {
+                       raw_headers.WriteLong(-1);
+                       raw_headers.WriteLong(0);
+               }
+               raw_headers.WriteZeroes(12);
+       }
+#if wxUSE_STD_IOSTREAM
+       stream.write((char *)raw_headers.Data(), raw_headers.Size());
+#else
+       stream.Write((char *)raw_headers.Data(), raw_headers.Size());
+#endif
+       
+       // write collections
+       for (unsigned int i = 0; i < collectionCount; i++)
+               mCollections[i]->SaveObject(stream);
+       
+       return stream;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD ostream& ShapesDocument::SavePatch(wxSTD ostream& stream, const ShapesDocument& other)
+#else
+wxOutputStream& ShapesDocument::SavePatch(wxOutputStream& stream, const ShapesDocument& other)
+#endif
+{
+       if (mCollections.size() != other.mCollections.size()) {
+               wxLogError(wxT("[ShapesDocument] Shapes files must contain the same number of collections to generate a patch"));
+               return stream;
+       }
+
+       // 8-bit versions
+       for (unsigned int i = 0; i < mCollections.size(); ++i) {
+               mCollections[i]->SavePatch(stream, *other.mCollections[i], i, 0);
+       }
+
+       for (unsigned int i = 0; i < mCollections.size(); ++i) {
+               mCollections[i]->SavePatch(stream, *other.mCollections[i], i, 1);
+       }
+
+       return stream;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD istream& ShapesDocument::LoadObject(wxSTD istream& stream)
+#else
+wxInputStream& ShapesDocument::LoadObject(wxInputStream& stream)
+#endif
+{
+       mGoodData = false;
+       
+       // first check file size to immediately rule out invalid stuff
+#if wxUSE_STD_IOSTREAM
+       stream.seekg(0, std::ios::end);
+       wxInt32 filesize = stream.tellg();
+       stream.seekg(0, std::ios::beg);
+#else
+       wxInt32 filesize = stream.GetSize();
+#endif
+       if (filesize < COLLECTIONS_PER_FILE * SIZEOF_collection_header) {
+               wxLogError(wxT("[ShapesDocument] File too small to be a Marathon shapes file"));
+               return stream;
+       }
+
+       // find how many collections are stored and load them
+       unsigned int    i = 0;
+
+       while (true) {
+               ShapesCollection        *c = new ShapesCollection(IsVerbose());
+
+               if (IsVerbose())
+                       wxLogDebug(wxT("[ShapesDocument] Trying to load collection %d"), i);
+
+#if wxUSE_STD_IOSTREAM
+               stream.seekg(i * SIZEOF_collection_header, std::ios::beg);
+#else
+               stream.SeekI(i * SIZEOF_collection_header);
+#endif
+               c->LoadObject(stream);
+
+               if (c->IsGood()) {
+                       mCollections.push_back(c);
+                       i++;
+               } else {
+                       break;
+               }
+       }
+       if (i >= COLLECTIONS_PER_FILE)
+               mGoodData = true;
+       else
+               wxLogError(wxT("[ShapesDocument] Could not find enough collections. This may not be a Marathon Shapes file."));
+
+       return stream;
+}
+
+#if wxUSE_STD_IOSTREAM
+bool ShapesDocument::LoadPatch(wxSTD istream& stream)
+#else
+bool ShapesDocument::LoadPatch(wxInputStream& stream)
+#endif
+{
+#if wxUSE_STD_IOSTREAM
+       stream.seekg(0, std::ios::end);
+       wxInt32 filesize = stream.tellg();
+       stream.seekg(0, std::ios::beg);
+#else
+       wxInt32 filesize = stream.GetSize();
+#endif
+
+       // memory is cheap, read the whole thing in
+       BigEndianBuffer buffer(filesize);
+       
+#if wxUSE_STD_IOSTREAM
+       stream.read((char *) buffer.Data(), buffer.Size());
+#else
+       stream.Read((char *) buffer.Data(), buffer.Size());
+#endif
+
+       while (buffer.Position() < buffer.Size()) {
+               long collection = buffer.ReadLong();
+               if (collection < mCollections.size()) {
+                       mCollections[collection]->LoadPatch(buffer);
+                       if (!mCollections[collection]->IsGood()) {
+                               return false;
+                       }
+               } else {
+                       wxLogError(wxT("Shapes patches cannot add entire collections"));
+                       return false;
+               }
+       }
+
+       return true;
+}
diff --git a/Shapes/ShapesDocument.h b/Shapes/ShapesDocument.h
new file mode 100644 (file)
index 0000000..d859643
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+//
+// Shapes
+// Shapes class representing what's inside a Marathon shapes file.
+// Note that, for keeping things simple and providing compatibility,
+// the class doesn't store everything using the original on-disk format.
+// For example, flags are expanded to bool fields and fixed point values
+// are converted to doubles. Every bitmap is converted to a simple block
+// of width*height pixels, regardless of its compression and pixel order.
+// Conversions take place only when actually loading and writing files.
+//
+
+#ifndef SHAPESDOCUMENT_H
+#define SHAPESDOCUMENT_H
+
+#include "wx/docview.h"
+#include "ShapesElements.h"
+
+// class representing the contents of a Marathon shapes file
+class ShapesDocument: public wxDocument, public ShapesElement
+{
+    DECLARE_DYNAMIC_CLASS(ShapesDocument)
+
+private:
+       vector<ShapesCollection*>       mCollections;
+
+public:
+       unsigned int CollectionCount(void) const;
+       // collection data access
+       int CollectionStatus(unsigned int id);
+       unsigned int CollectionFlags(unsigned int id) const;
+       bool CollectionDefined(unsigned int id, unsigned int chunk) const;
+       int CollectionVersion(unsigned int id, unsigned int chunk) const;
+       int CollectionType(unsigned int id, unsigned int chunk) const;
+       unsigned int CollectionFlags(unsigned int id, unsigned int chunk) const;
+       int CollectionScaleFactor(unsigned int id, unsigned int chunk) const;
+       unsigned int CollectionBitmapCount(unsigned int id, unsigned int chunk) const;
+       unsigned int CollectionColorTableCount(unsigned int id, unsigned int chunk) const;
+       unsigned int CollectionFrameCount(unsigned int id, unsigned int chunk) const;
+       unsigned int CollectionSequenceCount(unsigned int id, unsigned int chunk) const;
+       ShapesColorTable *GetColorTable(unsigned int coll, unsigned int chunk, unsigned int ct) const;
+       ShapesBitmap *GetBitmap(unsigned int coll, unsigned int chunk, unsigned int bitmap) const;
+       ShapesFrame *GetFrame(unsigned int coll, unsigned int chunk, unsigned int frame) const;
+       ShapesSequence *GetSequence(unsigned int coll, unsigned int chunk, unsigned int seq) const;
+       ShapesChunk* GetChunk(unsigned int coll, unsigned int chunk) const;
+       // collection alteration
+       void InsertColorTable(ShapesColorTable *ct, unsigned int coll, unsigned int chunk);
+       void DeleteColorTable(unsigned int coll, unsigned int chunk, unsigned int ct);
+       void InsertBitmap(ShapesBitmap *b, unsigned int coll, unsigned int chunk);
+       void DeleteBitmap(unsigned int coll, unsigned int chunk, unsigned int b);
+       void InsertFrame(ShapesFrame *f, unsigned int coll, unsigned int chunk);
+       void DeleteFrame(unsigned int coll, unsigned int chunk, unsigned int f);
+       void InsertSequence(ShapesSequence *s, unsigned int coll, unsigned int chunk);
+       void DeleteSequence(unsigned int coll, unsigned int chunk, unsigned int s);
+
+       bool DoOpenDocument(const wxString& file);
+
+#if wxUSE_STD_IOSTREAM
+       wxSTD ostream& SaveObject(wxSTD ostream& stream);
+       wxSTD istream& LoadObject(wxSTD istream& stream);
+       wxSTD ostream& SavePatch(wxSTD ostream& stream, const ShapesDocument& other);
+       bool LoadPatch(wxSTD istream& stream);
+#else
+       wxOutputStream& SaveObject(wxOutputStream& stream);
+       wxInputStream& LoadObject(wxInputStream& stream);
+       wxOutputStream& SavePatch(wxOutputStream& stream, const ShapesDocument& other);
+       bool LoadPatch(wxInputStream& stream);
+#endif
+
+    ShapesDocument(void);
+    ~ShapesDocument(void);
+};
+
+#endif
diff --git a/Shapes/ShapesElements.cpp b/Shapes/ShapesElements.cpp
new file mode 100644 (file)
index 0000000..90182c6
--- /dev/null
@@ -0,0 +1,2093 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include <fstream>
+#include "ShapesElements.h"
+#include "utilities.h"
+#include "../LittleEndianBuffer.h"
+#include <algorithm>
+#include <memory>
+
+// on-file struct sizes
+#define SIZEOF_collection_definition           544
+#define SIZEOF_rgb_color_value                         8
+#define SIZEOF_bitmap_definition                       30
+#define SIZEOF_low_level_shape_definition      36
+#define SIZEOF_high_level_shape_definition     88
+// NOTE about SIZEOF_high_level_shape_definition. The original engine
+// sets SIZEOF_high_level_shape_definition=90 because the first frame
+// index is included in the high_level_shape_definition. I don't like
+// this, so I do my way (but be careful!)
+#define COLLECTION_VERSION                                     3
+
+// color flags
+enum {
+       SELF_LUMINESCENT_COLOR  = 1 << 7
+};
+// bitmap flags
+enum {
+       COLUMN_ORDER                    = 1 << 15,
+       TRANSPARENCY_ENABLED    = 1 << 14
+};
+// frame flags
+enum {
+       X_MIRROR                        = 1 << 15,      // mirror along vertical axis
+       Y_MIRROR                        = 1 << 14,      // mirror along horizontal axis
+       KEYPOINT_OBSCURED       = 1 << 13       // "host obscures parasite" (RenderPlaceObjs.cpp)
+};
+
+#define FOUR_CHARS_TO_INT(a,b,c,d) (((unsigned int)(a) << 24) | ((unsigned int)(b) << 16) | ((unsigned int)(c) << 8) | (unsigned int)(d))
+
+ShapesColor::ShapesColor(bool verbose): ShapesElement(verbose)
+{
+
+}
+
+ShapesColor::ShapesColor(unsigned int r, unsigned int g, unsigned int b, unsigned int value, bool luminescent, bool verbose):
+        ShapesElement(verbose), mLuminescent(luminescent), mValue(value), mRed(r), mGreen(g), mBlue(b)
+{
+
+}
+
+ShapesColor::~ShapesColor(void)
+{
+
+}
+
+bool ShapesColor::operator==(const ShapesColor& other) const
+{
+       return mLuminescent == other.mLuminescent 
+               && mValue == other.mValue
+               && mRed == other.mRed
+               && mGreen == other.mGreen 
+               && mBlue == other.mBlue;
+}
+
+BigEndianBuffer& ShapesColor::SaveObject(BigEndianBuffer& buffer)
+{
+       unsigned char   flags = mLuminescent ? SELF_LUMINESCENT_COLOR : 0;
+       
+       buffer.WriteUChar(flags);
+       buffer.WriteUChar(mValue);
+       buffer.WriteUShort(mRed);
+       buffer.WriteUShort(mGreen);
+       buffer.WriteUShort(mBlue);
+       
+       return buffer;
+}
+
+BigEndianBuffer& ShapesColor::LoadObject(BigEndianBuffer& buffer)
+{
+       unsigned char   flags;
+
+       flags = buffer.ReadUChar();
+       mValue = buffer.ReadUChar();
+       mRed = buffer.ReadUShort();
+       mGreen = buffer.ReadUShort();
+       mBlue = buffer.ReadUShort();
+       
+       mLuminescent = flags & SELF_LUMINESCENT_COLOR;
+       
+       mGoodData = true;
+       return buffer;
+}
+
+ShapesColorTable::ShapesColorTable(bool verbose): ShapesElement(verbose)
+{
+
+}
+
+ShapesColorTable::ShapesColorTable(std::ifstream& ifs, wxString file_ext): ShapesElement(false)
+{
+       // FIXME better error checking and reporting
+       if (file_ext == wxString(wxT("act"))) {
+               // Photoshop binary color table file (Adobe Color Table, .act)
+               ifs.seekg(0, std::ios::end);
+               unsigned int    fileSize = ifs.tellg(),
+                                               colorCount = 0;
+               ifs.seekg(0, std::ios::beg);
+
+               if (fileSize >= 3*256+4) {
+                       // extra info found - get the color count from that
+                       BigEndianBuffer extraInfo(4);
+
+                       ifs.seekg(3 * 256);
+                       ifs.read((char *)extraInfo.Data(), 4);
+                       colorCount = (unsigned int)extraInfo.ReadShort();
+                       if (colorCount > 256)
+                               colorCount = 256;
+               } else if (fileSize == 3*256) {
+                       // no extra info - exactly 256 colors and no transparent color
+                       colorCount = 256;
+               } else {
+                       // we need at least 3*256 bytes
+                       wxLogError(wxT("This Adobe Color Table file has an invalid size: will not try to load it."));
+                       return;
+               }
+               ifs.seekg(0, std::ios::beg);
+               for (unsigned int value = 0; value < colorCount; value++) {
+                       unsigned char   rgb[3];
+                       ifs.read((char *)rgb, 3);
+                       ShapesColor             *newColor = new ShapesColor(rgb[0]<<8, rgb[1]<<8, rgb[2]<<8, value);
+                       mColors.push_back(newColor);
+               }
+       } else if (file_ext == wxString(wxT("gpl"))) {
+               // Gimp ASCII palette file
+               unsigned int    value = 0;
+
+               while (ifs.good() && value < 256) {
+                       char                    buffer[256] = "";
+                       unsigned int    red, green, blue;
+
+                       ifs.getline(buffer, 255);
+                       if (sscanf(buffer, "%u %u %u", &red, &green, &blue) == 3) {
+                               ShapesColor     *newColor = new ShapesColor(red<<8, green<<8, blue<<8, value);
+
+                               mColors.push_back(newColor);
+                               value++;
+                       }
+               }
+       }
+}
+
+ShapesColorTable::~ShapesColorTable(void)
+{
+       for (unsigned int i = 0; i < mColors.size(); i++)
+               delete mColors[i];
+}
+
+static bool compareShapesColorPtrs(ShapesColor* rhs, ShapesColor* lhs)
+{
+       return (*rhs == *lhs);
+}
+
+bool ShapesColorTable::operator==(const ShapesColorTable& other) const
+{
+       if (mColors.size() == other.mColors.size()) {
+               return std::equal(mColors.begin(), mColors.end(), other.mColors.begin(), compareShapesColorPtrs);
+       } else {
+               return false;
+       }
+}
+
+BigEndianBuffer& ShapesColorTable::SaveObject(BigEndianBuffer& stream)
+{
+       for (unsigned int i = 0; i < mColors.size(); i++) {
+               ShapesColor     *color = mColors[i];
+
+               color->SaveObject(stream);
+       }
+       return stream;
+}
+
+BigEndianBuffer& ShapesColorTable::SavePatch(BigEndianBuffer& buffer, int index)
+{
+       buffer.WriteLong(FOUR_CHARS_TO_INT('c','t','a','b'));
+       buffer.WriteLong(index);
+       return SaveObject(buffer);
+}
+
+BigEndianBuffer& ShapesColorTable::LoadObject(BigEndianBuffer& buffer, unsigned int offset, unsigned int color_count)
+{
+       buffer.Position(offset);
+
+       for (unsigned int i = 0; i < color_count; i++) {
+               ShapesColor     *color = new ShapesColor(IsVerbose());
+
+               color->LoadObject(buffer);
+               
+               if (!color->IsGood()) {
+                       wxLogError(wxT("[ShapesColorTable] Error loading color table"));
+                       mGoodData = false;
+                       return buffer;
+               }
+               mColors.push_back(color);
+       }
+       
+       mGoodData = true;
+       return buffer;
+}
+
+// export a color table to Gimp ASCII format
+int ShapesColorTable::SaveToGimp(wxString path) const
+{
+       std::ofstream   cts(path.fn_str(), std::ios::binary);
+
+       if (cts.good()) {
+               cts << "GIMP Palette\n";
+               cts << "Name: ShapeFusion exported palette\n";
+               cts << "#\n";
+               for (unsigned int i = 0; i < ColorCount(); i++) {
+                       ShapesColor     *color = GetColor(i);
+
+                       cts << (color->Red() >> 8) << ' ';
+                       cts << (color->Green() >> 8) << ' ';
+                       cts << (color->Blue() >> 8) << '\n';
+               }
+               cts.close();
+               return 0;
+       } else {
+               return -1;
+       }
+}
+
+// export a color table to Photoshop binary format
+// (MacOS file type is '8BCT', extension '.act', Adobe Color Table)
+int ShapesColorTable::SaveToPhotoshop(wxString path) const
+{
+       std::ofstream   cts(path.fn_str(), std::ios::binary);
+
+       if (cts.good()) {
+               BigEndianBuffer actData(3*256+4);
+               
+               actData.WriteZeroes(3*256+4);
+               actData.Position(0);
+               // write the RGB byte triplets for our colors
+               for (unsigned int i = 0; i < ColorCount(); i++) {
+                       ShapesColor *color = GetColor(i);
+                       
+                       actData.WriteChar(color->Red() >> 8);
+                       actData.WriteChar(color->Green() >> 8);
+                       actData.WriteChar(color->Blue() >> 8);
+               }
+               // write the extra info at the end:
+               // number of colors and index of the transparent color
+               actData.Position(3*256);
+               actData.WriteShort(ColorCount());
+               actData.WriteShort(0);
+               cts.write((char *)actData.Data(), actData.Size());
+               cts.close();
+               return 0;
+       } else {
+               return -1;
+       }
+}
+
+ShapesBitmap::ShapesBitmap(bool verbose): ShapesElement(verbose), mPixels(NULL)
+{
+}
+
+ShapesBitmap::ShapesBitmap(wxImage image, ShapesColorTable *colortable):
+       ShapesElement(false), mPixels(NULL)
+{
+       FromImage(image, colortable);
+}
+
+ShapesBitmap::~ShapesBitmap(void)
+{
+       if (mPixels)
+               delete mPixels;
+       mPixels = NULL;
+}
+
+bool ShapesBitmap::operator==(const ShapesBitmap& other) const
+{
+       if (mWidth == other.mWidth 
+           && mHeight == other.mHeight
+           && mBytesPerRow == other.mBytesPerRow
+           && mBitDepth == other.mBitDepth
+           && mColumnOrder == other.mColumnOrder
+           && mTransparent == other.mTransparent) {
+               return std::equal(mPixels, mPixels + (mWidth * mHeight), other.mPixels);
+       } else {
+               return false;
+       }
+}
+
+unsigned int ShapesBitmap::SizeInFile(void) const
+{
+       unsigned int size = 0;
+
+       // scanline pointer placeholder
+       if (mColumnOrder)
+               size += 4 * mWidth;
+       else
+               size += 4 * mHeight;
+       if (mBytesPerRow == -1) {
+               // compressed
+               size += mWidth * 4;
+               for (int x = 0; x < mWidth; x++) {
+                       unsigned char   *pp = mPixels + x;
+                       int                             p0 = -1,
+                               p1;
+                       
+                       for (int y = 0; y < mHeight; y++) {
+                               if (*pp != 0) {
+                                       p0 = y;
+                                       break;
+                               }
+                               pp += mWidth;
+                       }
+                       if (p0 == -1)
+                               continue;       // no opaque mPixels in this column
+                       p1 = p0;
+                       pp = mPixels + x + mWidth * (mHeight - 1);
+                       for (int y = mHeight - 1; y >= 0; y--) {
+                               if (*pp != 0) {
+                                       p1 = y;
+                                       break;
+                               }
+                               pp -= mWidth;
+                       }
+                       size += p1 - p0 + 1;
+               }
+       } else {
+               // plain
+               size += mWidth * mHeight;
+       }
+
+       return size;
+}
+
+BigEndianBuffer& ShapesBitmap::SaveObject(BigEndianBuffer& buffer)
+{
+       short   flags = 0;
+
+       if (mColumnOrder)
+               flags |= COLUMN_ORDER;
+       if (mTransparent)
+               flags |= TRANSPARENCY_ENABLED;
+       buffer.WriteShort(mWidth);
+       buffer.WriteShort(mHeight);
+       buffer.WriteShort(mBytesPerRow);
+       buffer.WriteShort(flags);
+       buffer.WriteShort(mBitDepth);
+       buffer.WriteZeroes(20 + 4 * (mColumnOrder ? mWidth : mHeight));
+       if (mBytesPerRow == -1) {
+               // compress
+               for (int x = 0; x < mWidth; x++) {
+                       unsigned char   *pp = mPixels + x;
+                       int                             p0 = -1, p1;
+                       
+                       for (int y = 0; y < mHeight; y++) {
+                               if (*pp != 0) {
+                                       p0 = y;
+                                       break;
+                               }
+                               pp += mWidth;
+                       }
+                       if (p0 == -1) {
+                               // no opaque pixels in this column
+                               buffer.WriteShort(0);
+                               buffer.WriteShort(0);
+                       } else {
+                               // found opaque pixels, go on
+                               p1 = p0;
+                               pp = mPixels + x + mWidth * (mHeight - 1);
+                               for (int y = mHeight - 1; y >= 0; y--) {
+                                       if (*pp != 0) {
+                                               p1 = y;
+                                               break;
+                                       }
+                                       pp -= mWidth;
+                               }
+                               buffer.WriteShort(p0);
+                               buffer.WriteShort(p1 + 1);
+                               pp = mPixels + x + p0 * mWidth;
+                               for (int y = p0; y <= p1; y++) {
+                                       buffer.WriteChar(*pp);
+                                       pp += mWidth;
+                               }
+                       }
+               }
+       } else {
+               if (mColumnOrder) {
+                       for (int x = 0; x < mWidth; x++) {
+                               for (int y = 0; y < mHeight; y++)
+                                       buffer.WriteChar(*(mPixels + x + y * mWidth));
+                       }
+               } else {
+                       buffer.WriteBlock(mWidth * mHeight, mPixels);
+               }
+       }
+       return buffer;
+}
+
+BigEndianBuffer& ShapesBitmap::SavePatch(BigEndianBuffer& buffer, int index)
+{
+       buffer.WriteLong(FOUR_CHARS_TO_INT('b', 'm', 'a', 'p'));
+       buffer.WriteLong(index);
+       buffer.WriteLong(SizeInFile() + SIZEOF_bitmap_definition);
+       return SaveObject(buffer);
+}
+
+BigEndianBuffer& ShapesBitmap::LoadObject(BigEndianBuffer& buffer, unsigned int offset)
+{
+       buffer.Position(offset);
+
+       mWidth = buffer.ReadShort();
+       mHeight = buffer.ReadShort();
+       mBytesPerRow = buffer.ReadShort();
+
+       if (mWidth < 0) {
+               wxLogError(wxT("[ShapesBitmap] Invalid bitmap width %d"), mWidth);
+               return buffer;
+       }
+       if (mHeight < 0) {
+               wxLogError(wxT("[ShapesBitmap] Invalid bitmap height %d"), mHeight);
+               return buffer;
+       }
+       if (mBytesPerRow < -1) {
+               wxLogError(wxT("[ShapesBitmap] Invalid bitmap bytes-per-row %d"), mBytesPerRow);
+               return buffer;
+       }
+
+       short   flags = buffer.ReadShort();
+
+       mColumnOrder = flags & COLUMN_ORDER;
+       mTransparent = flags & TRANSPARENCY_ENABLED;
+
+       mBitDepth = buffer.ReadShort();
+       if (mBitDepth != 8) {
+               wxLogError(wxT("[ShapesBitmap] Invalid bitmap depth %d"), mBitDepth);
+               return buffer;
+       }
+
+       if (IsVerbose()) {
+               wxLogDebug(wxT("[ShapesBitmap]         Width:           %d"), mWidth);
+               wxLogDebug(wxT("[ShapesBitmap]         Height:          %d"), mHeight);
+               wxLogDebug(wxT("[ShapesBitmap]         Bytes/Row:       %d"), mBytesPerRow);
+               wxLogDebug(wxT("[ShapesBitmap]         Flags:           %d"), flags);
+               wxLogDebug(wxT("[ShapesBitmap]         Bit Depth:       %d"), mBitDepth);
+       }
+
+       // skip unused fields and placeholders
+       unsigned int    numscanlines = (mColumnOrder ? mWidth : mHeight);
+
+       buffer.Position(buffer.Position() + 20 + numscanlines * 4);
+
+       // load pixel data
+       mPixels = new unsigned char[mWidth * mHeight];
+       if (mPixels == NULL) {
+               wxLogError(wxT("[ShapesBitmap] Could not allocate pixel buffer"));
+               return buffer;
+       }
+       if (mBytesPerRow > -1) {
+               // uncompressed bitmap
+               if (mColumnOrder) {
+                       // column order
+                       unsigned char   *dstp;
+                       
+                       for (int x = 0; x < mWidth; x++) {
+                               dstp = mPixels + x;
+                               for (int y = 0; y < mHeight; y++) {
+                                       *dstp = buffer.ReadUChar();
+                                       dstp += mWidth;
+                               }
+                       }
+               } else {
+                       // row order
+                       buffer.ReadBlock(mWidth * mHeight, mPixels);
+               }
+       } else {
+               // compressed bitmap (always column order)
+               memset(mPixels, 0, mWidth * mHeight);
+               for (int x = 0; x < mWidth; x++) {
+                       short                   p0, p1;
+                       unsigned char   *dstp;
+
+                       p0 = buffer.ReadShort();
+                       p1 = buffer.ReadShort();
+                       dstp = mPixels + x + p0 * mWidth;
+                       while (p0 != p1) {
+                               *dstp = buffer.ReadUChar();
+                               dstp += mWidth;
+                               p0++;
+                       }
+               }
+       }
+
+       mGoodData = true;
+       return buffer;
+}
+
+// export the ShapesBitmap to an indexed BMP file specified by path
+void ShapesBitmap::SaveToBMP(wxString path, ShapesColorTable *colorTable) const
+{
+       std::ofstream   stream(path.fn_str(), std::ios::binary);
+
+       if (stream.good()) {
+               unsigned int    colorCount = colorTable->ColorCount();
+               unsigned long   paddedWidth = (mWidth + 3) & 0xfffffffc;
+
+               // header
+               LittleEndianBuffer      headerBlock(54);
+
+               headerBlock.WriteChar('B');
+               headerBlock.WriteChar('M');
+               headerBlock.WriteULong(54 + 4*colorCount + paddedWidth * mHeight);      // file size
+               headerBlock.WriteULong(0);      // reserved
+               headerBlock.WriteULong(54 + 4*colorCount);      // raster data offset
+               headerBlock.WriteULong(40);     // info header size
+               headerBlock.WriteULong(mWidth);
+               headerBlock.WriteULong(mHeight);
+               headerBlock.WriteUShort(1);     // plane count
+               headerBlock.WriteUShort(8);     // bits per pixel
+               headerBlock.WriteULong(0);      // no compression
+               headerBlock.WriteULong(0);      // compressed size of image
+               headerBlock.WriteULong(0);
+               headerBlock.WriteULong(0);
+               headerBlock.WriteULong(colorCount);     // FIXME
+               headerBlock.WriteULong(0);      // FIXME
+               stream.write((const char *)headerBlock.Data(), headerBlock.Size());
+               
+               // palette
+               LittleEndianBuffer      paletteBlock(4*colorCount);
+
+               for (unsigned int i = 0; i < colorCount; i++) {
+                       ShapesColor     *color = colorTable->GetColor(i);
+
+                       paletteBlock.WriteUChar(color->Blue() >> 8);
+                       paletteBlock.WriteUChar(color->Green() >> 8);
+                       paletteBlock.WriteUChar(color->Red() >> 8);
+                       paletteBlock.WriteUChar(0);
+               }
+               stream.write((const char *)paletteBlock.Data(), paletteBlock.Size());
+
+               // 8-bit raster data
+               LittleEndianBuffer      rasterBlock(paddedWidth * mHeight);
+
+               for (int y = 0; y < mHeight; y++) {
+                       rasterBlock.WriteBlock(mWidth, mPixels + (mHeight - y - 1) * mWidth);
+                       rasterBlock.WriteZeroes(paddedWidth - mWidth);
+               }
+               stream.write((const char *)rasterBlock.Data(), rasterBlock.Size());
+
+               stream.close();
+       }
+}
+
+// export the ShapesBitmap mask to a 1-bit BMP file specified by path
+void ShapesBitmap::SaveMaskToBMP(wxString path) const
+{
+       std::ofstream   stream(path.fn_str(), std::ios::binary);
+
+       if (stream.good()) {
+               unsigned long   rowBytes = ((mWidth + 31) & 0xffffffe0) >> 3;
+
+               // header
+               LittleEndianBuffer      headerBlock(54);
+               
+               headerBlock.WriteChar('B');
+               headerBlock.WriteChar('M');
+               headerBlock.WriteULong(54 + 4*2 + rowBytes * mHeight);  // file size
+               headerBlock.WriteULong(0);      // reserved
+               headerBlock.WriteULong(54 + 4*2);       // raster data offset
+               headerBlock.WriteULong(40);     // info header size
+               headerBlock.WriteULong(mWidth);
+               headerBlock.WriteULong(mHeight);
+               headerBlock.WriteUShort(1);     // plane count
+               headerBlock.WriteUShort(1);     // bits per pixel
+               headerBlock.WriteULong(0);      // no compression
+               headerBlock.WriteULong(0);      // compressed size of image
+               headerBlock.WriteULong(0);
+               headerBlock.WriteULong(0);
+               headerBlock.WriteULong(2);
+               headerBlock.WriteULong(0);
+               stream.write((const char *)headerBlock.Data(), headerBlock.Size());
+
+               // black & white palette
+               LittleEndianBuffer      paletteBlock(4*2);
+
+               paletteBlock.WriteUChar(0);
+               paletteBlock.WriteUChar(0);
+               paletteBlock.WriteUChar(0);
+               paletteBlock.WriteUChar(0);
+               paletteBlock.WriteUChar(255);
+               paletteBlock.WriteUChar(255);
+               paletteBlock.WriteUChar(255);
+               paletteBlock.WriteUChar(0);
+               stream.write((const char *)paletteBlock.Data(), paletteBlock.Size());
+
+               // 1-bit raster data
+               LittleEndianBuffer      rasterBlock(rowBytes * mHeight);
+               
+               rasterBlock.WriteZeroes(rowBytes * mHeight);
+               for (unsigned int y = 0; (int)y < mHeight; y++) {
+                       unsigned char   *p = mPixels + y * mWidth,
+                                                       bit = 128,
+                                                       byte = 0;
+
+                       rasterBlock.Position((mHeight - y - 1) * rowBytes);
+                       for (unsigned int x = 0; (int)x < mWidth; x++) {
+                               if (*p++ != 0)
+                                       byte |= bit;
+                               bit >>= 1;
+                               if (bit == 0) {
+                                       bit = 128;
+                                       rasterBlock.WriteUChar(byte);
+                                       byte = 0;
+                               }
+                       }
+                       if (bit != 128)
+                               rasterBlock.WriteUChar(byte);
+               }
+               stream.write((const char *)rasterBlock.Data(), rasterBlock.Size());
+
+               stream.close();
+        }
+}
+
+void ShapesBitmap::ClipboardCopy(ShapesColorTable* colortable) const
+{
+       if (wxTheClipboard->Open()) {
+               // create an RGBA wxImage
+               wxImage image;
+               image.Create(mWidth, mHeight, false);
+
+               unsigned char* src = mPixels;
+               unsigned char* dst = image.GetData();
+               for (int x = 0; x < mWidth; ++x) {
+                       for (int y = 0; y < mHeight; ++y) {
+                               unsigned char c = *src++;
+                               ShapesColor* color = colortable->GetColor(c);
+                               *dst++ = color->Red();
+                               *dst++ = color->Green();
+                               *dst++ = color->Blue();
+                       }
+               }
+
+               wxTheClipboard->SetData(new wxBitmapDataObject(wxBitmap(image)));
+               wxTheClipboard->Close();
+       }
+}
+
+void ShapesBitmap::ClipboardPaste(ShapesColorTable* colortable)
+{
+       if (wxTheClipboard->Open()) {
+               wxBitmapDataObject clipboardData;
+               if (wxTheClipboard->GetData(clipboardData)) {
+                       FromImage(clipboardData.GetBitmap().ConvertToImage(), colortable);
+               }
+               wxTheClipboard->Close();
+       }
+}
+
+void ShapesBitmap::FromImage(wxImage image, ShapesColorTable* colortable)
+{
+       mWidth = image.GetWidth();
+       mHeight = image.GetHeight();
+       mBytesPerRow = image.GetWidth();
+       mBitDepth = 8;
+       mColumnOrder = true;
+       mTransparent = false;
+       
+       if (mPixels) {
+               delete mPixels;
+       }
+
+       unsigned char* srcpixels = image.GetData(), *src = srcpixels, *dst;
+
+       mPixels = new unsigned char[mWidth * mHeight];
+       if (mPixels == NULL) {
+               wxLogError(wxT("Could not allocate new %dx%d bitmap\n"), mWidth, mHeight);
+               return;
+       }
+       dst = mPixels;
+       // quantize from 8-bit RGB pixels to an indexed bitmap
+       for (int i = 0; i < mWidth * mHeight; i++) {
+               unsigned char   r = *src++, g = *src++, b = *src++,
+                                               best_value = 0;
+               float                   min_dist = 0;
+
+               for (unsigned int j = 0; j < colortable->ColorCount(); j++) {
+                       unsigned short  ct_r = colortable->GetColor(j)->Red(),
+                                                       ct_g = colortable->GetColor(j)->Green(),
+                                                       ct_b = colortable->GetColor(j)->Blue();
+                       float                   dist = ColourDistance(r/255.0, g/255.0, b/255.0,
+                                                                                                       ct_r/65535.0, ct_g/65535.0, ct_b/65535.0);
+
+                       if (dist < min_dist || j == 0) {
+                               min_dist = dist;
+                               best_value = colortable->GetColor(j)->Value();
+                       }
+               }
+               *dst++ = best_value;
+               if (best_value == 0)
+                       mTransparent = true;    // guess the user will want transparency
+       }
+}
+
+ShapesFrame::ShapesFrame(bool verbose): ShapesElement(verbose)
+{
+       // initialize values to something reasonable
+       mBitmapIndex = -1;
+       mXmirror = mYmirror = mKeypointObscured = false;
+       mMinimumLightIntensity = 0;
+       mOriginX = mOriginY = mKeyX = mKeyY = 0;
+       mScaleFactor = 0;
+       mWorldLeft = mWorldRight = mWorldTop = mWorldBottom = 0;
+       mWorldX0 = mWorldY0 = 0;
+}
+
+ShapesFrame::~ShapesFrame(void)
+{
+
+}
+
+bool ShapesFrame::operator==(const ShapesFrame& other) const
+{
+       return mXmirror == other.mXmirror
+               && mYmirror == other.mYmirror
+               && mKeypointObscured == other.mKeypointObscured
+               && mMinimumLightIntensity == other.mMinimumLightIntensity
+               && mBitmapIndex == other.mBitmapIndex
+               && mScaleFactor == other.mScaleFactor
+               && mOriginX == other.mOriginX
+               && mOriginY == other.mOriginY
+               && mKeyX == other.mKeyX
+               && mKeyY == other.mKeyY;
+}
+
+BigEndianBuffer& ShapesFrame::SaveObject(BigEndianBuffer& buffer)
+{
+       unsigned short  flags = 0;
+       float                   mli_integer, mli_fractional;
+       long                    min_light_intensity = 0;
+       
+       if (mXmirror)
+               flags |= X_MIRROR;
+       if (mYmirror)
+               flags |= Y_MIRROR;
+       if (mKeypointObscured)
+               flags |= KEYPOINT_OBSCURED;
+               
+       min_light_intensity = static_cast<long>(mMinimumLightIntensity * 65536.0 + 0.5); // convert float to 16.16 fixed
+
+       buffer.WriteUShort(flags);
+       buffer.WriteLong(min_light_intensity);
+       buffer.WriteShort(mBitmapIndex);
+       buffer.WriteShort(mOriginX);
+       buffer.WriteShort(mOriginY);
+       buffer.WriteShort(mKeyX);
+       buffer.WriteShort(mKeyY);
+       buffer.WriteShort(mWorldLeft);
+       buffer.WriteShort(mWorldRight);
+       buffer.WriteShort(mWorldTop);
+       buffer.WriteShort(mWorldBottom);
+       buffer.WriteShort(mWorldX0);
+       buffer.WriteShort(mWorldY0);
+       buffer.WriteZeroes(8);
+       
+       return buffer;
+}
+
+BigEndianBuffer& ShapesFrame::SavePatch(BigEndianBuffer& buffer, int index)
+{
+       buffer.WriteLong(FOUR_CHARS_TO_INT('l','l','s','h'));
+       buffer.WriteLong(index);
+       return SaveObject(buffer);
+}
+
+BigEndianBuffer& ShapesFrame::LoadObject(BigEndianBuffer& buffer, unsigned int offset)
+{
+       unsigned short  flags;
+       wxInt32                 mli_fixed;
+
+       buffer.Position(offset);
+
+       flags = buffer.ReadUShort();
+
+       mXmirror = flags & X_MIRROR;
+       mYmirror = flags & Y_MIRROR;
+       mKeypointObscured = flags & KEYPOINT_OBSCURED;
+       
+       mli_fixed = buffer.ReadLong();
+       
+       mMinimumLightIntensity = mli_fixed / 65536.0; // convert 16.16 fixed to float
+       
+       mBitmapIndex = buffer.ReadShort();
+       mOriginX = buffer.ReadShort();
+       mOriginY = buffer.ReadShort();
+       mKeyX = buffer.ReadShort();
+       mKeyY = buffer.ReadShort();
+       mWorldLeft = buffer.ReadShort();
+       mWorldRight = buffer.ReadShort();
+       mWorldTop = buffer.ReadShort();
+       mWorldBottom = buffer.ReadShort();
+       mWorldX0 = buffer.ReadShort();
+       mWorldY0 = buffer.ReadShort();
+       
+       if (IsVerbose()) {
+               wxLogDebug(wxT("[ShapesFrame]         Flags:                    %d"), flags);
+               wxLogDebug(wxT("[ShapesFrame]         Min. Light Intensity:     %f"), mMinimumLightIntensity);
+               wxLogDebug(wxT("[ShapesFrame]         Bitmap Index:     %d"), mBitmapIndex);
+               wxLogDebug(wxT("[ShapesFrame]         Origin (X):               %d"), mOriginX);
+               wxLogDebug(wxT("[ShapesFrame]         Origin (Y):               %d"), mOriginY);
+               wxLogDebug(wxT("[ShapesFrame]         Key (X):          %d"), mKeyX);
+               wxLogDebug(wxT("[ShapesFrame]         Key (Y):          %d"), mKeyY);
+               wxLogDebug(wxT("[ShapesFrame]         World (Left):     %d"), mWorldLeft);
+               wxLogDebug(wxT("[ShapesFrame]         World (Right):    %d"), mWorldRight);
+               wxLogDebug(wxT("[ShapesFrame]         World (Top):      %d"), mWorldTop);
+               wxLogDebug(wxT("[ShapesFrame]         World (Bottom):   %d"), mWorldBottom);
+               wxLogDebug(wxT("[ShapesFrame]         World (X0):               %d"), mWorldX0);
+               wxLogDebug(wxT("[ShapesFrame]         World (Y0):               %d"), mWorldY0);
+       }
+
+       mGoodData = true;
+       return buffer;
+}
+
+ShapesSequence::ShapesSequence(bool verbose): ShapesElement(verbose)
+{
+       // initialize values to something reasonable
+       mType = 0;
+       mFlags = 0;
+       mName = _T("new sequence");
+       mNumberOfViews = UNANIMATED;
+       mFramesPerView = 0;
+       mTicksPerFrame = 1;
+       mKeyFrame = 0;
+       mTransferMode = 0;
+       mTransferModePeriod = 1;
+       mFirstFrameSound = mKeyFrameSound = mLastFrameSound = -1;
+       mPixelsToWorld = 0;
+       mLoopFrame = 0;
+}
+
+ShapesSequence::~ShapesSequence(void)
+{
+
+}
+
+bool ShapesSequence::operator==(const ShapesSequence& other) const
+{
+       if (mType == other.mType 
+           && mFlags == other.mFlags 
+           && mName == other.mName
+           && mNumberOfViews == other.mNumberOfViews
+           && mFramesPerView == other.mFramesPerView
+           && mTicksPerFrame == other.mTicksPerFrame
+           && mKeyFrame == other.mKeyFrame
+           && mTransferMode == other.mTransferMode
+           && mTransferModePeriod == other.mTransferModePeriod
+           && mFirstFrameSound == other.mFirstFrameSound
+           && mKeyFrameSound == other.mKeyFrameSound
+           && mLastFrameSound == other.mLastFrameSound
+           && mPixelsToWorld == other.mPixelsToWorld
+           && mLoopFrame == other.mLoopFrame
+           && mFrameIndexes.size() == other.mFrameIndexes.size()) {
+               return std::equal(mFrameIndexes.begin(), mFrameIndexes.end(), other.mFrameIndexes.begin());
+       } else {
+               return false;
+       }
+}
+
+unsigned int ShapesSequence::SizeInFile() const
+{
+       return 2 * (FrameIndexCount() + 1);
+}
+
+BigEndianBuffer& ShapesSequence::SaveObject(BigEndianBuffer& buffer)
+{
+       char            name[33] = "";
+
+       // Ugh--wxGTK doesn't recognize wxFONTENCODING_MACROMAN, and
+       // if you try to create a new wsCSConv with it, successive
+       // attempts to create wxT("macintosh") fail. Windows, on the
+       // other hand, doesn't recognize wxT("macintosh"), although if
+       // you ask it if seqnameconv.IsOk() it returns true and only
+       // fails when you try to convert something. So, #ifdef to
+       // success
+#ifdef __WIN32__
+       wxCSConv seqnameconv(wxFONTENCODING_MACROMAN);
+#else
+       wxCSConv seqnameconv(wxT("macintosh"));
+#endif
+
+       buffer.WriteShort(mType);
+       buffer.WriteUShort(mFlags);
+       buffer.WriteChar(mName.Length());
+       strncpy(name, seqnameconv.cWC2MB(mName.wc_str(*wxConvCurrent)), 33);
+       buffer.WriteBlock(33, (unsigned char *)name);
+       buffer.WriteShort(mNumberOfViews);
+       buffer.WriteShort(mFramesPerView);
+       buffer.WriteShort(mTicksPerFrame);
+       buffer.WriteShort(mKeyFrame);
+       buffer.WriteShort(mTransferMode);
+       buffer.WriteShort(mTransferModePeriod);
+       buffer.WriteShort(mFirstFrameSound);
+       buffer.WriteShort(mKeyFrameSound);
+       buffer.WriteShort(mLastFrameSound);
+       buffer.WriteShort(mPixelsToWorld);
+       buffer.WriteShort(mLoopFrame);
+       buffer.WriteZeroes(28);
+       for (unsigned int i = 0; i < mFrameIndexes.size(); i++)
+               buffer.WriteShort(mFrameIndexes[i]);
+       buffer.WriteShort(0);
+       
+       return buffer;
+}
+
+BigEndianBuffer& ShapesSequence::SavePatch(BigEndianBuffer& buffer, int index)
+{
+       buffer.WriteLong(FOUR_CHARS_TO_INT('h','l','s','h'));
+       buffer.WriteLong(index);
+       buffer.WriteLong(SizeInFile() + SIZEOF_high_level_shape_definition);
+       return SaveObject(buffer);
+}
+
+BigEndianBuffer& ShapesSequence::LoadObject(BigEndianBuffer& buffer, long offset)
+{
+       buffer.Position(offset);
+       mType = buffer.ReadShort();
+       mFlags = buffer.ReadUShort();
+       
+       // the mName is a Mac Pascal string, not a C string (length,chars)
+       unsigned char   namelen = buffer.ReadUChar();
+
+       if (namelen > 32) {
+               wxLogError(wxT("[ShapesSequence] Sequence name too long (%d/32)"), namelen);
+               return buffer;
+       }
+
+       char            name[33];
+#ifdef __WIN32__
+       wxCSConv seqnameconv(wxFONTENCODING_MACROMAN);
+#else
+       wxCSConv seqnameconv(wxT("macintosh"));
+#endif
+
+       buffer.ReadBlock(33, (unsigned char *)name);
+       name[namelen] = 0;
+       mName = wxString(seqnameconv.cMB2WC(name), *wxConvCurrent, namelen);
+
+       mNumberOfViews = buffer.ReadShort();
+       mFramesPerView = buffer.ReadShort();
+       mTicksPerFrame = buffer.ReadShort();
+       mKeyFrame = buffer.ReadShort();
+       mTransferMode = buffer.ReadShort();
+       mTransferModePeriod = buffer.ReadShort();
+       mFirstFrameSound = buffer.ReadShort();
+       mKeyFrameSound = buffer.ReadShort();
+       mLastFrameSound = buffer.ReadShort();
+       mPixelsToWorld = buffer.ReadShort();
+       mLoopFrame = buffer.ReadShort();
+       buffer.Position(buffer.Position() + 28);
+
+       if (IsVerbose()) {
+               wxLogDebug(wxT("[ShapesSequence]         Type:                                  %d"), mType);
+               wxLogDebug(wxT("[ShapesSequence]         Flags:                                 %d"), mFlags);
+               wxLogDebug(wxT("[ShapesSequence]         Name:                                  %s"), mName.c_str());
+               wxLogDebug(wxT("[ShapesSequence]         Number of Views:               %d"), mNumberOfViews);
+               wxLogDebug(wxT("[ShapesSequence]         Frames/Views:                  %d"), mFramesPerView);
+               wxLogDebug(wxT("[ShapesSequence]         Ticks/Frame:                   %d"), mTicksPerFrame);
+               wxLogDebug(wxT("[ShapesSequence]         Key Frame:                             %d"), mKeyFrame);
+               wxLogDebug(wxT("[ShapesSequence]         Transfer Mode:                 %d"), mTransferMode);
+               wxLogDebug(wxT("[ShapesSequence]         Transfer Mode Period:  %d"), mTransferModePeriod);
+               wxLogDebug(wxT("[ShapesSequence]         First Frame Sound:             %d"), mFirstFrameSound);
+               wxLogDebug(wxT("[ShapesSequence]         Key Frame Sound:               %d"), mKeyFrameSound);
+               wxLogDebug(wxT("[ShapesSequence]         Last Frame Sound:              %d"), mLastFrameSound);
+               wxLogDebug(wxT("[ShapesSequence]         Pixels to World:               %d"), mPixelsToWorld);
+               wxLogDebug(wxT("[ShapesSequence]         Loop Frame:                    %d"), mLoopFrame);
+       }
+
+       if (mNumberOfViews < 0 || mFramesPerView < 0) {
+               wxLogError(wxT("[ShapesSequence] Invalid sequence type parameters: numberOfViews=%d, framesPerView=%d"),
+                                               mNumberOfViews, mFramesPerView);
+               return buffer;
+       }
+       // guess these shouldn't be < 0, but RED Shapes have a case with mKeyFrame=-1
+       if (mKeyFrame < -1 || mLoopFrame < -1) {
+               wxLogError(wxT("[ShapesSequence] Invalid key/loop frame values in sequence data: keyFrame=%d, loopFrame=%d"),
+                                               mKeyFrame, mLoopFrame);
+               return buffer;
+       }
+       if (mFirstFrameSound < -1 || mKeyFrameSound < -1 || mLastFrameSound < -1) {
+               wxLogError(wxT("[ShapesSequence] Invalid sound values in sequence data: firstFrameSound=%d, keyFrameSound=%d, lastFrameSound=%d"),
+                                               mFirstFrameSound, mKeyFrameSound, mLastFrameSound);
+               return buffer;
+       }
+
+       // load frame indexes
+       int     n = ActualNumberOfViews(mNumberOfViews) * mFramesPerView;
+
+       if (n > 0) {
+               for (int k = 0; k < n; k++)
+                       mFrameIndexes.push_back(buffer.ReadShort());
+       }
+
+       buffer.ReadShort();     // terminating index (usually 0 but can be garbage)
+
+       mGoodData = true;
+       return buffer;
+}
+
+// given a high_level_shape_definition.mNumberOfViews value,
+// return the real number of views
+int ActualNumberOfViews(int t)
+{
+       switch (t) {
+               case UNANIMATED:
+               case ANIMATED_1:
+                       return 1;
+               case ANIMATED_3TO4:
+               case ANIMATED_4:
+                       return 4;
+               case ANIMATED_3TO5:
+               case ANIMATED_5:
+                       return 5;
+               case ANIMATED_2TO8:
+               case ANIMATED_5TO8:
+               case ANIMATED_8:
+                       return 8;
+               default:
+                       wxLogError(wxT("[ShapesSequence] Unknown sequence type %d, don't know the number of views"), t);
+                       return t;
+       }
+       return -1;
+}
+
+ShapesChunk::ShapesChunk(bool verbose): ShapesElement(verbose)
+{
+       
+}
+
+ShapesChunk::~ShapesChunk(void)
+{
+       Clear();
+}
+
+void ShapesChunk::Clear(void)
+{
+       unsigned int i;
+
+       for (i = 0; i < mColorTables.size(); i++)
+               delete mColorTables[i];
+       for (i = 0; i < mSequences.size(); i++)
+               delete mSequences[i];
+       for (i = 0; i < mFrames.size(); i++)
+               delete mFrames[i];
+       for (i = 0; i < mBitmaps.size(); i++)
+               delete mBitmaps[i];
+
+       mColorTables.clear();
+       mSequences.clear();
+       mFrames.clear();
+       mBitmaps.clear();
+
+       mGoodData = false;
+}
+
+static bool compareColorTablePtrs(ShapesColorTable* lhs, ShapesColorTable* rhs) {
+       return *lhs == *rhs;
+}
+
+static bool compareSequencePtrs(ShapesSequence* lhs, ShapesSequence* rhs) {
+       return *lhs == *rhs;
+}
+
+static bool compareFramePtrs(ShapesFrame* lhs, ShapesFrame* rhs) {
+       return *lhs == *rhs;
+}
+
+static bool compareBitmapPtrs(ShapesBitmap* lhs, ShapesBitmap* rhs) {
+       return *lhs == *rhs;
+}
+
+bool ShapesChunk::operator==(const ShapesChunk& other) const
+{
+       if (mVersion == other.mVersion
+           && mType == other.mType
+           && mFlags == other.mFlags 
+           && mPixelsToWorld == other.mPixelsToWorld
+           && mColorTables.size() == other.mColorTables.size() 
+           && mSequences.size() == other.mSequences.size()
+           && mFrames.size() == other.mFrames.size()
+           && mBitmaps.size() == other.mBitmaps.size()) {
+               if (!std::equal(mColorTables.begin(), mColorTables.end(), other.mColorTables.begin(), compareColorTablePtrs))
+                       return false;
+               if (!std::equal(mSequences.begin(), mSequences.end(), other.mSequences.begin(), compareSequencePtrs))
+                       return false;
+               if (!std::equal(mFrames.begin(), mFrames.end(), other.mFrames.begin(), compareFramePtrs))
+                       return false;
+               return (std::equal(mBitmaps.begin(), mBitmaps.end(), other.mBitmaps.begin(), compareBitmapPtrs));
+       } else {
+               return false;
+       }
+}
+
+ShapesColorTable* ShapesChunk::GetColorTable(unsigned int index) const
+{
+       if (index < 0 || index > mColorTables.size())
+               return NULL;
+       return mColorTables[index];
+}
+
+ShapesBitmap* ShapesChunk::GetBitmap(unsigned int index) const
+{
+       if (index < 0 || index > mBitmaps.size())
+               return NULL;
+       return mBitmaps[index];
+}
+
+ShapesFrame* ShapesChunk::GetFrame(unsigned int index) const
+{
+       if (index < 0 || index > mFrames.size())
+               return NULL;
+       return mFrames[index];
+}
+
+ShapesSequence* ShapesChunk::GetSequence(unsigned int index) const
+{
+       if (index < 0 || index > mSequences.size())
+               return NULL;
+       return mSequences[index];
+}
+
+void ShapesChunk::InsertColorTable(ShapesColorTable *ct)
+{
+       mColorTables.push_back(ct);
+}
+
+void ShapesChunk::DeleteColorTable(unsigned int ct)
+{
+       mColorTables.erase(mColorTables.begin() + ct);
+}
+
+void ShapesChunk::InsertBitmap(ShapesBitmap *b)
+{
+       mBitmaps.push_back(b);
+}
+
+void ShapesChunk::DeleteBitmap(unsigned int b)
+{
+       if (b < mBitmaps.size()) {
+               // preserve existing frame-bitmap associations and associate
+               // a null bitmap to frames using the bitmap we're deleting
+               for (unsigned int i = 0; i < mFrames.size(); i++) {
+                       short   bitmap_index = mFrames[i]->BitmapIndex();
+
+                       if (bitmap_index == (int)b)
+                               mFrames[i]->SetBitmapIndex(-1);
+                       else if (bitmap_index > (int)b)
+                               mFrames[i]->SetBitmapIndex(bitmap_index - 1);
+               }
+               // now actually delete the bitmap
+               mBitmaps.erase(mBitmaps.begin() + b);
+       }
+}
+
+void ShapesChunk::InsertFrame(ShapesFrame *f)
+{
+       mFrames.push_back(f);
+}
+
+void ShapesChunk::DeleteFrame(unsigned int f)
+{
+       if (f < mFrames.size()) {
+               // preserve existing sequence-frame associations and
+               // unreference this frame index from any sequence using it
+               for (unsigned int i = 0; i < mSequences.size(); i++) {
+                       for (unsigned int j = 0; j < mSequences[i]->FrameIndexCount(); j++) {
+                               short frame_index = mSequences[i]->GetFrameIndex(j);
+
+                               if (frame_index == (int)f)
+                                       mSequences[i]->SetFrameIndex(j, -1);
+                               else if (frame_index > (int)f)
+                                       mSequences[i]->SetFrameIndex(j, frame_index - 1);
+                       }
+               }
+               // now actually delete the frame
+               mFrames.erase(mFrames.begin() + f);
+       }
+}
+
+void ShapesChunk::InsertSequence(ShapesSequence *s)
+{
+       mSequences.push_back(s);
+}
+
+void ShapesChunk::DeleteSequence(unsigned int s)
+{
+       if (s < mSequences.size())
+               mSequences.erase(mSequences.begin() + s);
+}
+
+void ShapesChunk::ClipboardCopy()
+{
+       if (wxTheClipboard->Open()) {
+               size_t size = SizeInFile();
+               unsigned char* data = new unsigned char[size];
+               BigEndianBuffer buffer(data, size);
+               
+               SaveObject(buffer);
+               
+               wxCustomDataObject* dataObject = new wxCustomDataObject(wxDataFormat(wxT("application/vnd.shapefusion.shapeschunk")));
+               dataObject->TakeData(size, data);
+               
+               wxTheClipboard->SetData(dataObject);
+
+               wxTheClipboard->Close();
+       }
+}
+
+void ShapesChunk::ClipboardPaste()
+{
+       if (wxTheClipboard->Open()) {
+               wxCustomDataObject dataObject(wxDataFormat(wxT("application/vnd.shapefusion.shapeschunk")));
+               if (wxTheClipboard->GetData(dataObject)) {
+                       BigEndianBuffer buffer(reinterpret_cast<unsigned char *>(dataObject.GetData()), dataObject.GetSize());
+
+                       Clear();
+
+                       LoadObject(buffer);
+               }
+
+               wxTheClipboard->Close();
+       }
+}
+
+unsigned int ShapesChunk::SizeInFile(void) const
+{
+       unsigned int    bitmap_count = BitmapCount(),
+                                       frame_count = FrameCount(),
+                                       sequence_count = SequenceCount(),
+                                       color_table_count = ColorTableCount(),
+                                       size;
+       
+       // size of our definition
+       size = SIZEOF_collection_definition;
+       // add contribute of sequence offset table
+       size += 4 * sequence_count;
+       // add contribute of bitmap offset table
+       size += 4 * bitmap_count;
+       // add contribute of frame offset table
+       size += 4 * frame_count;
+       // add contribute of color tables
+       if (color_table_count > 0)
+               size += SIZEOF_rgb_color_value * color_table_count * GetColorTable(0)->ColorCount();
+       // add contribute of bitmaps
+       size += SIZEOF_bitmap_definition * bitmap_count;
+       for (unsigned int i = 0; i < bitmap_count; i++) {
+               ShapesBitmap    *bitmap = mBitmaps[i];
+
+               size += bitmap->SizeInFile();
+       }               
+       // add contribute of frame definitions
+       size += SIZEOF_low_level_shape_definition * frame_count;
+       // add contribute of sequence definitions (and following frame indexes)
+       size += SIZEOF_high_level_shape_definition * sequence_count;
+       for (unsigned int i = 0 ; i < sequence_count ; i++) {
+               ShapesSequence  *seq = mSequences[i];
+
+               size += seq->SizeInFile();
+       }
+
+       return size;
+}
+
+unsigned int ShapesChunk::SizeInPatch(const ShapesChunk* other) const {
+       unsigned int size = 4; // 'cldf'
+
+       size += SIZEOF_collection_definition;
+       
+       for (unsigned int i = 0; i < mColorTables.size(); ++i) {
+               if (other == NULL || i >= other->mColorTables.size() || *mColorTables[i] != *other->mColorTables[i]) {
+                       size += SIZEOF_rgb_color_value * mColorTables[i]->ColorCount() + 8;
+               }
+       }
+
+       for (unsigned int i = 0; i < mSequences.size(); ++i) {
+               if (other == NULL || i >= other->mSequences.size() || *mSequences[i] != *other->mSequences[i]) {
+                       size += SIZEOF_high_level_shape_definition + mSequences[i]->SizeInPatch();
+               }
+       }
+
+
+       for (unsigned int i = 0; i < mFrames.size(); ++i) {
+               if (other == NULL || i >= other->mFrames.size() || *mFrames[i] != *other->mFrames[i]) {
+                       size += SIZEOF_low_level_shape_definition + 8;
+               }
+       }
+       
+       for (unsigned int i = 0; i < mBitmaps.size(); ++i) {
+               if (other == NULL || i >= other->mBitmaps.size() || *mBitmaps[i] != *other->mBitmaps[i]) {
+                       size += SIZEOF_bitmap_definition + mBitmaps[i]->SizeInPatch();
+               }
+       }
+
+       return size;
+}
+
+BigEndianBuffer& ShapesChunk::SaveObject(BigEndianBuffer& buffer)
+{
+       unsigned int    bitmap_count = BitmapCount(),
+                                       frame_count = FrameCount(),
+                                       sequence_count = SequenceCount(),
+                                       i;
+       long                    sequence_table_offset,
+                                       sequence_offsets[sequence_count],
+                                       frame_table_offset,
+                                       frame_offsets[frame_count],
+                                       bitmap_table_offset,
+                                       bitmap_offsets[bitmap_count];
+                               
+       // skip the collection definition, we'll fill it at the end
+       buffer.Position(SIZEOF_collection_definition);
+       // write color tables
+       for (i = 0; i < ColorTableCount(); i++)
+               mColorTables[i]->SaveObject(buffer);
+       
+       // write sequences
+       sequence_table_offset = buffer.Position();
+       if (sequence_count > 0) {
+               buffer.Position(buffer.Position() + sequence_count * 4);
+               
+               for (i = 0; i < sequence_count; i++) {
+                       sequence_offsets[i] = buffer.Position();
+                       
+                       mSequences[i]->SaveObject(buffer);
+               }
+       }
+       // write frames
+       frame_table_offset = buffer.Position();
+       buffer.Position(buffer.Position() + frame_count * 4);
+       for (i = 0; i < frame_count; i++) {
+               frame_offsets[i] = buffer.Position();
+               
+               mFrames[i]->SaveObject(buffer);
+       }
+       
+       // write bitmaps
+       bitmap_table_offset = buffer.Position();
+       buffer.Position(buffer.Position() + bitmap_count * 4);
+       for (i = 0; i < bitmap_count; i++) {
+               bitmap_offsets[i] = buffer.Position();
+               
+               mBitmaps[i]->SaveObject(buffer);
+       }
+       
+       // go back and write the collection definition (with correct offsets)
+       buffer.Position(0);
+       buffer.WriteShort(mVersion);
+       buffer.WriteShort(mType);
+       buffer.WriteUShort(mFlags);
+       buffer.WriteShort(GetColorTable(0)->ColorCount());
+       buffer.WriteShort(ColorTableCount());
+       buffer.WriteLong(SIZEOF_collection_definition);
+       buffer.WriteShort(sequence_count);
+       buffer.WriteLong(sequence_table_offset);
+       buffer.WriteShort(frame_count);
+       buffer.WriteLong(frame_table_offset);
+       buffer.WriteShort(bitmap_count);
+       buffer.WriteLong(bitmap_table_offset);
+       buffer.WriteShort(mPixelsToWorld);
+       buffer.WriteLong(SizeInFile());
+       buffer.WriteZeroes(506);
+       
+       // fill offset tables
+       if (bitmap_count > 0) {
+               buffer.Position(bitmap_table_offset);
+               for (i = 0; i < bitmap_count; i++)
+                       buffer.WriteLong(bitmap_offsets[i]);
+       }
+       if (frame_count > 0) {
+               buffer.Position(frame_table_offset);
+               for (i = 0; i < frame_count; i++)
+                       buffer.WriteLong(frame_offsets[i]);
+       }
+       if (sequence_count > 0) {
+               buffer.Position(sequence_table_offset);
+               for (i = 0; i < sequence_count; i++)
+                       buffer.WriteLong(sequence_offsets[i]);
+       }
+       
+       return buffer;
+}
+
+BigEndianBuffer& ShapesChunk::SavePatch(BigEndianBuffer& buffer, const ShapesChunk* other)
+{
+       buffer.WriteLong(FOUR_CHARS_TO_INT('c','l','d','f'));
+
+       // collection header
+       buffer.WriteShort(mVersion);
+       buffer.WriteShort(mType);
+       buffer.WriteUShort(mFlags);
+       buffer.WriteShort(GetColorTable(0)->ColorCount());
+       buffer.WriteShort(ColorTableCount());
+       buffer.WriteLong(SIZEOF_collection_definition);
+       buffer.WriteShort(SequenceCount());
+       buffer.WriteLong(0);
+       buffer.WriteShort(FrameCount());
+       buffer.WriteLong(0);
+       buffer.WriteShort(BitmapCount());
+       buffer.WriteLong(0);
+       buffer.WriteShort(mPixelsToWorld);
+       buffer.WriteLong(0);
+       buffer.WriteZeroes(506);
+
+       for (unsigned int i = 0; i < mColorTables.size(); ++i) {
+               if (other == NULL || i >= other->mColorTables.size() || *mColorTables[i] != *other->mColorTables[i]) {
+                       mColorTables[i]->SavePatch(buffer, i);
+               }
+       }
+
+       for (unsigned int i = 0; i < mSequences.size(); ++i) {
+               if (other == NULL || i >= other->mSequences.size() || *mSequences[i] != *other->mSequences[i]) {
+                       mSequences[i]->SavePatch(buffer, i);
+               }
+       }
+
+       for (unsigned int i = 0; i < mFrames.size(); ++i) {
+               if (other == NULL || i >= other->mFrames.size() || *mFrames[i] != *other->mFrames[i]) {
+                       mFrames[i]->SavePatch(buffer, i);
+               }
+       }
+
+       for (unsigned int i = 0; i < mBitmaps.size(); ++i) {
+               if (other == NULL || i >= other->mBitmaps.size() || *mBitmaps[i] != *other->mBitmaps[i]) {
+                       mBitmaps[i]->SavePatch(buffer, i);
+               }
+       }
+
+       return buffer;
+}
+
+BigEndianBuffer& ShapesChunk::LoadObject(BigEndianBuffer& buffer)
+{
+       short   color_count,
+                       clut_count,
+                       bitmap_count,
+                       high_level_shape_count,
+                       low_level_shape_count,
+                       i;
+       long    color_table_offset,
+                       high_level_shape_offset_table_offset,
+                       low_level_shape_offset_table_offset,
+                       bitmap_offset_table_offset,
+                       oldpos,
+                       offset,
+                       size;
+
+       mVersion = buffer.ReadShort();
+       mType = buffer.ReadShort();
+       mFlags = buffer.ReadUShort();
+       color_count = buffer.ReadShort();
+       clut_count = buffer.ReadShort();
+       color_table_offset = buffer.ReadLong();
+       high_level_shape_count = buffer.ReadShort();
+       high_level_shape_offset_table_offset = buffer.ReadLong();
+       low_level_shape_count = buffer.ReadShort();
+       low_level_shape_offset_table_offset = buffer.ReadLong();
+       bitmap_count = buffer.ReadShort();
+       bitmap_offset_table_offset = buffer.ReadLong();
+       mPixelsToWorld = buffer.ReadShort();
+       size = buffer.ReadLong();
+
+       // validate values
+       if (mVersion != COLLECTION_VERSION) {
+               wxLogError(wxT("[ShapesChunk] Unknown collection version %d"), mVersion);
+               return buffer;
+       }
+
+       if ((unsigned long)size != buffer.Size()) {
+               wxLogError(wxT("[ShapesChunk] Chunk size mismatch (%ld/%d): this may not be a Marathon shapes file"), size, buffer.Size());
+               return buffer;
+       }
+       if (color_table_offset < SIZEOF_collection_definition
+               || color_table_offset >= size
+               || high_level_shape_offset_table_offset < SIZEOF_collection_definition
+               || high_level_shape_offset_table_offset >= size
+               || low_level_shape_offset_table_offset < SIZEOF_collection_definition
+               || low_level_shape_offset_table_offset >= size
+               || bitmap_offset_table_offset < SIZEOF_collection_definition
+               || bitmap_offset_table_offset >= size) {
+               wxLogError(wxT("[ShapesChunk] Invalid offsets in collection definition: this may not be a Marathon shapes file"));
+               return buffer;
+       }
+       if (color_count < 0 || clut_count < 0 || high_level_shape_count < 0 || low_level_shape_count < 0 || bitmap_count < 0) {
+               wxLogError(wxT("[ShapesChunk] Invalid object counts in collection definition: this may not be a Marathon shapes file"));
+               return buffer;
+       }
+
+       if (IsVerbose()) {
+               wxLogDebug(wxT("[ShapesChunk]         Version: %d"), mVersion);
+               wxLogDebug(wxT("[ShapesChunk]         Type:    %d"), mType);
+               wxLogDebug(wxT("[ShapesChunk]         Flags:   %d"), mFlags);
+               wxLogDebug(wxT("[ShapesChunk]         %d color tables, %d colors per table"), clut_count, color_count);
+               wxLogDebug(wxT("[ShapesChunk]         %d sequences"), high_level_shape_count);
+               wxLogDebug(wxT("[ShapesChunk]         %d frames"), low_level_shape_count);
+               wxLogDebug(wxT("[ShapesChunk]         %d bitmaps"), bitmap_count);
+       }
+
+       // load color tables
+       for (i = 0; i < clut_count; i++) {
+               ShapesColorTable        *color_table = new ShapesColorTable(IsVerbose());
+
+               if (IsVerbose())
+                       wxLogDebug(wxT("[ShapesChunk] Loading colortable %d/%d"), i+1, clut_count);
+
+               oldpos = buffer.Position();
+
+               color_table->LoadObject(buffer, color_table_offset + i * color_count * SIZEOF_rgb_color_value, color_count);
+
+               buffer.Position(oldpos);
+               
+               // we stop if an error occured
+               if (!color_table->IsGood()) {
+                       wxLogError(wxT("[ShapesChunk] Error loading color table %d... Dropped"), i);
+                       return buffer;
+               }
+               
+               mColorTables.push_back(color_table);
+       }
+       
+       // load bitmaps, decoding compressed ones
+       buffer.Position(bitmap_offset_table_offset);
+       for (i = 0; i < bitmap_count; i++) {
+               offset = buffer.ReadLong();
+               if (offset < SIZEOF_collection_definition || offset >= size) {
+                       wxLogError(wxT("[ShapesChunk] Invalid bitmap offset: this may not be a Marathon shapes file"));
+                       return buffer;
+               }
+               
+               ShapesBitmap    *bitmap = new ShapesBitmap(IsVerbose());
+               if (IsVerbose())
+                       wxLogDebug(wxT("[ShapesChunk] Loading bitmap %d/%d"), i+1, bitmap_count);
+                       
+               oldpos = buffer.Position();
+               
+               bitmap->LoadObject(buffer, offset);
+               
+               buffer.Position(oldpos);
+               
+               // we stop if an error occured
+               if (!bitmap->IsGood()) {
+                       wxLogError(wxT("[ShapesDocument] Error loading bitmap %d... Dropped"), i);
+                       return buffer;
+               }
+               
+               mBitmaps.push_back(bitmap);
+       }
+
+       // load sequences
+       buffer.Position(high_level_shape_offset_table_offset);
+       for (i = 0; i < high_level_shape_count; i++) {
+               offset = buffer.ReadLong();
+               if (offset < SIZEOF_collection_definition || offset >= size) {
+                       wxLogError(wxT("[ShapesChunk] Invalid sequence offset: this may not be a Marathon shapes file"));
+                       return buffer;
+               }
+               
+               ShapesSequence  *sequence = new ShapesSequence(IsVerbose());
+               if (IsVerbose())
+                       wxLogDebug(wxT("[ShapesChunk] Loading sequence %d/%d"), i+1, high_level_shape_count);
+               
+               oldpos = buffer.Position();
+               
+               sequence->LoadObject(buffer, offset);
+               
+               buffer.Position(oldpos);
+               
+               // we stop if an error occured
+               if (!sequence->IsGood()) {
+                       wxLogError(wxT("[ShapesDocument] Error loading sequence... Dropped"));
+                       return buffer;
+               }
+               
+               mSequences.push_back(sequence);
+       }
+       
+       // load frames
+       buffer.Position(low_level_shape_offset_table_offset);
+       for (i = 0; i < low_level_shape_count; i++) {
+               offset = buffer.ReadLong();
+               if (offset < SIZEOF_collection_definition || offset >= size) {
+                       wxLogError(wxT("[ShapesChunk] Invalid frame offset: this may not be a Marathon shapes file"));
+                       return buffer;
+               }
+               
+               ShapesFrame     *frame = new ShapesFrame(IsVerbose());
+               if (IsVerbose())
+                       wxLogDebug(wxT("[ShapesChunk] Loading frame %d/%d"), i+1, low_level_shape_count);
+
+               oldpos = buffer.Position();
+               
+               frame->LoadObject(buffer, offset);
+               
+               buffer.Position(oldpos);
+               // calculate scale factor from world_* fields and associated bitmap dimensions.
+               // If this fails, default to collection global scale factor
+               if (frame->BitmapIndex() >= 0 && frame->BitmapIndex() < (int)mBitmaps.size()) {
+                       int     bitmapWidth = mBitmaps[frame->BitmapIndex()]->Width();
+
+                       if (bitmapWidth > 0)
+                               frame->SetScaleFactor((frame->WorldRight() - frame->WorldLeft()) / bitmapWidth);
+                       else
+                               frame->SetScaleFactor(mPixelsToWorld);
+               } else {
+                       frame->SetScaleFactor(mPixelsToWorld);
+               }
+               
+               // store if correct
+               if (!frame->IsGood()) {
+                       wxLogError(wxT("[ShapesDocument] Error loading frame %d... Dropped"), i);
+                       return buffer;
+               }
+               
+               mFrames.push_back(frame);
+       }
+       
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& ShapesChunk::LoadPatch(BigEndianBuffer& buffer)
+{
+       mGoodData = true;
+
+       long tag = buffer.ReadLong();
+       short color_count = 0;
+
+       while (tag != FOUR_CHARS_TO_INT('e','n','d','c')) {
+               switch (tag) {
+               case FOUR_CHARS_TO_INT('c','l','d','f'): {
+                       mVersion = buffer.ReadShort();
+                       if (mVersion != COLLECTION_VERSION) {
+                               wxLogError(wxT("[ShapesChunk] Unknown 'cldf' version %d in patch"), mVersion);
+                               mGoodData = false;
+                               return buffer;
+                       }
+
+                       mType = buffer.ReadShort();
+                       mFlags = buffer.ReadUShort();
+                       color_count = buffer.ReadShort();
+                       mColorTables.resize(buffer.ReadShort());
+                       buffer.ReadLong(); // color table offset
+                       mSequences.resize(buffer.ReadShort());
+                       buffer.ReadLong(); // high level shape offset
+                       mFrames.resize(buffer.ReadShort());
+                       buffer.ReadLong(); // low level shape offset
+                       mBitmaps.resize(buffer.ReadShort());
+                       buffer.ReadLong(); // bitmap offsets
+                       mPixelsToWorld = buffer.ReadShort();
+                       buffer.ReadLong(); // size
+                       buffer.Position(buffer.Position() + 506);
+                       break;
+               }
+               case FOUR_CHARS_TO_INT('c','t','a','b'): {
+                       long index = buffer.ReadLong();
+                       if (index < mColorTables.size()) {
+                               ShapesColorTable* c = new ShapesColorTable(IsVerbose());
+                               c->LoadObject(buffer, buffer.Position(), color_count);
+                               if (c->IsGood()) {
+                                       delete mColorTables[index];
+                                       mColorTables[index] = c;
+                               } else {
+                                       mGoodData = false;
+                                       return buffer;
+                               }
+                       } else {
+                               wxLogError(wxT("[ShapesChunk] Invliad 'ctab' index"));
+                               mGoodData = false;
+                               return buffer;
+                       }
+                       break;
+               }
+               case FOUR_CHARS_TO_INT('h','l','s','h'): {
+                       long index = buffer.ReadLong();
+                       long chunk_size = buffer.ReadLong();
+                       long position = buffer.Position();
+                       if (index < mSequences.size()) {
+                               ShapesSequence* ss = new ShapesSequence(IsVerbose());
+                               ss->LoadObject(buffer, position);
+                               buffer.Position(position + chunk_size);
+                               if (ss->IsGood()) {
+                                       delete mSequences[index];
+                                       mSequences[index] = ss;
+                               } else {
+                                       mGoodData = false;
+                                       return buffer;
+                               }
+                       } else {
+                               wxLogError(wxT("[ShapesChunk] Invalid 'hlsh' index"));
+                               mGoodData = false;
+                               return buffer;
+                       }
+                       break;
+               }
+               case FOUR_CHARS_TO_INT('l','l','s','h'): {
+                       long index = buffer.ReadLong();
+                       if (index < mFrames.size()) {
+                               ShapesFrame* sf = new ShapesFrame(IsVerbose());
+                               sf->LoadObject(buffer, buffer.Position());
+                               if (sf->IsGood()) {
+                                       delete mFrames[index];
+                                       mFrames[index] = sf;
+                               } else {
+                                       mGoodData = false;
+                                       return buffer;
+                               }
+                       } else {
+                               wxLogError(wxT("[ShapesChunk] Invalid 'llsh' index"));
+                               mGoodData = false;
+                               return buffer;
+                       }
+                       break;
+               }
+               case FOUR_CHARS_TO_INT('b','m','a','p'): {
+                       long index = buffer.ReadLong();
+                       long size = buffer.ReadLong();
+                       long position = buffer.Position();
+
+                       if (index < mBitmaps.size()) {
+                               ShapesBitmap* b = new ShapesBitmap(IsVerbose());
+                               b->LoadObject(buffer, position);
+                               buffer.Position(position + size);
+                               if (b->IsGood()) {
+                                       delete mBitmaps[index];
+                                       mBitmaps[index] = b;
+                               } else {
+                                       mGoodData = false;
+                                       return buffer;
+                               }
+                       } else {
+                               wxLogError(wxT("[ShapesChunk] Invalid 'bmap' index"));
+                               mGoodData = false;
+                               return buffer;
+                       }
+                       break;
+               }
+               }
+
+               tag = buffer.ReadLong();
+       }
+
+       return buffer;
+}
+
+ShapesCollection::ShapesCollection(bool verbose): ShapesElement(verbose)
+{
+       mChunks[0] = NULL;
+       mChunks[1] = NULL;
+}
+
+ShapesCollection::~ShapesCollection(void)
+{
+       if (mChunks[0])
+               delete mChunks[0];
+       if (mChunks[1])
+               delete mChunks[1];
+}
+
+bool ShapesCollection::Defined(unsigned int chunk) const
+{
+       if (chunk > COLL_VERSION_TRUECOLOR)
+               return false;
+       return mChunks[chunk] != NULL;
+}
+
+int ShapesCollection::Version(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->Version() : 0);
+}
+
+int ShapesCollection::Type(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->Type() : 0);
+}
+
+int ShapesCollection::Flags(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->Flags() : 0);
+}
+
+int ShapesCollection::ScaleFactor(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->ScaleFactor() : 0);
+}
+
+int ShapesCollection::ColorTableCount(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->ColorTableCount() : 0);
+}
+
+int ShapesCollection::BitmapCount(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->BitmapCount() : 0);
+}
+
+int ShapesCollection::FrameCount(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->FrameCount() : 0);
+}
+
+int ShapesCollection::SequenceCount(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->SequenceCount() : 0);
+}
+
+ShapesColorTable* ShapesCollection::GetColorTable(unsigned int chunk, unsigned int index) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->GetColorTable(index) : NULL);
+}
+
+ShapesBitmap* ShapesCollection::GetBitmap(unsigned int chunk, unsigned int index) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->GetBitmap(index) : NULL);
+}
+
+ShapesFrame* ShapesCollection::GetFrame(unsigned int chunk, unsigned int index) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->GetFrame(index) : NULL);
+}
+
+ShapesSequence* ShapesCollection::GetSequence(unsigned int chunk, unsigned int index) const
+{
+       return (Defined(chunk) ? mChunks[chunk]->GetSequence(index) : NULL);
+}
+
+ShapesChunk* ShapesCollection::GetChunk(unsigned int chunk) const
+{
+       return (Defined(chunk) ? mChunks[chunk] : NULL);
+}
+
+void ShapesCollection::InsertColorTable(ShapesColorTable *ct, unsigned int chunk)
+{
+       if (Defined(chunk))
+               mChunks[chunk]->InsertColorTable(ct);
+}
+
+void ShapesCollection::DeleteColorTable(unsigned int chunk, unsigned int ct)
+{
+       if (Defined(chunk))
+               mChunks[chunk]->DeleteColorTable(ct);
+}
+
+void ShapesCollection::InsertBitmap(ShapesBitmap *b, unsigned int chunk)
+{
+       if (Defined(chunk))
+               mChunks[chunk]->InsertBitmap(b);
+}
+
+void ShapesCollection::DeleteBitmap(unsigned int chunk, unsigned int b)
+{
+       if (Defined(chunk))
+               mChunks[chunk]->DeleteBitmap(b);
+}
+
+void ShapesCollection::InsertFrame(ShapesFrame *f, unsigned int chunk)
+{
+       if (Defined(chunk))
+               mChunks[chunk]->InsertFrame(f);
+}
+
+void ShapesCollection::DeleteFrame(unsigned int chunk, unsigned int f)
+{
+       if (Defined(chunk))
+               mChunks[chunk]->DeleteFrame(f);
+}
+
+void ShapesCollection::InsertSequence(ShapesSequence *s, unsigned int chunk)
+{
+       if (Defined(chunk))
+               mChunks[chunk]->InsertSequence(s);
+}
+
+void ShapesCollection::DeleteSequence(unsigned int chunk, unsigned int s)
+{
+       if (Defined(chunk))
+               mChunks[chunk]->DeleteSequence(s);
+}
+
+// calculate how much space a collection is going
+// to take when encoded to its on-file format.
+unsigned int ShapesCollection::SizeInFile(unsigned int chunk) const
+{
+       if (!Defined(chunk))
+               return 0;
+
+       unsigned int    size = 0;
+
+       size += mChunks[chunk]->SizeInFile();
+       return size;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD ostream& ShapesCollection::SaveObject(wxSTD ostream& stream)
+#else
+wxOutputStream& ShapesCollection::SaveObject(wxOutputStream& stream)
+#endif
+{
+       for (unsigned int i = 0; i < 2 ; i++) {
+               if (Defined(i)) {
+                       BigEndianBuffer chunkbuffer(mChunks[i]->SizeInFile());
+
+                       mChunks[i]->SaveObject(chunkbuffer);
+#if wxUSE_STD_IOSTREAM
+                       stream.write((char *)chunkbuffer.Data(), chunkbuffer.Size());
+#else
+                       stream.Write((char *)chunkbuffer.Data(), chunkbuffer.Size());
+#endif
+               }
+       }
+       return stream;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD ostream& ShapesCollection::SavePatch(wxSTD ostream& stream, const ShapesCollection& other, int index, int depth)
+#else
+wxOutputStream& ShapesCollection::SavePatch(wxOutputStream& stream, const ShapesCollection& other, int index, int depth)
+#endif
+{
+       bool diff = Defined(depth) && (other.mChunks[depth] == NULL || *mChunks[depth] != *other.mChunks[depth]);
+       unsigned int size = 12;
+       if (diff) {
+               size += mChunks[depth]->SizeInPatch(other.mChunks[depth]);
+       }
+
+       BigEndianBuffer chunkbuffer(size);
+       chunkbuffer.WriteLong(index);
+       chunkbuffer.WriteLong(depth ? 16 : 8);
+       if (diff) {
+               mChunks[depth]->SavePatch(chunkbuffer, other.mChunks[depth]);
+       }
+       chunkbuffer.WriteLong(FOUR_CHARS_TO_INT('e','n','d','c'));
+#if wxUSE_STD_IOSTREAM
+       stream.write((char *)chunkbuffer.Data(), chunkbuffer.Size());
+#else
+       stream.Write((char *)chunkbuffer.Data(), chunkbuffer.Size());
+#endif
+
+       return stream;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD istream& ShapesCollection::LoadObject(wxSTD istream& stream)
+#else
+wxInputStream& ShapesCollection::LoadObject(wxInputStream& stream)
+#endif
+{
+       BigEndianBuffer coll_header(SIZEOF_collection_header);
+
+#if wxUSE_STD_IOSTREAM
+       stream.read((char *)coll_header.Data(), coll_header.Size());
+#else
+       stream.Read((char *)coll_header.Data(), coll_header.Size());
+#endif
+
+#if wxUSE_STD_IOSTREAM
+       stream.seekg(0, std::ios::end);
+       wxInt32 filesize = stream.tellg();
+       stream.seekg(0, std::ios::beg);
+#else
+       wxInt32 filesize = stream.GetSize();
+#endif
+       
+       long    offset8, length8,
+                       offset16, length16;
+       
+       mStatus = coll_header.ReadShort();
+       mFlags = coll_header.ReadUShort();      
+       offset8 = coll_header.ReadLong();
+       length8 = coll_header.ReadLong();
+       offset16 = coll_header.ReadLong();
+       length16 = coll_header.ReadLong();
+       
+       if (offset8 < -1 || length8 < 0 || offset16 < -1 || length16 < 0)
+               return stream;
+       if ((offset8 + length8) > filesize)
+               return stream;
+       if ((offset16 + length16) > filesize)
+               return stream;
+       
+       if (IsVerbose()) {
+               wxLogDebug(wxT("[ShapesCollection]     Status: %d"), mStatus);
+               wxLogDebug(wxT("[ShapesCollection]     Flags:  %d"), mFlags);
+       }
+       
+       // is there the 8-bit version?
+       if (offset8 != -1) {
+               if (IsVerbose())
+                       wxLogDebug(wxT("[ShapesCollection]     8-bit chunk present"));
+               
+               BigEndianBuffer chunkbuffer(length8);
+               
+#if wxUSE_STD_IOSTREAM
+               stream.seekg(offset8, std::ios::beg);
+               stream.read((char *)chunkbuffer.Data(), chunkbuffer.Size());
+#else
+               stream.SeekI(offset8, wxFromStart);
+               stream.Read((char *)chunkbuffer.Data(), chunkbuffer.Size());
+#endif
+               
+               ShapesChunk     *pc = new ShapesChunk(IsVerbose());
+               pc->LoadObject(chunkbuffer);
+               
+               if (!pc->IsGood()) {
+                       wxLogError(wxT("[ShapesCollection] Error loading 8-bit chunk... Dropped"));
+                       return stream;
+               }
+               mChunks[0] = pc;
+       }
+       
+       // is there the 16-bit version?
+       if (offset16 != -1) {
+               if (IsVerbose())
+                       wxLogDebug(wxT("[ShapesCollection]     16/32-bit chunk present"));
+               
+               BigEndianBuffer chunkbuffer(length16);
+               
+#if wxUSE_STD_IOSTREAM
+               stream.seekg(offset16, std::ios::beg);
+               stream.read((char *)chunkbuffer.Data(), chunkbuffer.Size());
+#else
+               stream.SeekI(offset16, wxFromStart);
+               stream.Read((char *)chunkbuffer.Data(), chunkbuffer.Size());
+#endif
+               
+               ShapesChunk     *pc = new ShapesChunk(IsVerbose());
+               pc->LoadObject(chunkbuffer);
+               
+               if (!pc->IsGood()) {
+                       wxLogError(wxT("[ShapesCollection] Error loading 16/32-bit chunk... Dropped"));
+                       return stream;
+               }
+               mChunks[1] = pc;
+       }
+       
+       mGoodData = true;
+       return stream;
+}
+
+BigEndianBuffer& ShapesCollection::LoadPatch(BigEndianBuffer& buffer)
+{
+       int depth = buffer.ReadLong();
+       ShapesChunk* chunk = 0;
+       if (depth == 8) {
+               if (!mChunks[0]) {
+                       mChunks[0] = new ShapesChunk(IsVerbose());
+               }
+               chunk = mChunks[0];
+       } else if (depth == 16) {
+               if (!mChunks[1]) {
+                       mChunks[1] = new ShapesChunk(IsVerbose());
+               }
+               chunk = mChunks[1];
+       } else {
+               wxLogError(wxT("[ShapesCollection] Error loading patch chunk; invalid depth"));
+               mGoodData = false;
+               return buffer;
+       }
+
+       chunk->LoadPatch(buffer);
+       if (!chunk->IsGood()) {
+               mGoodData = false;
+       }
+       return buffer;
+}
diff --git a/Shapes/ShapesElements.h b/Shapes/ShapesElements.h
new file mode 100644 (file)
index 0000000..34b16eb
--- /dev/null
@@ -0,0 +1,454 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef SHAPESLOADERS_H
+#define SHAPESLOADERS_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#include "wx/clipbrd.h"
+#endif
+#include <vector>
+using std::vector;
+#include "../BigEndianBuffer.h"
+
+#define COLLECTIONS_PER_FILE           32
+
+#define SIZEOF_collection_header       32
+
+class ShapesElement
+{
+private:
+       bool    mVerboseLoading;
+
+protected:
+       // So that subclasses can change their status
+       bool    mGoodData;
+
+public:
+       ShapesElement(bool verbose): mVerboseLoading(verbose), mGoodData(false) {}
+       ~ShapesElement(void) {}
+       
+       bool IsGood() const { return mGoodData; }
+       bool IsVerbose() const { return mVerboseLoading; }
+};
+
+// internal-use utility constants
+enum {
+       COLL_VERSION_8BIT = 0,
+       COLL_VERSION_TRUECOLOR
+};
+
+// a color
+class ShapesColor: public ShapesElement
+{
+private:
+       bool                    mLuminescent;
+       unsigned char   mValue;
+       unsigned short  mRed, mGreen, mBlue;
+
+public:
+       // constructor/destructor
+       ShapesColor(bool verbose = false);
+       ShapesColor(unsigned int r, unsigned int g, unsigned int b, unsigned int value, bool luminescent = false, bool verbose = false);
+       ~ShapesColor(void);
+
+       // operators
+       bool operator==(const ShapesColor& other) const;
+       bool operator!=(const ShapesColor& other) const { return !(*this == other); }
+       // accessors
+       bool Luminescent(void) const { return mLuminescent; }
+       unsigned char Value(void) const { return mValue; }
+       unsigned short Red(void) const { return mRed; }
+       unsigned short Green(void) const { return mGreen; }
+       unsigned short Blue(void) const { return mBlue; }
+       void SetLuminescent(bool l) { mLuminescent = l; }
+       void SetRed(unsigned short c) { mRed = c; }
+       void SetGreen(unsigned short c) { mGreen = c; }
+       void SetBlue(unsigned short c) { mBlue = c; }
+       // utilities
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer);
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+};
+
+// a color table
+class ShapesColorTable: public ShapesElement
+{
+private:
+       vector<ShapesColor*>    mColors;
+
+public:
+       ShapesColorTable(bool verbose = false);
+       ShapesColorTable(std::ifstream& ifs, wxString file_ext);
+       ~ShapesColorTable(void);
+
+       // operators
+       bool operator==(const ShapesColorTable& other) const;
+       bool operator!=(const ShapesColorTable& other) const { return !(*this == other); }
+
+       unsigned int ColorCount(void) const { return mColors.size(); }
+       ShapesColor *GetColor(unsigned int index) const { return mColors[index]; }
+       void InsertColor(ShapesColor *color) { mColors.push_back(color); }
+
+       unsigned int SizeInFile() const;
+
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer);
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer, unsigned int offset, unsigned int color_count);
+       BigEndianBuffer& SavePatch(BigEndianBuffer& buffer, int index);
+       int SaveToGimp(wxString path) const;
+       int SaveToPhotoshop(wxString path) const;
+};
+
+// a bitmap
+class ShapesBitmap: public ShapesElement
+{
+private:
+       short                   mWidth, mHeight,
+                                       mBytesPerRow,   // width for uncompressed bitmaps, -1 for compressed ones
+                                       mBitDepth;              // 8
+       bool                    mColumnOrder,   // store in column-order format
+                                       mTransparent;
+       unsigned char   *mPixels;
+       // list of frames referencing this bitmap
+       vector<int>             mUsers;
+
+public:
+       // constructor/destructor
+       ShapesBitmap(bool verbose = false);
+       ShapesBitmap(wxImage image, ShapesColorTable *colortable);
+       ~ShapesBitmap(void);
+
+       // operators
+       bool operator==(const ShapesBitmap& other) const;
+       bool operator!=(const ShapesBitmap& other) const { return !(*this == other); }
+
+       // accessors
+       short Width(void) const { return mWidth; }
+       short Height(void) const { return mHeight; }
+       short BytesPerRow(void) const { return mBytesPerRow; }
+       short BitDepth(void) const { return mBitDepth; }
+       bool IsColumnOrdered(void) const { return mColumnOrder; }
+       bool IsTransparent(void) const { return mTransparent; }
+       unsigned char* Pixels(void) const { return mPixels; }
+       // mutators
+       void SetWidth(short w) { mWidth = w; }
+       void SetHeight(short h) { mHeight = h; }
+       void SetBytesPerRow(short b) { mBytesPerRow = b; }
+       void SetBitDepth(short b) { mBitDepth = b; }
+       void SetColumnOrdered(bool b) { mColumnOrder = b; }
+       void SetTransparent(bool n) { mTransparent = n; }
+       // utilities
+       void ClipboardCopy(ShapesColorTable* colorTable) const;
+       void ClipboardPaste(ShapesColorTable* colorTable);
+       void FromImage(wxImage image, ShapesColorTable* colorTable);
+       unsigned int SizeInFile() const;
+       unsigned int SizeInPatch() const { return SizeInFile() + 12; }
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer);
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer, unsigned int offset);
+       BigEndianBuffer& SavePatch(BigEndianBuffer& buffer, int index);
+       void SaveToBMP(wxString path, ShapesColorTable *colorTable) const;
+       void SaveMaskToBMP(wxString path) const;
+};
+
+// a frame, aka "low level shape definition"
+class ShapesFrame : public ShapesElement
+{
+private:
+       bool            mXmirror,
+                               mYmirror,
+                               mKeypointObscured;
+       float           mMinimumLightIntensity;
+       short           mBitmapIndex;
+       // bitmap scale factor. Computed when loading Shapes
+       // using world_* fields and associated bitmap dimensions
+       int                     mScaleFactor;
+       // logical origin
+       short           mOriginX, mOriginY;
+       // keypoint. Used in player legs shapes to specify where to attach torso shapes
+       short           mKeyX, mKeyY;
+       // FIXME do we really need to store these fields here?
+       // scaled bitmap rectangle in world coordinates. The physical bitmap rectangle
+       // is scaled around the frame origin position, which gets translated to (0,0).
+       // Computed as:
+       //   world_left = -scale_factor * origin_x
+       //   world_top = scale_factor * origin_y
+       //   world_right = scale_factor * (width - origin_x)
+       //   world_bottom = -scale_factor * (height - origin_y)
+       short           mWorldLeft, mWorldRight, mWorldTop, mWorldBottom;
+       // scaled keypoint position in world coordinates. Computed as:
+       //   world_x0 = scale_factor * (key_x - origin_x)
+       //   world_y0 = -scale_factor * (key_y - origin_y)
+       short           mWorldX0, mWorldY0;
+       // list of sequences referencing this frame
+       vector<int>     mUsers;
+
+public:
+       // constructor/destructor
+       ShapesFrame(bool verbose = false);
+       ~ShapesFrame(void);
+       // operators
+       bool operator==(const ShapesFrame& other) const;
+       bool operator!=(const ShapesFrame& other) const { return !(*this == other); }
+       // accessors
+       bool IsXmirrored(void) const {return mXmirror;}
+       bool IsYmirrored(void) const {return mYmirror;}
+       bool IsKeypointObscured(void) const {return mKeypointObscured;}
+       float MinimumLightIntensity(void) const {return mMinimumLightIntensity;}
+       int ScaleFactor(void) const {return mScaleFactor;}
+       short BitmapIndex(void) const {return mBitmapIndex;}
+       short OriginX(void) const {return mOriginX;}
+       short OriginY(void) const {return mOriginY;}
+       short KeyX(void) const {return mKeyX;}
+       short KeyY(void) const {return mKeyY;}
+       short WorldLeft(void) const {return mWorldLeft;}
+       short WorldRight(void) const {return mWorldRight;}
+       short WorldTop(void) const {return mWorldTop;}
+       short WorldBottom(void) const {return mWorldBottom;}
+       short WorldX0(void) const {return mWorldX0;}
+       short WorldY0(void) const {return mWorldY0;}
+       // mutators
+       void SetXmirrored(bool b) {mXmirror = b;}
+       void SetYmirrored(bool b) {mYmirror = b;}
+       void SetKeypointObscured(bool b) {mKeypointObscured = b;}
+       void SetMinimumLightIntensity(float v) {mMinimumLightIntensity = v;}
+       void SetBitmapIndex(short i) {mBitmapIndex = i;}
+       void SetScaleFactor(int s) {mScaleFactor = s;}
+       void SetOriginX(short x) {mOriginX = x;}
+       void SetOriginY(short y) {mOriginY = y;}
+       void SetKeyX(short x) {mKeyX = x;}
+       void SetKeyY(short y) {mKeyY = y;}
+       void SetWorldLeft(short s) {mWorldLeft = s;}
+       void SetWorldRight(short s) {mWorldRight = s;}
+       void SetWorldTop(short s) {mWorldTop = s;}
+       void SetWorldBottom(short s)  {mWorldBottom = s;}
+       void SetWorldX0(short s) {mWorldX0 = s;}
+       void SetWorldY0(short s) {mWorldY0 = s;}
+       // utilities
+       unsigned int SizeInFile() const;
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer);
+       BigEndianBuffer& SavePatch(BigEndianBuffer& buffer, int index);
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer, unsigned int offset);
+};
+
+// sequence types (ShapesSequence.number_of_views). Nobody
+// seems to know what these values really mean, they just
+// tell the actual number of views in a redundant way
+enum {
+       ANIMATED_1 = 1,         // simple isotropic animation
+       ANIMATED_2TO8 = 2,      // 8 view animation
+       ANIMATED_3TO4 = 3,      // 4 view animation
+       ANIMATED_4 = 4,         // 4 view animation
+       ANIMATED_5TO8 = 5,      // 8 view animation
+       ANIMATED_8 = 8,         // 8 view animation
+       ANIMATED_3TO5 = 9,      // 5 view animation
+       UNANIMATED = 10,        // no animation, choose a random frame
+       ANIMATED_5 = 11         // 5 view animation
+};
+
+// a sequence, aka "high level shape definition"
+class ShapesSequence: public ShapesElement
+{
+private:
+       short                   mType;
+       unsigned short  mFlags;
+       wxString                mName;
+       short                   mNumberOfViews,
+                                       mFramesPerView,
+                                       mTicksPerFrame,
+                                       mKeyFrame,
+                                       mTransferMode,
+                                       mTransferModePeriod,
+                                       mFirstFrameSound,
+                                       mKeyFrameSound,
+                                       mLastFrameSound,
+                                       mPixelsToWorld,
+                                       mLoopFrame;
+//FIXME This could be made private
+public:
+       vector<short>   mFrameIndexes;
+
+public:
+       // constructor/destructor
+       ShapesSequence(bool verbose = false);
+       ~ShapesSequence(void);
+       // operators
+       bool operator==(const ShapesSequence& other) const;
+       bool operator!=(const ShapesSequence& other) const { return !(*this == other); }
+       // accessors
+       short Type(void) const {return mType;}
+       unsigned short Flags(void) const {return mFlags;}
+       wxString Name(void) const {return mName;}
+       short NumberOfViews(void) const {return mNumberOfViews;}
+       short FramesPerView(void) const {return mFramesPerView;}
+       short TicksPerFrame(void) const {return mTicksPerFrame;}
+       short KeyFrame(void) const {return mKeyFrame;}
+       short TransferMode(void) const {return mTransferMode;}
+       short TransferModePeriod(void) const {return mTransferModePeriod;}
+       short FirstFrameSound(void) const {return mFirstFrameSound;}
+       short KeyFrameSound(void) const {return mKeyFrameSound;}
+       short LastFrameSound(void) const {return mLastFrameSound;}
+       short PixelsToWorld(void) const {return mPixelsToWorld;}
+       short LoopFrame(void) const {return mLoopFrame;}
+       unsigned int FrameIndexCount(void) const {return mFrameIndexes.size();}
+       short GetFrameIndex(unsigned int index) const {return mFrameIndexes[index];}
+       // mutators
+       void SetType(short t) {mType = t;}
+       void SetFlags(unsigned short f) {mFlags = f;}
+       void SetName(wxString name) {mName = name;}
+       void SetNumberOfViews(short n) {mNumberOfViews = n;}
+       void SetFramesPerView(short n) {mFramesPerView = n;}
+       void SetTicksPerFrame(short n) {mTicksPerFrame = n;}
+       void SetKeyFrame(short n) {mKeyFrame = n;}
+       void SetTransferMode(short n) {mTransferMode = n;}
+       void SetTransferModePeriod(short n) {mTransferModePeriod = n;}
+       void SetFirstFrameSound(short n) {mFirstFrameSound = n;}
+       void SetKeyFrameSound(short n) {mKeyFrameSound = n;}
+       void SetLastFrameSound(short n) {mLastFrameSound = n;}
+       void SetPixelsToWorld(short n) {mPixelsToWorld = n;}
+       void SetLoopFrame(short n) {mLoopFrame = n;}
+       void SetFrameIndex(unsigned int index, short value) {mFrameIndexes[index] = value;}     
+       // utilities
+       unsigned int SizeInFile() const;
+       unsigned int SizeInPatch() const { return SizeInFile() + 12; }
+       BigEndianBuffer& SaveObject(BigEndianBuffer& buffer);
+       BigEndianBuffer& LoadObject(BigEndianBuffer& buffer, long offset);
+       BigEndianBuffer& SavePatch(BigEndianBuffer& buffer, int index);
+};
+
+int ActualNumberOfViews(int t);
+
+// chunk types. Bitmap encoding seems to depend on this setting
+enum {
+       _unused_collection = 0, // plain
+       _wall_collection,               // plain
+       _object_collection,             // RLE
+       _interface_collection,  // plain
+       _scenery_collection             // RLE
+};
+
+// a Shapes chunk
+class ShapesChunk: public ShapesElement
+{
+private:
+       short                   mVersion;       // COLLECTION_VERSION (same for all Marathon games)
+       short                   mType;
+       unsigned short  mFlags;         // unused; 0 in Durandal/Infinity, 1 in Rubicon and others
+       short                   mPixelsToWorld;
+
+       vector<ShapesColorTable*>       mColorTables;
+       vector<ShapesSequence*>         mSequences;
+       vector<ShapesFrame*>            mFrames;
+       vector<ShapesBitmap*>           mBitmaps;
+
+public:
+       // constructor/destructor
+       ShapesChunk(bool verbose = false);
+       ~ShapesChunk(void);
+       void Clear(void);
+       bool operator==(const ShapesChunk& other) const;
+       bool operator!=(const ShapesChunk& other) const { return !(*this == other); }
+       // chunk data access
+       int Version() const {return mVersion;}
+       int Type() const {return mType;}
+       int Flags() const {return mFlags;}
+       int ScaleFactor() const {return mPixelsToWorld;}
+       unsigned int ColorTableCount() const {return mColorTables.size();}
+       unsigned int BitmapCount() const {return mBitmaps.size();}
+       unsigned int FrameCount() const {return mFrames.size();}
+       unsigned int SequenceCount() const {return mSequences.size();}
+       ShapesColorTable* GetColorTable(unsigned int index) const;
+       ShapesBitmap* GetBitmap(unsigned int index) const;
+       ShapesFrame* GetFrame(unsigned int index) const;
+       ShapesSequence* GetSequence(unsigned int index) const;
+       // chunk alteration
+       void InsertColorTable(ShapesColorTable *ct);
+       void DeleteColorTable(unsigned int ct);
+       void InsertBitmap(ShapesBitmap *b);
+       void DeleteBitmap(unsigned int b);
+       void InsertFrame(ShapesFrame *f);
+       void DeleteFrame(unsigned int f);
+       void InsertSequence(ShapesSequence *s);
+       void DeleteSequence(unsigned int s);
+       // utilities
+
+       void ClipboardCopy();
+       void ClipboardPaste();
+       unsigned int SizeInFile() const;
+       unsigned int SizeInPatch(const ShapesChunk* other) const;
+       BigEndianBuffer& SaveObject(BigEndianBuffer& stream);
+       BigEndianBuffer& SavePatch(BigEndianBuffer& stream, const ShapesChunk* other);
+       BigEndianBuffer& LoadObject(BigEndianBuffer& stream);
+       BigEndianBuffer& LoadPatch(BigEndianBuffer& buffer);
+};
+
+// a Shapes collection
+class ShapesCollection: public ShapesElement
+{
+private:
+       short                   mStatus;
+       unsigned short  mFlags;
+       ShapesChunk             *mChunks[2];    // chunks for 8-bit and truecolor game
+
+public:
+       ShapesCollection(bool verbose = false);
+       ~ShapesCollection(void);
+       // accessors
+       int Status(void) const {return mStatus;}
+       int Flags(void) const {return mFlags;}
+       // collection data access
+       bool Defined(unsigned int chunk) const;
+       int Version(unsigned int chunk) const;
+       int Type(unsigned int chunk) const;
+       int Flags(unsigned int chunk) const;
+       int ScaleFactor(unsigned int chunk) const;
+       int ColorTableCount(unsigned int chunk) const;
+       int BitmapCount(unsigned int chunk) const;
+       int FrameCount(unsigned int chunk) const;
+       int SequenceCount(unsigned int chunk) const;
+       ShapesColorTable* GetColorTable(unsigned int chunk, unsigned int index) const;
+       ShapesBitmap* GetBitmap(unsigned int chunk, unsigned int index) const;
+       ShapesFrame* GetFrame(unsigned int chunk, unsigned int index) const;
+       ShapesSequence* GetSequence(unsigned int chunk, unsigned int index) const;
+       ShapesChunk* GetChunk(unsigned int chunk) const;
+       // collection alteration
+       void InsertColorTable(ShapesColorTable *ct, unsigned int chunk);
+       void DeleteColorTable(unsigned int chunk, unsigned int ct);
+       void InsertBitmap(ShapesBitmap *b, unsigned int chunk);
+       void DeleteBitmap(unsigned int chunk, unsigned int b);
+       void InsertFrame(ShapesFrame *f, unsigned int chunk);
+       void DeleteFrame(unsigned int chunk, unsigned int f);
+       void InsertSequence(ShapesSequence *s, unsigned int chunk);
+       void DeleteSequence(unsigned int chunk, unsigned int s);
+       // utilities
+       unsigned int SizeInFile(unsigned int chunk) const;
+       
+#if wxUSE_STD_IOSTREAM
+       wxSTD ostream& SaveObject(wxSTD ostream& stream);
+       wxSTD ostream& SavePatch(wxSTD ostream& stream, const ShapesCollection& other, int index, int depth);
+       wxSTD istream& LoadObject(wxSTD istream& stream);
+#else
+       wxOutputStream& SaveObject(wxOutputStream& stream);
+       wxOutputStream& SavePatch(wxOutputStream& stream, const ShapesCollection& other, int index, int depth);
+       wxInputStream& LoadObject(wxInputStream& stream);
+#endif
+       BigEndianBuffer& LoadPatch(BigEndianBuffer& buffer);
+};
+
+#endif
+
diff --git a/Shapes/ShapesTreeItemData.cpp b/Shapes/ShapesTreeItemData.cpp
new file mode 100644 (file)
index 0000000..4851177
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include "ShapesTreeItemData.h"
+
+ShapesTreeItemData::ShapesTreeItemData(int id, int vers, int sect, int seq):
+       coll_id(id), version(vers), section(sect), sequence(seq)
+{
+
+}
+
+ShapesTreeItemData::~ShapesTreeItemData(void)
+{
+
+}
+
+int ShapesTreeItemData::CollID(void) const
+{
+       return coll_id;
+}
+
+int ShapesTreeItemData::Version(void) const
+{
+       return version;
+}
+
+int ShapesTreeItemData::Section(void) const
+{
+       return section;
+}
+
+int ShapesTreeItemData::Sequence(void) const
+{
+       return sequence;
+}
+
diff --git a/Shapes/ShapesTreeItemData.h b/Shapes/ShapesTreeItemData.h
new file mode 100644 (file)
index 0000000..124957c
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#ifndef SHAPESTREEITEMDATA_H
+#define SHAPESTREEITEMDATA_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "wx/treectrl.h"
+
+enum {
+       TREESECTION_COLLECTION = 1,
+       TREESECTION_VERSION,
+       TREESECTION_BITMAPS,
+       TREESECTION_COLORTABLES,
+       TREESECTION_FRAMES,
+       TREESECTION_SEQUENCES
+};
+
+class ShapesTreeItemData: public wxTreeItemData {
+private:
+       int     coll_id;
+       int     version;
+       int section;
+       int     sequence;
+
+public:
+       ShapesTreeItemData(int id=-1, int vers=-1, int sect=-1, int seq=-1);
+       ~ShapesTreeItemData(void);
+       
+       int CollID(void) const;
+       int Version(void) const;
+       int Section(void) const;
+       int Sequence(void) const;
+};
+
+#endif
diff --git a/Shapes/ShapesView.cpp b/Shapes/ShapesView.cpp
new file mode 100644 (file)
index 0000000..e95bc0c
--- /dev/null
@@ -0,0 +1,2000 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <fstream>
+#include "ShapesView.h"
+#include "ShapesDocument.h"
+#include "../DefaultNames.h"
+#include "utilities.h"
+#include <wx/wfstream.h>
+
+#define INT_TO_WXSTRING(a)     wxString::Format(wxT("%d"), a)
+
+BEGIN_EVENT_TABLE(ShapesView, wxView)
+EVT_MENU(EDIT_MENU_COPY, ShapesView::MenuEditCopy)
+EVT_MENU(EDIT_MENU_DELETE, ShapesView::MenuEditDelete)
+EVT_MENU(EDIT_MENU_PASTE, ShapesView::MenuEditPaste)
+EVT_MENU_RANGE(VIEW_MENU_COLORTABLE_0, VIEW_MENU_COLORTABLE_7, ShapesView::MenuViewCT)
+EVT_MENU_RANGE(VIEW_MENU_TNSIZE_SMALL, VIEW_MENU_TNSIZE_AUTO, ShapesView::MenuViewTNSize)
+EVT_MENU(VIEW_MENU_TRANSPARENCY, ShapesView::MenuViewTransparency)
+EVT_MENU(VIEW_MENU_CENTERORIGIN, ShapesView::MenuViewCenterOrigin)
+EVT_MENU(SHAPES_MENU_ADDCOLORTABLE, ShapesView::MenuShapesAddColorTable)
+EVT_MENU(SHAPES_MENU_SAVECOLORTABLE, ShapesView::MenuShapesSaveColorTable)
+EVT_MENU(SHAPES_MENU_SAVECOLORTABLETOPS, ShapesView::MenuShapesSaveColorTable)
+EVT_MENU(SHAPES_MENU_ADDBITMAP, ShapesView::MenuShapesAddBitmap)
+EVT_MENU(SHAPES_MENU_EXPORTBITMAP, ShapesView::MenuShapesExportBitmap)
+EVT_MENU(SHAPES_MENU_EXPORTMASK, ShapesView::MenuShapesExportBitmapMask)
+EVT_MENU(SHAPES_MENU_EXPORTBITMAPS, ShapesView::MenuShapesExportBitmaps)
+EVT_MENU(SHAPES_MENU_EXPORTMASKS, ShapesView::MenuShapesExportBitmapMasks)
+EVT_MENU(SHAPES_MENU_ADDFRAME, ShapesView::MenuShapesNewFrame)
+EVT_MENU(SHAPES_MENU_ADDSEQUENCE, ShapesView::MenuShapesNewSequence)
+EVT_MENU(SHAPES_MENU_GENERATEPATCH, ShapesView::MenuShapesGeneratePatch)
+EVT_MENU(SHAPES_MENU_IMPORTPATCH, ShapesView::MenuShapesImportPatch)
+EVT_TREE_SEL_CHANGED(-1, ShapesView::OnTreeSelect)
+// bitmaps
+EVT_COMMAND(BITMAP_BROWSER, wxEVT_BITMAPBROWSER, ShapesView::OnBitmapSelect)
+EVT_COMMAND(BITMAP_BROWSER, wxEVT_BITMAPBROWSER_DELETE, ShapesView::BitmapDelete)
+EVT_COMMAND_RANGE(CB_COLUMN_ORDER, CB_ENABLE_TRANSPARENCY, wxEVT_COMMAND_CHECKBOX_CLICKED, ShapesView::ToggleBitmapCheckboxes)
+// color tables
+EVT_COMMAND(wxID_ANY, wxEVT_CTBROWSER, ShapesView::OnCTSelect)
+EVT_COMMAND(wxID_ANY, wxEVT_CTVIEW_SELECTION, ShapesView::CTColorSelect)
+EVT_COMMAND(wxID_ANY, wxEVT_CTVIEW_COLOR, ShapesView::CTColorChanged)
+EVT_COMMAND(CB_SELF_LUMINESCENT, wxEVT_COMMAND_CHECKBOX_CLICKED, ShapesView::ToggleSelfLuminCheckbox)
+EVT_BUTTON(BTN_GRADIENT, ShapesView::MakeCTGradient)
+// frames
+EVT_COMMAND(FRAME_BROWSER, wxEVT_FRAMEBROWSER, ShapesView::OnFrameSelect)
+EVT_COMMAND(FRAME_BROWSER, wxEVT_FRAMEBROWSER_DELETE, ShapesView::FrameDelete)
+EVT_COMMAND(FRAME_VIEW, wxEVT_FRAMEVIEW_DRAG, ShapesView::OnFramePointDrag)
+EVT_SPINCTRL(FIELD_BITMAP_INDEX, ShapesView::BitmapIndexSpin)
+EVT_COMMAND_RANGE(CB_XMIRROR, CB_KEYPOINT, wxEVT_COMMAND_CHECKBOX_CLICKED, ShapesView::ToggleFrameCheckboxes)
+EVT_TEXT(FIELD_ORIGIN_X, ShapesView::EditFrameFields)
+EVT_TEXT(FIELD_ORIGIN_Y, ShapesView::EditFrameFields)
+EVT_TEXT(FIELD_KEY_X, ShapesView::EditFrameFields)
+EVT_TEXT(FIELD_KEY_Y, ShapesView::EditFrameFields)
+EVT_TEXT(FIELD_FRAME_SCALEFACTOR, ShapesView::EditFrameFields)
+EVT_TEXT(FIELD_MIN_LIGHT_INT, ShapesView::EditFrameFields)
+// sequences
+EVT_TEXT(FIELD_SEQ_NAME, ShapesView::EditSequenceFields)
+EVT_BUTTON(BTN_DELETE_SEQ, ShapesView::DeleteSequence)
+EVT_CHOICE(MENU_SEQ_TYPE, ShapesView::EditSequenceType)
+EVT_TEXT(FIELD_SEQ_FRAMES_PER_VIEW, ShapesView::EditSequenceFields)
+EVT_TEXT(FIELD_SEQ_TICKS_PER_FRAME, ShapesView::EditSequenceFields)
+EVT_TEXT(FIELD_SEQ_LOOP_FRAME, ShapesView::EditSequenceFields)
+EVT_TEXT(FIELD_SEQ_KEY_FRAME, ShapesView::EditSequenceFields)
+EVT_CHOICE(MENU_SEQ_XFER_MODE, ShapesView::EditSequenceXferMode)
+EVT_TEXT(FIELD_SEQ_XFER_MODE_PERIOD, ShapesView::EditSequenceFields)
+EVT_TEXT(FIELD_SEQ_FIRST_FRAME_SND, ShapesView::EditSequenceFields)
+EVT_TEXT(FIELD_SEQ_KEY_FRAME_SND, ShapesView::EditSequenceFields)
+EVT_TEXT(FIELD_SEQ_LAST_FRAME_SND, ShapesView::EditSequenceFields)
+END_EVENT_TABLE()
+
+IMPLEMENT_DYNAMIC_CLASS(ShapesView, wxView)
+
+ShapesView::ShapesView(void):
+wxView(), mSelectedColl(-1), mSelectedVers(-1), mSelectedSequence(-1), mViewColorTable(-1)
+{
+       mFrame = (wxFrame *)NULL;
+}
+
+ShapesView::~ShapesView(void)
+{
+}
+
+bool ShapesView::OnCreate(wxDocument *doc, long WXUNUSED(flags))
+{
+       wxString        frameTitle = _T("ShapeFusion : Shapes : ");
+       
+       frameTitle.Append(doc->GetFilename());
+    mFrame = wxGetApp().CreateChildFrame(doc, this, frameTitle, wxPoint(0, 0), wxSize(900, 600));
+       mFrame->SetSizeHints(200, 200);
+       CreateViewMenu(mFrame->GetMenuBar());
+       CreateShapesMenu(mFrame->GetMenuBar());
+       menubar = mFrame->GetMenuBar();
+       
+       // Add everything to panel, so background is same as a dialog
+       main_panel = new wxPanel(mFrame);
+       main_panel->Show();
+       
+       mainbox = new wxBoxSizer(wxHORIZONTAL);
+       // create the collection tree
+       colltree = new wxTreeCtrl(main_panel, -1, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT);
+       colltree->DeleteAllItems();
+       wxTreeItemId    treeroot = colltree->AddRoot(doc->GetFilename());
+       mainbox->Add(colltree, 2, wxEXPAND);
+       // empty space (e.g. what is displayed when selecting the Sequences node)
+       // adding at least a panel is apparently needed to make sizers work
+       dummy_sizer = new wxBoxSizer(wxVERTICAL);
+       wxPanel *dummy_panel = new wxPanel(main_panel);
+       dummy_sizer->Add(dummy_panel, 1, wxEXPAND);
+       mainbox->Add(dummy_sizer, 5, wxEXPAND);
+       // collection section
+       coll_sizer = new wxBoxSizer(wxVERTICAL);
+       coll_text = new wxStaticText(main_panel, -1, wxT("Collection info"));
+       coll_static_box = new wxStaticBox(main_panel, -1, wxT("Collection info"));
+       coll_inner_box = new wxStaticBoxSizer(coll_static_box, wxVERTICAL);
+       coll_inner_box->Add(coll_text, 0, wxALL, 5);
+       coll_sizer->AddStretchSpacer();
+       coll_sizer->Add(coll_inner_box, 0, wxALIGN_CENTER);
+       coll_sizer->AddStretchSpacer();
+       mainbox->Add(coll_sizer, 5, wxEXPAND);
+       mainbox->Show(coll_sizer, false);
+       // chunk section
+       chunk_sizer = new wxBoxSizer(wxVERTICAL);
+       chunk_static_box = new wxStaticBox(main_panel, -1, wxT("Version info"));
+       chunk_static_box->SetThemeEnabled(true);
+       chunk_inner_box = new wxStaticBoxSizer(chunk_static_box, wxVERTICAL);
+       chunk_undef_label = new wxStaticText(main_panel, -1, wxT("Not defined"));
+       chunk_inner_box->Add(chunk_undef_label, 0, wxCENTER | wxALL, 5);
+       chunk_grid = new wxFlexGridSizer(2, 4, 0, 0);
+       chunk_inner_box->Add(chunk_grid, 0, wxCENTER | wxALL, 5);
+       chunk_version_label = new wxStaticText(main_panel, -1, wxT("Version:"));
+       chunk_type_label = new wxStaticText(main_panel, -1, wxT("Collection type:"));
+       chunk_flags_label = new wxStaticText(main_panel, -1, wxT("Flags:"));
+       chunk_sf_label = new wxStaticText(main_panel, -1, wxT("Collection scale factor:"));
+       chunk_version_field = new wxTextCtrl(main_panel, -1, wxT("0"));
+       wxString        coll_type_labels[] = {  wxT("Unused"),
+               wxT("Wall textures"),
+               wxT("Objects"),
+               wxT("Interface graphics"),
+               wxT("Scenery objects") };
+       chunk_type_menu = new wxChoice(main_panel, -1, wxDefaultPosition, wxDefaultSize, 5, coll_type_labels, 0);
+       chunk_flags_field = new wxTextCtrl(main_panel, -1, wxT("0"));
+       chunk_sf_field = new wxTextCtrl(main_panel, -1, wxT("0"));
+       chunk_grid->Add(chunk_version_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 5);
+       chunk_grid->Add(chunk_version_field, 0, wxALIGN_LEFT);
+       chunk_grid->Add(chunk_type_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 5);
+       chunk_grid->Add(chunk_type_menu, 0, wxALIGN_LEFT);
+       chunk_grid->Add(chunk_flags_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 5);
+       chunk_grid->Add(chunk_flags_field, 0, wxALIGN_LEFT);
+       chunk_grid->Add(chunk_sf_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 5);
+       chunk_grid->Add(chunk_sf_field, 0, wxALIGN_LEFT);
+       chunk_version_field->Enable(false);
+       chunk_type_menu->Enable(false);
+       chunk_flags_field->Enable(false);
+       chunk_sf_field->Enable(false);
+       chunk_sizer->AddStretchSpacer();
+       chunk_sizer->Add(chunk_inner_box, 0, wxALIGN_CENTER);
+       chunk_sizer->AddStretchSpacer();
+       mainbox->Add(chunk_sizer, 5, wxEXPAND);
+       mainbox->Show(chunk_sizer, false);
+       // create the color tables section
+       ct_outer_sizer = new wxBoxSizer(wxVERTICAL);
+       ctb = new CTBrowser(main_panel);
+       ct_count_label = new wxStaticText(main_panel, -1, wxT("N color tables"));
+       ct_edit_static_box = new wxStaticBox(main_panel, -1, wxT("Color table N of M"));
+       ct_edit_box = new wxStaticBoxSizer(ct_edit_static_box, wxVERTICAL);
+       ct_view = new CTView(main_panel);
+       ct_inner_edit_box = new wxBoxSizer(wxHORIZONTAL);
+       ct_self_lumin_checkbox = new wxCheckBox(main_panel, CB_SELF_LUMINESCENT, wxT("Self-luminescent color"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE);
+       ct_gradient_button = new wxButton(main_panel, BTN_GRADIENT, wxT("Make gradient"));
+       ct_edit_box->Add(ct_view, 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT | wxBOTTOM, 5);
+       ct_edit_box->Add(ct_inner_edit_box, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT | wxBOTTOM, 5);
+       ct_inner_edit_box->Add(ct_self_lumin_checkbox, 0, wxALIGN_CENTER);
+       ct_inner_edit_box->AddStretchSpacer();
+       ct_inner_edit_box->Add(ct_gradient_button, 0, wxALIGN_CENTER);
+       ct_outer_sizer->Add(ctb, 1, wxGROW);
+       ct_outer_sizer->Add(ct_count_label, 1, wxALIGN_LEFT | wxLEFT | wxTOP | wxBOTTOM, 10);
+       ct_outer_sizer->Add(ct_edit_box, 1, wxEXPAND | wxLEFT | wxRIGHT | wxTOP | wxBOTTOM, 10);
+       ct_outer_sizer->Show(ct_edit_box, false);
+       mainbox->Add(ct_outer_sizer, 5, wxEXPAND);
+       mainbox->Show(ct_outer_sizer, false);
+       // create the bitmaps section
+       b_outer_sizer = new wxBoxSizer(wxVERTICAL);
+       bb = new BitmapBrowser(main_panel, BITMAP_BROWSER);
+       bb->SetThumbnailSize(64);
+       b_count_label = new wxStaticText(main_panel, -1, wxT("N bitmaps"));
+       b_edit_static_box = new wxStaticBox(main_panel, -1, wxT("Bitmap N of M"));
+       b_edit_box = new wxStaticBoxSizer(b_edit_static_box, wxHORIZONTAL);
+       b_edit_inner_box = new wxBoxSizer(wxVERTICAL);
+       b_info_label = new wxStaticText(main_panel, -1, wxT("AxB pixels"));
+       b_order_checkbox = new wxCheckBox(main_panel, CB_COLUMN_ORDER, wxT("Store pixels in column order"));
+       b_transparency_checkbox = new wxCheckBox(main_panel, CB_ENABLE_TRANSPARENCY, wxT("Enable transparency"));
+       b_view = new BitmapView(main_panel);
+       b_edit_inner_box->Add(b_info_label, 0, wxALIGN_LEFT | wxBOTTOM, 10);
+       b_edit_inner_box->Add(b_order_checkbox, 0, wxALIGN_LEFT);
+       b_edit_inner_box->Add(b_transparency_checkbox, 0, wxALIGN_LEFT);
+       b_edit_inner_box->AddStretchSpacer();
+       b_edit_box->Add(b_edit_inner_box, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT | wxBOTTOM, 5);
+       b_edit_box->Add(b_view, 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT | wxBOTTOM, 5);
+       b_outer_sizer->Add(bb, 1, wxGROW);
+       b_outer_sizer->Add(b_count_label, 1, wxALIGN_LEFT | wxLEFT | wxTOP | wxBOTTOM, 10);
+       b_outer_sizer->Add(b_edit_box, 1, wxEXPAND | wxLEFT | wxRIGHT | wxTOP | wxBOTTOM, 10);
+       b_outer_sizer->Show(b_edit_box, false);
+       mainbox->Add(b_outer_sizer, 5, wxEXPAND);
+       mainbox->Show(b_outer_sizer, false);
+       // create the frames section
+       f_outer_sizer = new wxBoxSizer(wxVERTICAL);
+       // FIXME the FrameView should be initialized later, but spurious event handlers
+       // dereferencing it are triggered during initialization
+       f_view = new FrameView(main_panel, FRAME_VIEW);
+       fb = new FrameBrowser(main_panel, FRAME_BROWSER);
+       fb->SetThumbnailSize(64);
+       f_count_label = new wxStaticText(main_panel, -1, wxT("N frames"));
+       f_edit_static_box = new wxStaticBox(main_panel, -1, wxT("Frame N"));
+       f_edit_box = new wxStaticBoxSizer(f_edit_static_box, wxHORIZONTAL);
+       f_bitmap_label = new wxStaticText(main_panel, -1, wxT("Associated bitmap:"));
+       f_bitmap_id = new wxSpinCtrl(main_panel, FIELD_BITMAP_INDEX, wxT("0"), wxDefaultPosition, wxSize(60, -1));
+       f_xmirror_checkbox = new wxCheckBox(main_panel, CB_XMIRROR, wxT("X mirror"));
+       f_ymirror_checkbox = new wxCheckBox(main_panel, CB_YMIRROR, wxT("Y mirror"));
+       f_keypoint_checkbox = new wxCheckBox(main_panel, CB_KEYPOINT, wxT("Keypoint obscured"));
+       f_origin_x_label = new wxStaticText(main_panel, -1, wxT("Origin X:"), wxDefaultPosition, wxSize(150, -1));
+       f_origin_x_field = new wxTextCtrl(main_panel, FIELD_ORIGIN_X, wxT("0"), wxDefaultPosition, wxSize(60, -1));
+       f_origin_y_label = new wxStaticText(main_panel, -1, wxT("Origin Y:"), wxDefaultPosition, wxSize(150, -1));
+       f_origin_y_field = new wxTextCtrl(main_panel, FIELD_ORIGIN_Y, wxT("0"), wxDefaultPosition, wxSize(60, -1));
+       f_key_x_label = new wxStaticText(main_panel, -1, wxT("Keypoint X:"), wxDefaultPosition, wxSize(150, -1));
+       f_key_x_field = new wxTextCtrl(main_panel, FIELD_KEY_X, wxT("0"), wxDefaultPosition, wxSize(60, -1));
+       f_key_y_label = new wxStaticText(main_panel, -1, wxT("Keypoint Y:"), wxDefaultPosition, wxSize(150, -1));
+       f_key_y_field = new wxTextCtrl(main_panel, FIELD_KEY_Y, wxT("0"), wxDefaultPosition, wxSize(60, -1));
+       f_scalefactor_label = new wxStaticText(main_panel, -1, wxT("Scale factor:"), wxDefaultPosition, wxSize(150, -1));
+       f_scalefactor_field = new wxTextCtrl(main_panel, FIELD_FRAME_SCALEFACTOR, wxT("0"), wxDefaultPosition, wxSize(60, -1));
+       f_mli_label = new wxStaticText(main_panel, -1, wxT("Minimum lightness (%):"), wxDefaultPosition, wxSize(150, -1));
+       f_mli_field = new wxTextCtrl(main_panel, FIELD_MIN_LIGHT_INT, wxT("0"), wxDefaultPosition, wxSize(60, -1));
+       f_origin_box = new wxFlexGridSizer(10, 2, 5, 0);
+       f_origin_box->Add(f_bitmap_label, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_bitmap_id, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_xmirror_checkbox, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->AddStretchSpacer();
+       f_origin_box->Add(f_ymirror_checkbox, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->AddStretchSpacer();
+       f_origin_box->Add(f_scalefactor_label, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_scalefactor_field, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_origin_x_label, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_origin_x_field, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_origin_y_label, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_origin_y_field, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_key_x_label, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_key_x_field, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_key_y_label, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_key_y_field, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_keypoint_checkbox, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->AddStretchSpacer();
+       f_origin_box->Add(f_mli_label, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_origin_box->Add(f_mli_field, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+       f_edit_inner_box = new wxBoxSizer(wxVERTICAL);
+       f_edit_inner_box->Add(f_origin_box, 0, wxALIGN_LEFT);
+       f_edit_box->Add(f_edit_inner_box, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP | wxBOTTOM, 5);
+       f_edit_box->Add(f_view, 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT | wxBOTTOM, 5);
+       f_outer_sizer->Add(fb, 1, wxGROW);
+       f_outer_sizer->Add(f_count_label, 1, wxALIGN_LEFT | wxLEFT | wxTOP | wxBOTTOM, 10);
+       f_outer_sizer->Add(f_edit_box, 1, wxEXPAND | wxLEFT | wxRIGHT | wxTOP | wxBOTTOM, 10);
+       f_outer_sizer->Show(f_edit_box, false);
+       mainbox->Add(f_outer_sizer, 5, wxEXPAND);
+       mainbox->Show(f_outer_sizer, false);
+       // create the sequences section
+       s_outer_static_box = new wxStaticBox(main_panel, -1, wxT("Sequence"));
+       s_outer_sizer = new wxStaticBoxSizer(s_outer_static_box, wxVERTICAL);
+       
+       s_box1 = new wxBoxSizer(wxHORIZONTAL);
+       s_outer_sizer->Add(s_box1, 0, wxEXPAND | wxALIGN_TOP | wxALL, 5);
+       s_name_label = new wxStaticText(main_panel, -1, wxT("Name:"));
+       s_name_field = new wxTextCtrl(main_panel, FIELD_SEQ_NAME, wxT("foobar"));
+       s_delete_button = new wxButton(main_panel, BTN_DELETE_SEQ, wxT("Delete sequence"));
+       s_box1->Add(s_name_label, 0, wxALIGN_CENTER | wxRIGHT, 5);
+       s_box1->Add(s_name_field, 1, wxALIGN_CENTER);
+       s_box1->Add(s_delete_button, 0, wxALIGN_CENTER | wxLEFT, 20);
+       
+       s_box2 = new wxBoxSizer(wxHORIZONTAL);
+       s_outer_sizer->Add(s_box2, 0, wxEXPAND | wxALIGN_TOP | wxALL, 5);
+       s_grid_box = new wxFlexGridSizer(5, 2, 4, 0);
+       s_box2->Add(s_grid_box, 0, wxEXPAND | wxALIGN_TOP);
+       s_type_label = new wxStaticText(main_panel, -1, wxT("Sequence type:"), wxDefaultPosition, wxSize(120, -1));
+       wxString        anim_type_labels[] = { wxT("Display a random frame"),
+               wxT("Animation with 1 view"),
+               wxT("Animation with 4 views"),
+               wxT("Animation with 5 views"),
+               wxT("Animation with 8 views") };
+       s_type_menu = new wxChoice(main_panel, MENU_SEQ_TYPE, wxDefaultPosition, wxDefaultSize, 5, anim_type_labels, 0);
+       s_fpv_label = new wxStaticText(main_panel, -1, wxT("Frames per view:"), wxDefaultPosition, wxSize(120, -1));
+       s_fpv_field = new wxTextCtrl(main_panel, FIELD_SEQ_FRAMES_PER_VIEW, wxT("1"));
+       s_tpf_label = new wxStaticText(main_panel, -1, wxT("Ticks per frame:"), wxDefaultPosition, wxSize(120, -1));
+       s_tpf_field = new wxTextCtrl(main_panel, FIELD_SEQ_TICKS_PER_FRAME, wxT("1"));
+       s_lf_label = new wxStaticText(main_panel, -1, wxT("Loop at frame:"), wxDefaultPosition, wxSize(120, -1));
+       s_lf_field = new wxTextCtrl(main_panel, FIELD_SEQ_LOOP_FRAME, wxT("0"));
+       s_kf_label = new wxStaticText(main_panel, -1, wxT("Key frame:"), wxDefaultPosition, wxSize(120, -1));
+       s_kf_field = new wxTextCtrl(main_panel, FIELD_SEQ_KEY_FRAME, wxT("0"));
+       s_grid_box->Add(s_type_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_type_menu, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_fpv_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_fpv_field, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_tpf_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_tpf_field, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_lf_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_lf_field, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_kf_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box->Add(s_kf_field, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       
+       s_separator = new wxPanel(main_panel);
+       s_box2->Add(s_separator, 1, wxEXPAND);
+       
+       s_grid_box2 = new wxFlexGridSizer(5, 2, 4, 0);
+       s_box2->Add(s_grid_box2, 0, wxEXPAND | wxALIGN_TOP);
+       s_xfermode_label = new wxStaticText(main_panel, -1, wxT("Transfer mode:"), wxDefaultPosition, wxSize(140, -1));
+       wxString        xfermode_labels[] = {   wxT("Normal"),
+               wxT("Fade out to black"),
+               wxT("50% invisibility"),
+               wxT("75% invisibility"),
+               wxT("Pulsate"),
+               wxT("Wobble"),
+               wxT("Fast wobble"),
+               wxT("100% static"),
+               wxT("50% static"),
+               wxT("Landscape"),
+               wxT("Smear"),
+               wxT("Fade out static"),
+               wxT("Pulsating static"),
+               wxT("Fold in"),
+               wxT("Fold out"),
+               wxT("Horizontal slide"),
+               wxT("Fast horizontal slide"),
+               wxT("Vertical slide"),
+               wxT("Fast vertical slide"),
+               wxT("Wander"),
+               wxT("Fast wander"),
+               wxT("Big landscape")
+       };
+       s_xfermode_menu = new wxChoice(main_panel, MENU_SEQ_XFER_MODE, wxDefaultPosition, wxDefaultSize, 22, xfermode_labels, 0);
+       s_xferperiod_label = new wxStaticText(main_panel, -1, wxT("Transfer mode period:"), wxDefaultPosition, wxSize(150, -1));
+       s_xferperiod_field = new wxTextCtrl(main_panel, FIELD_SEQ_XFER_MODE_PERIOD, wxT("1"));
+       s_ffs_label = new wxStaticText(main_panel, -1, wxT("First frame sound:"), wxDefaultPosition, wxSize(150, -1));
+       s_ffs_field = new wxTextCtrl(main_panel, FIELD_SEQ_FIRST_FRAME_SND, wxT("0"));
+       s_kfs_label = new wxStaticText(main_panel, -1, wxT("Key frame sound:"), wxDefaultPosition, wxSize(150, -1));
+       s_kfs_field = new wxTextCtrl(main_panel, FIELD_SEQ_KEY_FRAME_SND, wxT("0"));
+       s_lfs_label = new wxStaticText(main_panel, -1, wxT("Last frame sound:"), wxDefaultPosition, wxSize(150, -1));
+       s_lfs_field = new wxTextCtrl(main_panel, FIELD_SEQ_LAST_FRAME_SND, wxT("0"));
+       s_grid_box2->Add(s_xfermode_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxRIGHT, 5);
+       s_grid_box2->Add(s_xfermode_menu, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box2->Add(s_xferperiod_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxRIGHT, 5);
+       s_grid_box2->Add(s_xferperiod_field, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box2->Add(s_ffs_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box2->Add(s_ffs_field, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box2->Add(s_kfs_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box2->Add(s_kfs_field, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box2->Add(s_lfs_label, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       s_grid_box2->Add(s_lfs_field, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
+       
+       s_fb = new SequenceView(main_panel, wxID_ANY);
+       s_outer_sizer->Add(s_fb, 1, wxEXPAND | wxALL, 5);
+       mainbox->Add(s_outer_sizer, 5, wxEXPAND | wxLEFT | wxRIGHT | wxTOP | wxBOTTOM, 10);
+       mainbox->Show(s_outer_sizer, false);
+       
+       mainbox->Layout();
+       main_panel->SetSizer(mainbox);
+#ifdef __X__
+    // X seems to require a forced resize
+    int x, y;
+       
+    mFrame->GetSize(&x, &y);
+    mFrame->SetSize(wxDefaultCoord, wxDefaultCoord, x, y);
+#endif 
+       mFrame->Show(true);
+    Activate(true);
+    
+    return true;
+}
+
+void ShapesView::OnDraw(wxDC *WXUNUSED(dc))
+{
+}
+
+void ShapesView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint))
+{
+       unsigned int    collCount = ((ShapesDocument*)GetDocument())->CollectionCount();
+       
+       if (collCount == 0)
+               return;
+       
+       // update all levels of the tree control
+       for (unsigned int i = 0; i < collCount; i++) {
+               // collection name nodes
+               ShapesTreeItemData      *itemdata = new ShapesTreeItemData(i, -1, TREESECTION_COLLECTION);
+               wxTreeItemId            coll = colltree->AppendItem(colltree->GetRootItem(), GetName(wxT("collection"), i),
+                                                                                                               -1, -1, itemdata);
+               
+               for (unsigned int j = 0; j < 2; j++) {
+                       // color version nodes
+                       ShapesTreeItemData      *id = new ShapesTreeItemData(i, j, TREESECTION_VERSION);
+                       wxString                        label;
+                       
+                       if (j == COLL_VERSION_8BIT)
+                               label = wxT("8-bit color version");
+                       else if (j == COLL_VERSION_TRUECOLOR)
+                               label = wxT("True color version");
+                       wxTreeItemId    coll2 = colltree->AppendItem(coll, label, -1, -1, id);
+                       
+                       if (((ShapesDocument*)GetDocument())->CollectionDefined(i, j)) {
+                               // section nodes
+                               ShapesTreeItemData      *id_b = new ShapesTreeItemData(i, j, TREESECTION_BITMAPS),
+                               *id_ct = new ShapesTreeItemData(i, j, TREESECTION_COLORTABLES),
+                               *id_f = new ShapesTreeItemData(i, j, TREESECTION_FRAMES),
+                               *id_s = new ShapesTreeItemData(i, j, TREESECTION_SEQUENCES);
+                               wxTreeItemId            coll_b = colltree->AppendItem(coll2, wxT("Bitmaps"), -1, -1, id_b),
+                               coll_ct = colltree->AppendItem(coll2, wxT("Color tables"), -1, -1, id_ct),
+                               coll_f = colltree->AppendItem(coll2, wxT("Frames"), -1, -1, id_f),
+                               coll_s = colltree->AppendItem(coll2, wxT("Sequences"), -1, -1, id_s);
+                               
+                               for (unsigned int k = 0; k < ((ShapesDocument*)GetDocument())->CollectionSequenceCount(i, j); k++) {
+                                       // sequence nodes
+                                       ShapesSequence          *seq = ((ShapesDocument*)GetDocument())->GetSequence(i, j, k);
+                                       wxString                blabel;
+                                       ShapesTreeItemData      *id_seq = new ShapesTreeItemData(i, j, TREESECTION_SEQUENCES, k);
+                                       
+                                       blabel << k;
+                                       if (seq->Name().Length() > 0)
+                                               blabel << wxT(" - ") << seq->Name();
+                                       colltree->AppendItem(coll_s, blabel, -1, -1, id_seq);
+                               }
+                       }
+               }
+       }
+}
+
+bool ShapesView::OnClose(bool deleteWindow)
+{
+       if (!GetDocument()->Close())
+               return false;
+       Activate(false);
+       if (deleteWindow) {
+               delete mFrame;
+               return true;
+       }
+       return true;
+}
+
+// return the id of the "Sequences" tree item relative to
+// the specified collection and color version
+wxTreeItemId ShapesView::GetSequencesTreeItem(unsigned int collection, unsigned int version) const
+{
+       wxTreeItemIdValue       thecookie;
+       wxTreeItemId            rootid = colltree->GetRootItem(),
+       collnameid = colltree->GetFirstChild(rootid, thecookie);
+       
+       // descend into the tree towards the right item
+       while (collnameid.IsOk()) {
+               ShapesTreeItemData      *collname_data = dynamic_cast<ShapesTreeItemData *>(colltree->GetItemData(collnameid));
+               
+               if (collname_data->CollID() == (int)collection) {
+                       // found right collection branch
+                       wxTreeItemIdValue       thecookieII;
+                       wxTreeItemId            collversid = colltree->GetFirstChild(collnameid, thecookieII);
+                       
+                       while (collversid.IsOk()) {
+                               ShapesTreeItemData      *collvers_data = dynamic_cast<ShapesTreeItemData *>(colltree->GetItemData(collversid));
+                               
+                               if (collvers_data->Version() == (int)version) {
+                                       // found right version node
+                                       wxTreeItemIdValue       thecookieIII;
+                                       wxTreeItemId            sectid = colltree->GetFirstChild(collversid, thecookieIII);
+                                       
+                                       while (sectid.IsOk()) {
+                                               ShapesTreeItemData      *sect_data = dynamic_cast<ShapesTreeItemData *>(colltree->GetItemData(sectid));
+                                               
+                                               if (sect_data->Section() == TREESECTION_SEQUENCES) {
+                                                       // here we are
+                                                       return sectid;
+                                               }
+                                               sectid = colltree->GetNextChild(collversid, thecookieIII);
+                                       }
+                               }
+                               collversid = colltree->GetNextChild(collnameid, thecookieII);
+                       }
+               }
+               collnameid = colltree->GetNextChild(rootid, thecookie);
+       }
+       return wxTreeItemId();  // ctor makes it invalid, so ok
+}
+
+void ShapesView::MenuEditCopy(wxCommandEvent& e)
+{
+       ShapesTreeItemData* selected_item_data = dynamic_cast<ShapesTreeItemData*>(colltree->GetItemData(colltree->GetSelection()));
+       
+       if (selected_item_data != NULL) {
+               switch (selected_item_data->Section()) {
+                       case TREESECTION_BITMAPS:
+                               DoCopyBitmap(bb->GetSelection());
+                               break;
+                       case TREESECTION_VERSION:
+                               DoCopyChunk(selected_item_data->CollID(), selected_item_data->Version());
+                               break;
+                       default:
+                               break;
+               }
+       }
+}
+
+// handle the Edit->Delete menu command, which is context-sensitive
+void ShapesView::MenuEditDelete(wxCommandEvent &e)
+{
+       ShapesTreeItemData      *selected_item_data = dynamic_cast<ShapesTreeItemData *>(colltree->GetItemData(colltree->GetSelection()));
+       
+       if (selected_item_data != NULL) {
+               // what should we delete?
+               switch (selected_item_data->Section()) {
+                       case TREESECTION_COLORTABLES:
+                               DoDeleteColorTable(ctb->GetSelection());
+                               break;
+                       case TREESECTION_BITMAPS:
+                               DoDeleteBitmap(bb->GetSelection());
+                               break;
+                       case TREESECTION_FRAMES:
+                               DoDeleteFrame(fb->GetSelection());
+                               break;
+                       case TREESECTION_SEQUENCES:
+                               break;
+               }
+       }
+}
+
+void ShapesView::MenuEditPaste(wxCommandEvent& e)
+{
+       ShapesTreeItemData* selected_item_data = dynamic_cast<ShapesTreeItemData*>(colltree->GetItemData(colltree->GetSelection()));
+       
+       if (selected_item_data != NULL) {
+               switch (selected_item_data->Section()) {
+                       case TREESECTION_BITMAPS:
+                               DoPasteBitmap(bb->GetSelection());
+                               break;
+                       case TREESECTION_VERSION:
+                               DoPasteChunk(selected_item_data->CollID(), selected_item_data->Version());
+                               break;
+                       default:
+                               break;
+               }
+       }
+}
+
+void ShapesView::MenuViewTransparency(wxCommandEvent &e)
+{
+       bool    showTranspPixels = e.IsChecked();
+       
+       wxBeginBusyCursor();
+       bb->SetTranspPixelsDisplay(!showTranspPixels);
+       b_view->SetTranspPixelsDisplay(!showTranspPixels);
+       fb->SetTranspPixelsDisplay(!showTranspPixels);
+       f_view->SetTranspPixelsDisplay(!showTranspPixels);
+       s_fb->SetTranspPixelsDisplay(!showTranspPixels);
+       wxEndBusyCursor();
+}
+
+void ShapesView::MenuViewCenterOrigin(wxCommandEvent &e)
+{
+       f_view->SetCenterOrigin(e.IsChecked());
+}
+
+// color table menu handler
+void ShapesView::MenuViewCT(wxCommandEvent &e)
+{
+       mViewColorTable = e.GetId() - VIEW_MENU_COLORTABLE_0;
+       
+       ShapesColorTable        *ctp = ((ShapesDocument*)GetDocument())->GetColorTable(
+                                                                                                                                                          mSelectedColl, mSelectedVers, mViewColorTable);
+       
+       wxBeginBusyCursor();
+       bb->SetColorTable(ctp);
+       b_view->SetColorTable(ctp);
+       fb->SetColorTable(ctp);
+       f_view->SetColorTable(ctp);
+       s_fb->SetColorTable(ctp);
+       wxEndBusyCursor();
+}
+
+// thumbnail size menu handler
+void ShapesView::MenuViewTNSize(wxCommandEvent &e)
+{
+       int     size = -1;
+       
+       switch (e.GetId()) {
+               case VIEW_MENU_TNSIZE_SMALL:
+                       size = 32;
+                       break;
+               case VIEW_MENU_TNSIZE_MEDIUM:
+                       size = 64;
+                       break;
+               case VIEW_MENU_TNSIZE_LARGE:
+                       size = 128;
+                       break;
+               case VIEW_MENU_TNSIZE_AUTO:
+                       size = -1;
+                       break;
+       }
+       wxBeginBusyCursor();
+       bb->SetThumbnailSize(size);
+       fb->SetThumbnailSize(size);
+       s_fb->SetThumbnailSize(size);
+       wxEndBusyCursor();
+}
+
+void ShapesView::MenuShapesAddColorTable(wxCommandEvent &e)
+{
+       wxFileDialog    *dlg = new wxFileDialog(mFrame, wxT("Import a color table"), wxT(""), wxT(""),
+                                                                                       wxT("Photoshop color table|*.act|Gimp palette|*.gpl"), wxOPEN);
+       
+       if (dlg->ShowModal() == wxID_OK) {
+               wxString                filename = dlg->GetPath();
+               std::ifstream   ifs(filename.mb_str(), std::ios::binary);
+               
+               if (ifs.good()) {
+                       ShapesColorTable        *newct = new ShapesColorTable(ifs, filename.AfterLast('.')),
+                       *firstct = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, 0);
+                       
+                       ifs.close();
+                       if (newct->ColorCount() > 0) {
+                               if (newct->GetColor(0)->Red() != 0 || newct->GetColor(0)->Green() != 0 || newct->GetColor(0)->Blue() != 255<<8)
+                                       wxMessageBox(wxT("The first color of the table being imported is not the usual Marathon chroma key color"
+                                                                        " (no red, no green, maximum blue). It should be corrected manually to avoid problems."),
+                                                                wxT("Invalid chroma key color"), wxOK | wxICON_WARNING, mFrame);
+                               if (firstct != NULL) {
+                                       // handle cases in which the new color table has more or less colors than existing ones
+                                       if (newct->ColorCount() > firstct->ColorCount()) {
+                                               // more colors, append dummy colors to existing tables
+                                               unsigned int    numcolors = newct->ColorCount() - firstct->ColorCount(),
+                                               numcts = ((ShapesDocument*)GetDocument())->CollectionColorTableCount(mSelectedColl, mSelectedVers);
+                                               
+                                               for (unsigned int i = 0; i < numcts; i++) {
+                                                       ShapesColorTable        *ct = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, i);
+                                                       
+                                                       for (unsigned int j = 0; j < numcolors; j++)
+                                                               ct->InsertColor(new ShapesColor(0, 0, 0, numcolors + j));
+                                               }
+                                       } else if (newct->ColorCount() < firstct->ColorCount()) {
+                                               // less colors, append dummy colors to the new table
+                                               unsigned int    numcolors = firstct->ColorCount() - newct->ColorCount();
+                                               
+                                               for (unsigned int i = 0; i < numcolors; i++)
+                                                       newct->InsertColor(new ShapesColor(0, 0, 0, newct->ColorCount() + i));
+                                       }
+                               }
+                               ((ShapesDocument*)GetDocument())->InsertColorTable(newct, mSelectedColl, mSelectedVers);
+                               ((ShapesDocument*)GetDocument())->Modify(true);
+                               // update the GUI
+                               ctb->AddColorTable(newct);
+                               unsigned int    colorTableCount = ((ShapesDocument*)GetDocument())->CollectionColorTableCount(
+                                                                                                                                                                                                                         mSelectedColl, mSelectedVers);
+                               wxMenu                  *colortables_submenu;
+                               menubar->FindItem(VIEW_MENU_COLORTABLE_0, &colortables_submenu);
+                               for (unsigned int i = 0; i < colortables_submenu->GetMenuItemCount(); i++) {
+                                       menubar->Enable(VIEW_MENU_COLORTABLE_0 + i, i < colorTableCount);
+                                       menubar->Check(VIEW_MENU_COLORTABLE_0 + mViewColorTable, i == (unsigned int)mViewColorTable);
+                               }
+                       } else {
+                               wxString        errormsg;
+                               
+                               errormsg << wxT("Sorry, could not load a color table from ") << filename << wxT(" because the file format is unknown or the file contains no colors.");
+                               wxMessageBox(errormsg, wxT("Error loading color table"), wxOK | wxICON_ERROR, mFrame);
+                               delete newct;
+                       }
+               } else {
+                       wxString        errormsg;
+                       
+                       errormsg << wxT("Sorry, could not load a color table from ") << filename << wxT(" because the file is not readable.");
+                       wxMessageBox(errormsg, wxT("Error loading color table"), wxOK | wxICON_ERROR, mFrame);
+               }
+       }
+       dlg->Destroy();
+}
+
+// prompt the user and save the selected color table, either in
+// Gimp or PhotoShop format (depending on event id)
+void ShapesView::MenuShapesSaveColorTable(wxCommandEvent &e)
+{
+       if (((ShapesDocument*)GetDocument()) != NULL && mSelectedColl != -1 && mSelectedVers != -1) {
+               int     selection = ctb->GetSelection();
+               
+               if (selection >= 0) {
+                       bool            ps = (e.GetId() == SHAPES_MENU_SAVECOLORTABLETOPS);
+                       wxString        prompt = wxString::Format(wxT("Save color table %d"), selection),
+                       name, ctpath;
+                       
+                       if (ps) {
+                               name = wxString::Format(wxT("ColorTable%d.act"), selection);
+                               ctpath = wxFileSelector(prompt, wxT(""), name, wxT(""),
+                                                                               wxT("PhotoShop color table|*.act"),
+                                                                               wxSAVE | wxOVERWRITE_PROMPT);
+                       } else {
+                               name = wxString::Format(wxT("ColorTable%d.gpl"), selection);
+                               ctpath = wxFileSelector(prompt, wxT(""), name, wxT(""),
+                                                                               wxT("Gimp color table|*.gpl"),
+                                                                               wxSAVE | wxOVERWRITE_PROMPT);
+                       }
+                       
+                       if (!ctpath.empty()) {
+                               ShapesColorTable        *ct = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, selection);
+                               int                                     err = 0;
+                               
+                               if (ps)
+                                       err = ct->SaveToPhotoshop(ctpath);
+                               else
+                                       err = ct->SaveToGimp(ctpath);
+                               
+                               if (err != 0) {
+                                       wxString        errormsg;
+                                       
+                                       errormsg << wxT("Sorry, could not save color table to ") << ctpath << wxT(".");
+                                       wxMessageBox(errormsg, wxT("Error saving color table"), wxOK | wxICON_ERROR, mFrame);
+                               }
+                       }
+               }
+       }
+}
+
+void ShapesView::MenuShapesAddBitmap(wxCommandEvent &e)
+{
+       if (((ShapesDocument*)GetDocument()) != NULL && mSelectedColl != -1 && mSelectedVers != -1) {
+               wxFileDialog    *dlg = new wxFileDialog(mFrame, wxT("Choose a bitmap to add"), wxT(""), wxT(""),
+                                                                                               wxT("Common bitmap files (BMP, JPEG, PNG, GIF, TIFF)|*.bmp;*.jpg;*.jpeg;*.tif;*.tiff;*.png;*.gif"),
+                                                                                               wxOPEN);
+               
+               if (dlg->ShowModal() == wxID_OK) {
+                       wxString        filename = dlg->GetPath();
+                       wxImage         img;
+                       
+                       if (img.LoadFile(filename)) {
+                               wxBeginBusyCursor();
+                               // we have the wxImage now. Encode it to a new bitmap
+                               ShapesColorTable        *ct = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, mViewColorTable);
+                               ShapesBitmap            *newbmp = new ShapesBitmap(img, ct);
+                               
+                               // automagically initialize bitmap flags
+                               if (((ShapesDocument*)GetDocument())->CollectionType(mSelectedColl, mSelectedVers) == _object_collection ||
+                                       ((ShapesDocument*)GetDocument())->CollectionType(mSelectedColl, mSelectedVers) == _scenery_collection) {
+                                       // compress weapons, monsters and scenery
+                                       newbmp->SetBytesPerRow(-1);
+                               } else if (((ShapesDocument*)GetDocument())->CollectionType(mSelectedColl, mSelectedVers) == _interface_collection) {
+                                       // interface elements are row-ordered (not so important with A1 actually)
+                                       newbmp->SetColumnOrdered(false);
+                               }
+                               ((ShapesDocument*)GetDocument())->InsertBitmap(newbmp, mSelectedColl, mSelectedVers);
+                               
+                               // update the GUI
+                               unsigned int    bitmap_count = ((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers);
+                               ShapesBitmap    *pnewbitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, bitmap_count-1);
+                               wxString                count_string = wxString::Format(wxT("%u bitmap"), bitmap_count);
+                               
+                               bb->AddBitmap(pnewbitmap);
+                               fb->AddBitmap(pnewbitmap);
+                               if (bitmap_count != 1)
+                                       count_string << wxT("s");
+                               b_count_label->SetLabel(count_string);
+                               
+                               wxEndBusyCursor();
+                               ((ShapesDocument*)GetDocument())->Modify(true);
+                       } else {
+                               wxString        errormsg;
+                               
+                               errormsg << wxT("Sorry, could not load bitmap from ") << filename << wxT(".");
+                               wxMessageBox(errormsg, wxT("Error adding bitmap"), wxOK | wxICON_ERROR, mFrame);
+                       }
+               }
+               dlg->Destroy();
+       }
+}
+
+// export selected bitmap to a BMP file
+void ShapesView::MenuShapesExportBitmap(wxCommandEvent &e)
+{
+       if (((ShapesDocument*)GetDocument()) != NULL && mSelectedColl != -1 && mSelectedVers != -1) {
+               int selection = bb->GetSelection();
+               
+               if (selection >= 0) {
+                       wxString        prompt = wxString::Format(wxT("Export bitmap %d"), selection),
+                       name = wxString::Format(wxT("bitmap%.3d.bmp"), selection),
+                       path = wxFileSelector(prompt, wxT(""), name, wxT(""), wxT("BMP image|*.bmp"), wxSAVE | wxOVERWRITE_PROMPT);
+                       
+                       if (!path.empty()) {
+                               ShapesBitmap            *bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, selection);
+                               ShapesColorTable        *colorTable = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, mViewColorTable);
+                               
+                               bitmap->SaveToBMP(path, colorTable);
+                       }
+               }
+       }
+}
+
+void ShapesView::MenuShapesExportBitmapMask(wxCommandEvent &e)
+{
+       if (((ShapesDocument*)GetDocument()) != NULL && mSelectedColl != -1 && mSelectedVers != -1) {
+               int selection = bb->GetSelection();
+               
+               if (selection >= 0) {
+                       wxString        prompt = wxString::Format(wxT("Export bitmap %d mask"), selection),
+                       name = wxString::Format(wxT("bitmap%.3dmask.bmp"), selection),
+                       path = wxFileSelector(prompt, wxT(""), name, wxT(""), wxT("BMP image|*.bmp"), wxSAVE | wxOVERWRITE_PROMPT);
+                       
+                       if (!path.empty()) {
+                               ShapesBitmap    *bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, selection);
+                               
+                               bitmap->SaveMaskToBMP(path);
+                       }
+               }
+       }
+}
+
+// export all bitmaps of the selected collection to separate BMP files in a folder
+void ShapesView::MenuShapesExportBitmaps(wxCommandEvent &e)
+{
+       if (((ShapesDocument*)GetDocument()) != NULL && mSelectedColl != -1 && mSelectedVers != -1) {
+               wxString        dirPath = wxDirSelector(wxT("Select destination folder"));
+               
+               if (!dirPath.empty()) {
+                       ShapesColorTable        *colorTable = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, mViewColorTable);
+                       
+                       wxBeginBusyCursor();
+                       for (unsigned int i = 0; i < ((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers); i++) {
+                               wxString                name = wxString::Format(wxT("bitmap%.3d.bmp"), i);
+                               ShapesBitmap    *bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, i);
+                               
+                               bitmap->SaveToBMP(dirPath + wxT("/") + name, colorTable);
+                       }
+                       wxEndBusyCursor();
+               }
+       }
+}
+
+void ShapesView::MenuShapesExportBitmapMasks(wxCommandEvent &e)
+{
+       if (((ShapesDocument*)GetDocument()) != NULL && mSelectedColl != -1 && mSelectedVers != -1) {
+               wxString        dirPath = wxDirSelector(wxT("Select destination folder"));
+               
+               if (!dirPath.empty()) {
+                       wxBeginBusyCursor();
+                       for (unsigned int i = 0; i < ((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers); i++) {
+                               wxString                name = wxString::Format(wxT("bitmap%.3dmask.bmp"), i);
+                               ShapesBitmap    *bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, i);
+                               
+                               bitmap->SaveMaskToBMP(dirPath + wxT("/") + name);
+                       }
+                       wxEndBusyCursor();
+               }
+       }
+}
+
+void ShapesView::MenuShapesNewFrame(wxCommandEvent &e)
+{
+       if (((ShapesDocument*)GetDocument()) != NULL && mSelectedColl != -1 && mSelectedVers != -1) {
+               // append an empty frame
+               ShapesFrame     *newframe = new ShapesFrame();
+               
+               newframe->SetScaleFactor(((ShapesDocument*)GetDocument())->CollectionScaleFactor(mSelectedColl, mSelectedVers));
+               if (((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers) > ((ShapesDocument*)GetDocument())->CollectionFrameCount(mSelectedColl, mSelectedVers)) {
+                       newframe->SetBitmapIndex(((ShapesDocument*)GetDocument())->CollectionFrameCount(mSelectedColl, mSelectedVers));
+               }
+               ((ShapesDocument*)GetDocument())->InsertFrame(newframe, mSelectedColl, mSelectedVers);
+               fb->AddFrame(((ShapesDocument*)GetDocument())->GetFrame(mSelectedColl, mSelectedVers, ((ShapesDocument*)GetDocument())->CollectionFrameCount(mSelectedColl, mSelectedVers)-1));
+               // update frame count label
+               unsigned int    frame_count = ((ShapesDocument*)GetDocument())->CollectionFrameCount(mSelectedColl, mSelectedVers);
+               wxString                count_string = wxString::Format(wxT("%u frame"), frame_count);
+               
+               if (frame_count != 1)
+                       count_string << wxT("s");
+               f_count_label->SetLabel(count_string);
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+void ShapesView::MenuShapesNewSequence(wxCommandEvent &e)
+{
+       if (((ShapesDocument*)GetDocument()) != NULL && mSelectedColl != -1 && mSelectedVers != -1) {
+               // append an empty sequence
+               ShapesSequence          *newseq = new ShapesSequence();
+               
+               ((ShapesDocument*)GetDocument())->InsertSequence(newseq, mSelectedColl, mSelectedVers);
+               
+               // insert the new entry in the main tree
+               wxTreeItemId    thenode = GetSequencesTreeItem(mSelectedColl, mSelectedVers);
+               int                             seq_id = ((ShapesDocument*)GetDocument())->CollectionSequenceCount(mSelectedColl, mSelectedVers) - 1;
+               ShapesSequence     *seq = ((ShapesDocument*)GetDocument())->GetSequence(mSelectedColl, mSelectedVers, seq_id);
+               ShapesTreeItemData  *itemdata = new ShapesTreeItemData(mSelectedColl, mSelectedVers, TREESECTION_SEQUENCES, seq_id);
+               wxString                label;
+               
+               label << seq_id;
+               if (seq->Name().Length() > 0)
+                       label << wxT(" - ") << seq->Name();
+               colltree->AppendItem(thenode, label, -1, -1, itemdata);
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+void ShapesView::MenuShapesGeneratePatch(wxCommandEvent&)
+{
+       ShapesDocument* document = (ShapesDocument*) GetDocument();
+       
+       if (document == NULL) {
+               return;
+       }
+       
+       // prompt the user for a base for the patch
+       wxFileDialog dlg(mFrame, wxT("Choose a base file (e.g. standard Infinity shapes)"), wxT(""), wxT(""), wxT("Shapes files (*.shpA)|*.shpA|All files (*.*)|*.*"), wxOPEN);
+       if (dlg.ShowModal() != wxID_OK) {
+               return;
+       }
+       
+       ShapesDocument base;
+       if (!base.DoOpenDocument(dlg.GetPath())) {
+               return;
+       }
+       
+       // prompt the user for a patch location
+       wxString path = wxFileSelector(wxT("Export patch file"), wxT(""), wxT("Shapes Patch.ShPa"), wxT(""), wxT("Shapes patch|*.ShPa"), wxSAVE | wxOVERWRITE_PROMPT);
+       
+       if (path.empty()) {
+               return;
+       }
+       
+#if wxUSE_STD_IOSTREAM
+       wxSTD ofstream stream(path.mb_str(), wxSTD ios_base::out | wxSTD ios_base::binary | wxSTD ios_base::trunc);
+#else
+       wxFileOutputStream stream(path);
+       if (!stream.IsOk()) {
+               return;
+       }
+#endif
+       document->SavePatch(stream, base);
+}
+
+void ShapesView::MenuShapesImportPatch(wxCommandEvent&)
+{
+       ShapesDocument* document = (ShapesDocument*) GetDocument();
+
+       if (document == NULL) {
+               return;
+       }
+
+       // prompt the user for a patch
+       wxString  path = wxFileSelector(wxT("Choose a patch file"), wxT(""), wxT(""), wxT(""), wxT("Patch files (*.ShPa)|*.ShPa|All files (*.*)|*.*"), wxOPEN);
+
+       if (path.empty()) {
+               return;
+       }
+
+#if wxUSE_STD_IOSTREAM
+       wxSTD ifstream stream(path.mb_str(), wxSTD ios_base::in | wxSTD ios_base::binary);
+#else
+       wxFileInputStream stream(path);
+       if (!stream.IsOk()) {
+               return;
+       }
+#endif
+
+       if (!document->LoadPatch(stream)) {
+               wxMessageBox(wxT("Error loading shapes patch; the patch may be partially applied!"), wxT("Error loading shapes patch"), wxOK | wxICON_ERROR, mFrame);
+       }
+
+       colltree->Unselect();
+       colltree->CollapseAll();
+       mSelectedColl = -1;
+       mSelectedVers = -1;
+       mSelectedSequence = -1;
+       mViewColorTable = -1;
+       mainbox->Show(dummy_sizer, true);
+       mainbox->Show(coll_sizer, false);
+       mainbox->Show(chunk_sizer, false);
+       mainbox->Show(b_outer_sizer, false);
+       mainbox->Show(ct_outer_sizer, false);
+       mainbox->Show(f_outer_sizer, false);
+       mainbox->Show(s_outer_sizer, false);
+}
+
+// user selected a tree entry
+void ShapesView::OnTreeSelect(wxTreeEvent &e)
+{
+       ShapesTreeItemData      *data = dynamic_cast<ShapesTreeItemData *>(colltree->GetItemData(e.GetItem()));
+       
+       if (data) {
+               int     new_coll = data->CollID(),
+               new_vers = data->Version(),
+               new_section = data->Section();
+               
+               if (new_coll != mSelectedColl || new_vers != mSelectedVers) {
+                       // user has moved to another collection/version
+                       
+                       // first clear the user interface
+                       wxMenu                  *colortables_submenu;
+                       menubar->FindItem(VIEW_MENU_COLORTABLE_0, &colortables_submenu);
+                       unsigned int    ctmenucount = colortables_submenu->GetMenuItemCount();
+                       
+                       mViewColorTable = -1;
+                       ctb->Clear();
+                       ct_view->SetColorTable(NULL);
+                       bb->Freeze();
+                       bb->Clear();
+                       b_view->SetBitmap(NULL);
+                       fb->Freeze();
+                       fb->Clear();
+                       f_view->SetFrame(NULL);
+                       f_view->SetBitmap(NULL);
+                       s_fb->Clear();
+                       for (unsigned int i = 0; i < ctmenucount; i++)
+                               menubar->Enable(VIEW_MENU_COLORTABLE_0 + i, false);
+                       menubar->Enable(SHAPES_MENU_SAVECOLORTABLE, false);
+                       menubar->Enable(SHAPES_MENU_SAVECOLORTABLETOPS, false);
+                       menubar->Enable(SHAPES_MENU_EXPORTBITMAP, false);
+                       menubar->Enable(SHAPES_MENU_EXPORTMASK, false);
+                       
+                       // set collection info panel
+                       coll_static_box->SetLabel(wxString::Format(wxT("Global info for collection %d"), new_coll));
+                       
+                       wxString        collinfo_s;
+                       collinfo_s << wxT("Status: ") << ((ShapesDocument*)GetDocument())->CollectionStatus(new_coll) << wxT("\n");
+                       collinfo_s << wxT("Flags: ") << ((ShapesDocument*)GetDocument())->CollectionFlags(new_coll) << wxT("\n\n");
+                       if (((ShapesDocument*)GetDocument())->CollectionDefined(new_coll, COLL_VERSION_8BIT))
+                               collinfo_s << wxT("8-bit color version present\n");
+                       else
+                               collinfo_s << wxT("No 8-bit color version\n");
+                       if (((ShapesDocument*)GetDocument())->CollectionDefined(new_coll, COLL_VERSION_TRUECOLOR))
+                               collinfo_s << wxT("True color version present");
+                       else
+                               collinfo_s << wxT("No true color version");
+                       coll_text->SetLabel(collinfo_s);
+                       
+                       if (new_coll != -1 && new_vers != -1) {
+                               if (new_vers == COLL_VERSION_TRUECOLOR)
+                                       chunk_static_box->SetLabel(wxT("Shapes for true color and OpenGL display"));
+                               else
+                                       chunk_static_box->SetLabel(wxT("Shapes for 8-bit color display"));
+                               
+                               if (((ShapesDocument*)GetDocument())->CollectionDefined(new_coll, new_vers)) {
+                                       // a defined collection has been selected
+                                       unsigned int    ct_count = ((ShapesDocument*)GetDocument())->CollectionColorTableCount(new_coll, new_vers),
+                                       bitmap_count = ((ShapesDocument*)GetDocument())->CollectionBitmapCount(new_coll, new_vers),
+                                       frame_count = ((ShapesDocument*)GetDocument())->CollectionFrameCount(new_coll, new_vers);
+                                       wxString                count_string;
+                                       
+                                       wxBeginBusyCursor();
+                                       menubar->Enable(SHAPES_MENU_ADDCOLORTABLE, true);
+                                       menubar->Enable(SHAPES_MENU_ADDBITMAP, true);
+                                       menubar->Enable(SHAPES_MENU_EXPORTBITMAPS, true);
+                                       menubar->Enable(SHAPES_MENU_EXPORTMASKS, true);
+                                       menubar->Enable(SHAPES_MENU_ADDFRAME, true);
+                                       menubar->Enable(SHAPES_MENU_ADDSEQUENCE, true);
+                                       
+                                       // chunk info panel
+                                       chunk_version_field->ChangeValue(INT_TO_WXSTRING(((ShapesDocument*)GetDocument())->CollectionVersion(new_coll, new_vers)));
+                                       chunk_type_menu->SetSelection(((ShapesDocument*)GetDocument())->CollectionType(new_coll, new_vers));
+                                       chunk_flags_field->ChangeValue(INT_TO_WXSTRING(((ShapesDocument*)GetDocument())->CollectionFlags(new_coll, new_vers)));
+                                       chunk_sf_field->ChangeValue(INT_TO_WXSTRING(((ShapesDocument*)GetDocument())->CollectionScaleFactor(new_coll, new_vers)));
+                                       
+                                       // color tables
+                                       mViewColorTable = 0;
+                                       for (unsigned int i = 0; i < ct_count; i++)
+                                               ctb->AddColorTable(((ShapesDocument*)GetDocument())->GetColorTable(new_coll, new_vers, i));
+                                       for (unsigned int i = 0; i < ctmenucount; i++)
+                                               menubar->Enable(VIEW_MENU_COLORTABLE_0 + i, i < ct_count);
+                                       if (ct_count > 0)
+                                               menubar->Check(VIEW_MENU_COLORTABLE_0, true);
+                                       count_string << ct_count << wxT(" color table");
+                                       if (ct_count != 1)
+                                               count_string << wxT("s");
+                                       if (ct_count > 0)
+                                               count_string << wxT(", ") << ((ShapesDocument*)GetDocument())->GetColorTable(new_coll, new_vers, 0)->ColorCount() << wxT(" colors per table");
+                                       ct_count_label->SetLabel(count_string);
+                                       
+                                       // bitmaps
+                                       bb->SetColorTable(((ShapesDocument*)GetDocument())->GetColorTable(new_coll, new_vers, 0));
+                                       b_view->SetColorTable(((ShapesDocument*)GetDocument())->GetColorTable(new_coll, new_vers, 0));
+                                       for (unsigned int i = 0; i < bitmap_count; i++)
+                                               bb->AddBitmap(((ShapesDocument*)GetDocument())->GetBitmap(new_coll, new_vers, i));
+                                       count_string.Clear();
+                                       count_string << bitmap_count << wxT(" bitmap");
+                                       if (bitmap_count != 1)
+                                               count_string << wxT("s");
+                                       b_count_label->SetLabel(count_string);
+                                       
+                                       // frames
+                                       fb->SetColorTable(((ShapesDocument*)GetDocument())->GetColorTable(new_coll, new_vers, 0));
+                                       f_view->SetColorTable(((ShapesDocument*)GetDocument())->GetColorTable(new_coll, new_vers, 0));
+                                       for (unsigned int i = 0; i < bitmap_count; i++)
+                                               fb->AddBitmap(((ShapesDocument*)GetDocument())->GetBitmap(new_coll, new_vers, i));
+                                       for (unsigned int i = 0; i < frame_count; i++)
+                                               fb->AddFrame(((ShapesDocument*)GetDocument())->GetFrame(new_coll, new_vers, i));
+                                       count_string.Clear();
+                                       count_string << frame_count << wxT(" frame");
+                                       if (frame_count != 1)
+                                               count_string << wxT("s");
+                                       f_count_label->SetLabel(count_string);
+                                       
+                                       wxEndBusyCursor();
+                               } else {
+                                       menubar->Enable(SHAPES_MENU_ADDCOLORTABLE, false);
+                                       menubar->Enable(SHAPES_MENU_ADDBITMAP, false);
+                                       menubar->Enable(SHAPES_MENU_EXPORTBITMAPS, false);
+                                       menubar->Enable(SHAPES_MENU_EXPORTMASKS, false);
+                                       menubar->Enable(SHAPES_MENU_ADDFRAME, false);
+                                       menubar->Enable(SHAPES_MENU_ADDSEQUENCE, false);
+                               }
+                       } else {
+                               menubar->Enable(SHAPES_MENU_ADDCOLORTABLE, false);
+                               menubar->Enable(SHAPES_MENU_ADDBITMAP, false);
+                               menubar->Enable(SHAPES_MENU_EXPORTBITMAPS, false);
+                               menubar->Enable(SHAPES_MENU_EXPORTMASKS, false);
+                               menubar->Enable(SHAPES_MENU_ADDFRAME, false);
+                               menubar->Enable(SHAPES_MENU_ADDSEQUENCE, false);
+                       }
+                       mSelectedColl = new_coll;
+                       mSelectedVers = new_vers;
+                       bb->Thaw();
+                       fb->Thaw();
+               }
+               
+               // handle sequence selection
+               mSelectedSequence = data->Sequence();
+               if (mSelectedSequence > -1) {
+                       ShapesSequence *seq = ((ShapesDocument*)GetDocument())->GetSequence(new_coll, new_vers, mSelectedSequence);
+                       
+                       // setup sequence panel controls
+                       s_outer_static_box->SetLabel(wxString::Format(wxT("Sequence %d of %u"),
+                                                                                                                 mSelectedSequence, ((ShapesDocument*)GetDocument())->CollectionSequenceCount(new_coll, new_vers)));
+                       s_name_field->ChangeValue(seq->Name());
+                       switch (seq->NumberOfViews()) {
+                               case UNANIMATED:        s_type_menu->SetSelection(0);   break;
+                               case ANIMATED_1:        s_type_menu->SetSelection(1);   break;
+                               case ANIMATED_3TO4:     s_type_menu->SetSelection(2);   break;
+                               case ANIMATED_4:        s_type_menu->SetSelection(2);   break;
+                               case ANIMATED_3TO5:     s_type_menu->SetSelection(3);   break;
+                               case ANIMATED_5:        s_type_menu->SetSelection(3);   break;
+                               case ANIMATED_2TO8:     s_type_menu->SetSelection(4);   break;
+                               case ANIMATED_5TO8:     s_type_menu->SetSelection(4);   break;
+                               case ANIMATED_8:        s_type_menu->SetSelection(4);   break;
+                               default:
+                                       s_type_menu->SetSelection(0);
+                                       wxMessageBox(wxString::Format(wxT("This sequence has an unknown type %d, and ShapeFusion can not handle it. Something strange may happen now!"), seq->NumberOfViews()),
+                                                                wxT("Warning"), wxOK | wxICON_ERROR, mFrame);
+                                       break;
+                       }
+                       s_fpv_field->ChangeValue(INT_TO_WXSTRING(seq->FramesPerView()));
+                       s_tpf_field->ChangeValue(INT_TO_WXSTRING(seq->TicksPerFrame()));
+                       s_lf_field->ChangeValue(INT_TO_WXSTRING(seq->LoopFrame()));
+                       s_kf_field->ChangeValue(INT_TO_WXSTRING(seq->KeyFrame()));
+                       s_xfermode_menu->SetSelection(seq->TransferMode());
+                       s_xferperiod_field->ChangeValue(INT_TO_WXSTRING(seq->TransferModePeriod()));
+                       s_ffs_field->ChangeValue(INT_TO_WXSTRING(seq->FirstFrameSound()));
+                       s_kfs_field->ChangeValue(INT_TO_WXSTRING(seq->KeyFrameSound()));
+                       s_lfs_field->ChangeValue(INT_TO_WXSTRING(seq->LastFrameSound()));
+                       // setup the sequence view
+                       wxBeginBusyCursor();
+                       s_fb->Freeze();
+                       s_fb->Clear();
+                       s_fb->SetColorTable(((ShapesDocument*)GetDocument())->GetColorTable(new_coll, new_vers, mViewColorTable));
+                       for (unsigned int i = 0; i < ((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers); i++)
+                               s_fb->AddBitmap(((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, i));
+                       for (unsigned int i = 0; i < ((ShapesDocument*)GetDocument())->CollectionFrameCount(mSelectedColl, mSelectedVers); i++)
+                               s_fb->AddFrame(((ShapesDocument*)GetDocument())->GetFrame(mSelectedColl, mSelectedVers, i));
+                       s_fb->SetSeqParameters(seq->NumberOfViews(), seq->FramesPerView(), &seq->mFrameIndexes, this);
+                       s_fb->Thaw();
+                       wxEndBusyCursor();
+               }
+
+               menubar->SetLabel(EDIT_MENU_DELETE, _("Delete"));
+               menubar->Enable(EDIT_MENU_COPY, false);
+               menubar->Enable(EDIT_MENU_DELETE, false);
+               menubar->Enable(EDIT_MENU_PASTE, false);
+               
+               // handle section selection: show/hide editing panels
+               mainbox->Show(dummy_sizer, false);
+               mainbox->Show(coll_sizer, false);
+               mainbox->Show(chunk_sizer, false);
+               mainbox->Show(b_outer_sizer, false);
+               mainbox->Show(ct_outer_sizer, false);
+               mainbox->Show(f_outer_sizer, false);
+               mainbox->Show(s_outer_sizer, false);
+               switch (new_section) {
+                       case TREESECTION_COLLECTION:
+                               mainbox->Show(coll_sizer, true);
+                               break;
+                       case TREESECTION_VERSION:
+                               mainbox->Show(chunk_sizer, true);
+                               chunk_inner_box->Show(chunk_undef_label, !((ShapesDocument*)GetDocument())->CollectionDefined(mSelectedColl, mSelectedVers));
+                               chunk_inner_box->Show(chunk_grid, ((ShapesDocument*)GetDocument())->CollectionDefined(mSelectedColl, mSelectedVers));
+
+                               menubar->Enable(EDIT_MENU_COPY, true);
+                               menubar->Enable(EDIT_MENU_PASTE, true);
+                               break;
+                       case TREESECTION_BITMAPS:
+                               mainbox->Show(b_outer_sizer, true);
+                               b_outer_sizer->Show(b_edit_box, bb->GetSelection() != -1);
+                               b_outer_sizer->Show(b_count_label, bb->GetSelection() == -1);
+                               break;
+                       case TREESECTION_COLORTABLES:
+                               mainbox->Show(ct_outer_sizer, true);
+                               ct_outer_sizer->Show(ct_edit_box, ctb->GetSelection() != -1);
+                               ct_outer_sizer->Show(ct_count_label, ctb->GetSelection() == -1);
+                               break;
+                       case TREESECTION_FRAMES:
+                               mainbox->Show(f_outer_sizer, true);
+                               f_outer_sizer->Show(f_edit_box, fb->GetSelection() != -1);
+                               f_outer_sizer->Show(f_count_label, fb->GetSelection() == -1);
+                               break;
+                       case TREESECTION_SEQUENCES:
+                               menubar->SetLabel(EDIT_MENU_DELETE, _("Delete sequence"));
+                               if (mSelectedSequence > -1) {
+                                       mainbox->Show(s_outer_sizer, true);
+                                       menubar->Enable(EDIT_MENU_DELETE, true);
+                               } else {
+                                       mainbox->Show(dummy_sizer, true);
+                               }
+                               break;
+               }
+               mainbox->Layout();
+       }
+}
+
+// selection event in the bitmap browser
+void ShapesView::OnBitmapSelect(wxCommandEvent &e)
+{
+       int     selection = e.GetInt();
+       
+       if (selection < 0) {
+               // deselection
+               b_view->SetBitmap(NULL);
+               b_outer_sizer->Show(b_count_label, true);
+               b_outer_sizer->Show(b_edit_box, false);
+               menubar->SetLabel(EDIT_MENU_DELETE, wxT("Delete"));
+               menubar->Enable(EDIT_MENU_COPY, false);
+               menubar->Enable(EDIT_MENU_DELETE, false);
+               menubar->Enable(EDIT_MENU_PASTE, false);
+               menubar->Enable(SHAPES_MENU_EXPORTBITMAP, false);
+               menubar->Enable(SHAPES_MENU_EXPORTMASK, false);
+       } else {
+               ShapesBitmap    *sel_bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, selection);
+               
+               // set labels
+               wxString        info_label = wxString::Format(wxT("%dx%d pixels, "), sel_bitmap->Width(), sel_bitmap->Height());
+               
+               if (sel_bitmap->BytesPerRow() > 0)
+                       info_label << wxT("plain encoding");
+               else
+                       info_label << wxT("RLE");
+               b_info_label->SetLabel(info_label);
+               b_edit_static_box->SetLabel(wxString::Format(wxT("Bitmap %d of %d"),
+                                                                                                        selection, ((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers)));
+               // set flag check boxes
+               b_order_checkbox->SetValue(sel_bitmap->IsColumnOrdered());
+               b_transparency_checkbox->SetValue(sel_bitmap->IsTransparent());
+               // set bitmap view
+               b_view->SetBitmap(sel_bitmap);
+               b_outer_sizer->Show(b_count_label, false);
+               b_outer_sizer->Show(b_edit_box, true);
+               menubar->SetLabel(EDIT_MENU_DELETE, wxT("Delete bitmap"));
+               menubar->Enable(EDIT_MENU_COPY, true);
+               menubar->Enable(EDIT_MENU_DELETE, true);
+               menubar->Enable(EDIT_MENU_PASTE, true);
+               menubar->Enable(SHAPES_MENU_EXPORTBITMAP, true);
+               menubar->Enable(SHAPES_MENU_EXPORTMASK, true);
+       }
+       b_outer_sizer->Layout();
+}
+
+// handle a delete event from the bitmap browser
+void ShapesView::BitmapDelete(wxCommandEvent &e)
+{
+       DoDeleteBitmap(e.GetSelection());
+}
+
+void ShapesView::DoCopyBitmap(int which)
+{
+       ShapesBitmap* bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, which);
+       ShapesColorTable* colorTable = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, mViewColorTable);
+       
+       bitmap->ClipboardCopy(colorTable);
+}
+
+void ShapesView::DoDeleteColorTable(int which)
+{
+       if (which >= 0) {
+               // first do like a color table deselection
+               ct_view->SetColorTable(NULL);
+               ct_outer_sizer->Show(ct_count_label, true);
+               ct_outer_sizer->Show(ct_edit_box, false);
+               menubar->Enable(SHAPES_MENU_SAVECOLORTABLE, false);
+               menubar->Enable(SHAPES_MENU_SAVECOLORTABLETOPS, false);
+               menubar->SetLabel(EDIT_MENU_DELETE, wxT("Delete"));
+               menubar->Enable(EDIT_MENU_COPY, false);
+               menubar->Enable(EDIT_MENU_DELETE, false);
+               menubar->Enable(EDIT_MENU_PASTE, false);
+               ctb->Freeze();
+               ctb->Clear();
+               // delete
+               ((ShapesDocument*)GetDocument())->DeleteColorTable(mSelectedColl, mSelectedVers, which);
+               // update the view color table
+               if (mViewColorTable == which) {
+                       mViewColorTable = 0;
+                       ShapesColorTable        *ctp = ((ShapesDocument*)GetDocument())->GetColorTable(
+                                                                                                                                                                          mSelectedColl, mSelectedVers, mViewColorTable);
+                       
+                       wxBeginBusyCursor();
+                       bb->SetColorTable(ctp);
+                       b_view->SetColorTable(ctp);
+                       fb->SetColorTable(ctp);
+                       f_view->SetColorTable(ctp);
+                       s_fb->SetColorTable(ctp);
+                       wxEndBusyCursor();
+               } else if (mViewColorTable > which) {
+                       mViewColorTable = mViewColorTable - 1;
+                       ShapesColorTable    *ctp = ((ShapesDocument*)GetDocument())->GetColorTable(
+                                                                                                                                                                          mSelectedColl, mSelectedVers, mViewColorTable);
+                       
+                       wxBeginBusyCursor();
+                       bb->SetColorTable(ctp);
+                       b_view->SetColorTable(ctp);
+                       fb->SetColorTable(ctp);
+                       f_view->SetColorTable(ctp);
+                       s_fb->SetColorTable(ctp);
+                       wxEndBusyCursor();
+               }
+               // reset other gui elements
+               unsigned int    colorTableCount = ((ShapesDocument*)GetDocument())->CollectionColorTableCount(
+                                                                                                                                                                                                         mSelectedColl, mSelectedVers);
+               
+               for (unsigned int i = 0; i < colorTableCount; i++)
+                       ctb->AddColorTable(((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, i));
+               ctb->Thaw();
+               wxMenu  *colortables_submenu;
+               menubar->FindItem(VIEW_MENU_COLORTABLE_0, &colortables_submenu);
+               for (unsigned int i = 0; i < colortables_submenu->GetMenuItemCount(); i++) {
+                       menubar->Enable(VIEW_MENU_COLORTABLE_0 + i, i < colorTableCount);
+                       menubar->Check(VIEW_MENU_COLORTABLE_0 + mViewColorTable, i == (unsigned int)mViewColorTable);
+               }
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+void ShapesView::DoDeleteBitmap(int which)
+{
+       if (which >= 0) {
+               // fist make sure no GUI element references that bitmap anymore
+               bb->Freeze();
+               bb->Clear();                            // FIXME just remove that bitmap
+               fb->Freeze();
+               fb->ClearBitmaps();                     // FIXME just remove that bitmap
+               b_outer_sizer->Show(b_count_label, true);
+               b_outer_sizer->Show(b_edit_box, false);
+               b_view->SetBitmap(NULL);
+               // delete
+               ((ShapesDocument*)GetDocument())->DeleteBitmap(mSelectedColl, mSelectedVers, which);
+               // update the GUI
+               unsigned int    bitmap_count = ((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers);
+               
+               for (unsigned int i = 0; i < bitmap_count; i++) {
+                       ShapesBitmap    *bmp = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, i);
+                       
+                       bb->AddBitmap(bmp);
+                       fb->AddBitmap(bmp);
+               }
+               bb->Thaw();
+               fb->RebuildThumbnails();        // FIXME just rebuild dirty frames
+               fb->Thaw();
+               
+               wxString        count_string;
+               
+               count_string << bitmap_count << wxT(" bitmap");
+               if (bitmap_count != 1)
+                       count_string << wxT("s");
+               b_count_label->SetLabel(count_string);
+               mFrame->Layout();
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+void ShapesView::DoDeleteFrame(int which)
+{
+       if (which >= 0) {
+               // first make sure no GUI element references that frame anymore
+               fb->Freeze();
+               fb->Clear();    // FIXME just remove THAT frame
+               f_outer_sizer->Show(f_count_label, true);
+               f_outer_sizer->Show(f_edit_box, false);
+               f_view->SetFrame(NULL);
+               // delete
+               ((ShapesDocument*)GetDocument())->DeleteFrame(mSelectedColl, mSelectedVers, which);
+               
+               unsigned int    frame_count = ((ShapesDocument*)GetDocument())->CollectionFrameCount(mSelectedColl, mSelectedVers),
+               bitmap_count = ((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers);
+               
+               for (unsigned int i = 0; i < bitmap_count; i++)
+                       fb->AddBitmap(((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, i));
+               for (unsigned int i = 0; i < frame_count; i++)
+                       fb->AddFrame(((ShapesDocument*)GetDocument())->GetFrame(mSelectedColl, mSelectedVers, i));
+               fb->Thaw();
+               
+               wxString        count_string;
+               
+               count_string << frame_count << wxT(" frame");
+               if (frame_count != 1)
+                       count_string << wxT("s");
+               f_count_label->SetLabel(count_string);
+               mFrame->Layout();
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+void ShapesView::DoPasteBitmap(int which)
+{
+       ShapesBitmap* bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, which);
+       ShapesColorTable* colorTable = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, mViewColorTable);
+       
+       wxBeginBusyCursor();
+       bitmap->ClipboardPaste(colorTable);
+       
+       // automagically initialize bitmap flags
+       if (((ShapesDocument*)GetDocument())->CollectionType(mSelectedColl, mSelectedVers) == _object_collection ||
+           ((ShapesDocument*)GetDocument())->CollectionType(mSelectedColl, mSelectedVers) == _scenery_collection) {
+               // compress weapons, monsters and scenery
+               bitmap->SetBytesPerRow(-1);
+       } else if (((ShapesDocument*)GetDocument())->CollectionType(mSelectedColl, mSelectedVers) == _interface_collection) {
+               // interface elements are row-ordered (not so important with A1 actually)
+               bitmap->SetColumnOrdered(false);
+       }
+       
+       ((ShapesDocument*)GetDocument())->Modify(true);
+       bb->RebuildThumbnail(bb->GetSelection());
+       bb->Refresh();
+       b_view->SetBitmap(bitmap);
+       fb->Freeze();
+       fb->RebuildThumbnails();
+       fb->Thaw();
+       wxEndBusyCursor();
+}
+
+void ShapesView::DoCopyChunk(unsigned int coll, unsigned int chunk)
+{
+       ShapesChunk* c = ((ShapesDocument*)GetDocument())->GetChunk(coll, chunk);
+       if (c) {
+               c->ClipboardCopy();
+       }
+}
+
+void ShapesView::DoPasteChunk(unsigned int coll, unsigned int chunk)
+{
+       ShapesChunk* c = ((ShapesDocument*)GetDocument())->GetChunk(coll, chunk);
+       if (c) {
+               c->ClipboardPaste();
+               ((ShapesDocument*)GetDocument())->Modify(true);
+               mSelectedColl = -1;
+               mSelectedVers = -1;
+               mSelectedSequence = -1;
+
+               colltree->DeleteAllItems();
+               OnUpdate(0, 0);
+       }
+}
+       
+void ShapesView::ToggleBitmapCheckboxes(wxCommandEvent &e)
+{
+       ShapesBitmap    *sel_bitmap = b_view->GetBitmap();
+       
+       if (sel_bitmap != NULL) {
+               switch (e.GetId()) {
+                       case CB_COLUMN_ORDER:
+                               sel_bitmap->SetColumnOrdered(e.IsChecked());
+                               ((ShapesDocument*)GetDocument())->Modify(true);
+                               break;
+                       case CB_ENABLE_TRANSPARENCY:
+                               sel_bitmap->SetTransparent(e.IsChecked());
+                               bb->RebuildThumbnail(bb->GetSelection());
+                               bb->Refresh();
+                               b_view->SetBitmap(sel_bitmap);
+                               // FIXME also update the FrameBrowser and all that
+                               ((ShapesDocument*)GetDocument())->Modify(true);
+                               break;
+               }
+       }
+}
+
+// callback for selections in the color table browser
+void ShapesView::OnCTSelect(wxCommandEvent &e)
+{
+       int     selection = e.GetInt();
+       
+       if (selection < 0) {
+               // deselection
+               ct_view->SetColorTable(NULL);
+               ct_outer_sizer->Show(ct_count_label, true);
+               ct_outer_sizer->Show(ct_edit_box, false);
+               menubar->Enable(SHAPES_MENU_SAVECOLORTABLE, false);
+               menubar->Enable(SHAPES_MENU_SAVECOLORTABLETOPS, false);
+               menubar->SetLabel(EDIT_MENU_DELETE, wxT("Delete"));
+               menubar->Enable(EDIT_MENU_COPY, false);
+               menubar->Enable(EDIT_MENU_DELETE, false);
+               menubar->Enable(EDIT_MENU_PASTE, false);
+       } else {
+               // selection
+               ShapesColorTable        *ct = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl, mSelectedVers, selection);
+               
+               ct_view->SetColorTable(ct);
+               ct_edit_static_box->SetLabel(wxString::Format(wxT("Color table %d of %d, %d colors per table"), selection,
+                                                                                                         ((ShapesDocument*)GetDocument())->CollectionColorTableCount(mSelectedColl, mSelectedVers),
+                                                                                                         ct->ColorCount()));
+               ct_outer_sizer->Show(ct_count_label, false);
+               ct_outer_sizer->Show(ct_edit_box, true);
+               menubar->Enable(SHAPES_MENU_SAVECOLORTABLE, true);
+               menubar->Enable(SHAPES_MENU_SAVECOLORTABLETOPS, true);
+               menubar->SetLabel(EDIT_MENU_DELETE, wxT("Delete color table"));
+               // FIXME make sure there is at least one color table for now
+               if (((ShapesDocument*)GetDocument())->CollectionColorTableCount(mSelectedColl, mSelectedVers) > 1)
+                       menubar->Enable(EDIT_MENU_DELETE, true);
+               else
+                       menubar->Enable(EDIT_MENU_DELETE, false);
+               menubar->Enable(EDIT_MENU_COPY, false);
+               menubar->Enable(EDIT_MENU_PASTE, false);
+       }
+       ct_self_lumin_checkbox->Disable();
+       ct_gradient_button->Disable();
+       ct_outer_sizer->Layout();
+}
+
+// callback for color selections in the color table editor
+void ShapesView::CTColorSelect(wxCommandEvent &e)
+{
+       ct_self_lumin_checkbox->Disable();
+       ct_gradient_button->Disable();
+       switch (e.GetInt()) {
+               default:        // more colors selected
+                       ct_gradient_button->Enable();
+               case 1:         // just one color selected
+                       ct_self_lumin_checkbox->Enable();
+                       // set the checkbox value
+               {
+                       ShapesColorTable        *ct = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl,
+                                                                                                                                                                         mSelectedVers, ctb->GetSelection());
+                       vector<bool>            selection = ct_view->GetSelection();
+                       bool                            someAreOn = false,
+                       someAreOff = false;
+                       
+                       for (unsigned int i = 0; i < selection.size(); i++) {
+                               if (selection[i]) {
+                                       if (ct->GetColor(i)->Luminescent())
+                                               someAreOn = true;
+                                       else
+                                               someAreOff = true;
+                               }
+                       }
+                       if (someAreOn && someAreOff)
+                               ct_self_lumin_checkbox->Set3StateValue(wxCHK_UNDETERMINED);
+                       else if (someAreOn && !someAreOff)
+                               ct_self_lumin_checkbox->Set3StateValue(wxCHK_CHECKED);
+                       else
+                               ct_self_lumin_checkbox->Set3StateValue(wxCHK_UNCHECKED);
+               }
+               case 0:         // no colors selected
+                       break;
+       }
+}
+
+// callback for color alteration in the color table editor
+void ShapesView::CTColorChanged(wxCommandEvent &e)
+{
+       ((ShapesDocument*)GetDocument())->Modify(true);
+       ctb->Refresh();
+       // refresh thumbnails if needed
+       if (ctb->GetSelection() == mViewColorTable) {
+               bb->Freeze();
+               bb->RebuildThumbnails();
+               bb->Thaw();
+               fb->Freeze();
+               fb->RebuildThumbnails();
+               fb->Thaw();
+       }
+}
+
+// callback for the "self luminescent color" checkbox
+void ShapesView::ToggleSelfLuminCheckbox(wxCommandEvent &e)
+{
+       ShapesColorTable        *ct = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl,
+                                                                                                                                                         mSelectedVers, ctb->GetSelection());
+       vector<bool>            selection = ct_view->GetSelection();
+       
+       for (unsigned int i = 0; i < selection.size(); i++) {
+               if (selection[i])
+                       ct->GetColor(i)->SetLuminescent(e.IsChecked());
+       }
+       ((ShapesDocument*)GetDocument())->Modify(true);
+       ctb->Refresh();
+       ct_view->Refresh();
+       // TODO invalidate thumbnails if needed
+}
+
+// callback for the "make gradient" button in the color table editor
+void ShapesView::MakeCTGradient(wxCommandEvent &e)
+{
+       vector<bool>    selection = ct_view->GetSelection();
+       int                             firstIndex = -1, lastIndex = -1;
+       
+       // find first and last selected items
+       for (unsigned int i = 0; i < selection.size(); i++) {
+               if (selection[i]) {
+                       if (firstIndex == -1)
+                               firstIndex = i;
+                       lastIndex = i;
+               }
+       }
+       if (firstIndex > -1 && firstIndex < lastIndex) {
+               // linearly interpolate colors in between
+               ShapesColorTable        *ct = ((ShapesDocument*)GetDocument())->GetColorTable(mSelectedColl,
+                                                                                                                                                                 mSelectedVers, ctb->GetSelection());
+               int                                     r1 = ct->GetColor(firstIndex)->Red(),
+               g1 = ct->GetColor(firstIndex)->Green(),
+               b1 = ct->GetColor(firstIndex)->Blue(),
+               r2 = ct->GetColor(lastIndex)->Red(),
+               g2 = ct->GetColor(lastIndex)->Green(),
+               b2 = ct->GetColor(lastIndex)->Blue(),
+               delta = lastIndex - firstIndex;
+               
+               for (int k = firstIndex+1; k < lastIndex; k++) {
+                       ShapesColor     *color = ct->GetColor(k);
+                       
+                       color->SetRed(r1 + (r2-r1)*(k-firstIndex)/delta);
+                       color->SetGreen(g1 + (g2-g1)*(k-firstIndex)/delta);
+                       color->SetBlue(b1 + (b2-b1)*(k-firstIndex)/delta);
+               }
+       }
+       ((ShapesDocument*)GetDocument())->Modify(true);
+       ctb->Refresh();
+       ct_view->Refresh();
+       // refresh thumbnails if needed
+       if (ctb->GetSelection() == mViewColorTable) {
+               bb->Freeze();
+               bb->RebuildThumbnails();
+               bb->Thaw();
+               fb->Freeze();
+               fb->RebuildThumbnails();
+               fb->Thaw();
+       }
+}
+
+// callback for selections in the frame browser
+void ShapesView::OnFrameSelect(wxCommandEvent &e)
+{
+       int selection = e.GetInt();
+       
+       if (selection < 0) {
+               f_view->SetFrame(NULL);
+               f_view->SetBitmap(NULL);
+               f_outer_sizer->Show(f_count_label, true);
+               f_outer_sizer->Show(f_edit_box, false);
+               menubar->SetLabel(EDIT_MENU_DELETE, wxT("Delete"));
+               menubar->Enable(EDIT_MENU_COPY, false);
+               menubar->Enable(EDIT_MENU_DELETE, false);
+               menubar->Enable(EDIT_MENU_PASTE, false);
+       } else {
+               ShapesFrame     *sel_frame = ((ShapesDocument*)GetDocument())->GetFrame(mSelectedColl, mSelectedVers, selection);
+               ShapesBitmap    *assoc_bitmap = NULL;
+               
+               // set labels
+               f_edit_static_box->SetLabel(wxString::Format(wxT("Frame %d of %u"),
+                                                                                                        selection, ((ShapesDocument*)GetDocument())->CollectionFrameCount(mSelectedColl, mSelectedVers)));
+               // set frame view
+               f_view->SetFrame(sel_frame);
+               if (sel_frame->BitmapIndex() >= 0)
+                       assoc_bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, sel_frame->BitmapIndex());
+               f_view->SetBitmap(assoc_bitmap);
+               // set controls
+               f_bitmap_id->SetRange(-1, ((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers) - 1);
+               f_bitmap_id->SetValue(sel_frame->BitmapIndex());
+               f_xmirror_checkbox->SetValue(sel_frame->IsXmirrored());
+               f_ymirror_checkbox->SetValue(sel_frame->IsYmirrored());
+               f_keypoint_checkbox->SetValue(sel_frame->IsKeypointObscured());
+               f_origin_x_field->ChangeValue(INT_TO_WXSTRING(sel_frame->OriginX()));
+               f_origin_y_field->ChangeValue(INT_TO_WXSTRING(sel_frame->OriginY()));
+               f_key_x_field->ChangeValue(INT_TO_WXSTRING(sel_frame->KeyX()));
+               f_key_y_field->ChangeValue(INT_TO_WXSTRING(sel_frame->KeyY()));
+               f_scalefactor_field->ChangeValue(INT_TO_WXSTRING(sel_frame->ScaleFactor()));
+               f_mli_field->ChangeValue(INT_TO_WXSTRING((int)roundf(sel_frame->MinimumLightIntensity() * 100.0)));
+               f_outer_sizer->Show(f_count_label, false);
+               f_outer_sizer->Show(f_edit_box, true);
+               menubar->SetLabel(EDIT_MENU_DELETE, wxT("Delete frame"));
+               menubar->Enable(EDIT_MENU_DELETE, true);
+               menubar->Enable(EDIT_MENU_COPY, false);
+               menubar->Enable(EDIT_MENU_PASTE, false);
+       }
+       f_outer_sizer->Layout();
+}
+
+// handle a delete event from the frame browser
+void ShapesView::FrameDelete(wxCommandEvent &e)
+{
+       DoDeleteFrame(e.GetSelection());
+}
+
+// handle an event from the FrameView: update the values
+// in the fields and mark the document as modified
+void ShapesView::OnFramePointDrag(wxCommandEvent &e)
+{
+       ShapesFrame     *frame = f_view->GetFrame();
+       
+       if (frame != NULL) {
+               f_origin_x_field->ChangeValue(INT_TO_WXSTRING(frame->OriginX()));
+               f_origin_y_field->ChangeValue(INT_TO_WXSTRING(frame->OriginY()));
+               f_key_x_field->ChangeValue(INT_TO_WXSTRING(frame->KeyX()));
+               f_key_y_field->ChangeValue(INT_TO_WXSTRING(frame->KeyY()));
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+// bitmap index change in the frame panel
+void ShapesView::BitmapIndexSpin(wxSpinEvent &e)
+{
+       int                     newid = e.GetPosition();
+       ShapesFrame     *sel_frame = f_view->GetFrame();
+       
+       if (sel_frame != NULL) {
+               sel_frame->SetBitmapIndex(newid);
+               f_view->SetBitmap(((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, newid));
+               f_view->SetFrame(sel_frame);
+               fb->RebuildThumbnail(fb->GetSelection());
+               fb->Refresh();
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+// checkbox toggle in the frame panel
+void ShapesView::ToggleFrameCheckboxes(wxCommandEvent &e)
+{
+       ShapesFrame     *sel_frame = f_view->GetFrame();
+       
+       if (sel_frame != NULL) {
+               switch (e.GetId()) {
+                       case CB_XMIRROR:        sel_frame->SetXmirrored(e.IsChecked());                 break;
+                       case CB_YMIRROR:        sel_frame->SetYmirrored(e.IsChecked());                 break;
+                       case CB_KEYPOINT:       sel_frame->SetKeypointObscured(e.IsChecked());  break;
+               }
+               // update display
+               if (e.GetId() != CB_KEYPOINT) {
+                       fb->RebuildThumbnail(fb->GetSelection());
+                       fb->Refresh();
+                       f_view->SetFrame(sel_frame);
+               }
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+// user messed with fields in the frame panel
+void ShapesView::EditFrameFields(wxCommandEvent &e)
+{
+       ShapesFrame     *sel_frame = f_view->GetFrame();
+       wxString        s = e.GetString();
+       
+       if (sel_frame != NULL) {
+               long    v = 0;
+               
+               if (s.ToLong(&v)) {
+                       bool    recalculate_world_fields = false;
+                       
+                       switch (e.GetId()) {
+                               case FIELD_ORIGIN_X:
+                                       sel_frame->SetOriginX(v);
+                                       recalculate_world_fields = true;
+                                       break;
+                               case FIELD_ORIGIN_Y:
+                                       sel_frame->SetOriginY(v);
+                                       recalculate_world_fields = true;
+                                       break;
+                               case FIELD_KEY_X:
+                                       sel_frame->SetKeyX(v);
+                                       recalculate_world_fields = true;
+                                       break;
+                               case FIELD_KEY_Y:
+                                       sel_frame->SetKeyY(v);
+                                       recalculate_world_fields = true;
+                                       break;
+                               case FIELD_FRAME_SCALEFACTOR:
+                                       sel_frame->SetScaleFactor(v);
+                                       recalculate_world_fields = true;
+                                       break;
+                               case FIELD_MIN_LIGHT_INT:
+                                       if (v > 100) {
+                                               wxBell();
+                                               f_mli_field->ChangeValue(wxT("100"));
+                                               v = 100;
+                                       } else if (v < 0) {
+                                               wxBell();
+                                               f_mli_field->ChangeValue(wxT("0"));
+                                               v = 0;
+                                       }
+                                       sel_frame->SetMinimumLightIntensity(v / 100.0);
+                                       break;
+                       }
+                       // recalculate world_* fields if needed and possible
+                       if (recalculate_world_fields && sel_frame->BitmapIndex() >= 0
+                               && sel_frame->BitmapIndex() < (int)((ShapesDocument*)GetDocument())->CollectionBitmapCount(mSelectedColl, mSelectedVers)) {
+                               ShapesBitmap    *assoc_bitmap = ((ShapesDocument*)GetDocument())->GetBitmap(mSelectedColl, mSelectedVers, sel_frame->BitmapIndex());
+                               int                     w = assoc_bitmap->Width(),
+                               h = assoc_bitmap->Height(),
+                               scale_factor = sel_frame->ScaleFactor();
+                               
+                               sel_frame->SetWorldLeft(-scale_factor * sel_frame->OriginX());
+                               sel_frame->SetWorldTop(scale_factor * sel_frame->OriginY());
+                               sel_frame->SetWorldRight(scale_factor * (w - sel_frame->OriginX()));
+                               sel_frame->SetWorldBottom(-scale_factor * (h - sel_frame->OriginY()));
+                               sel_frame->SetWorldX0(scale_factor * (sel_frame->KeyX() - sel_frame->OriginX()));
+                               sel_frame->SetWorldY0(-scale_factor * (sel_frame->KeyY() - sel_frame->OriginY()));
+                       }
+                       f_view->Refresh();
+                       ((ShapesDocument*)GetDocument())->Modify(true);
+               }
+       }
+}
+
+// callback for "delete sequence" button clicks
+void ShapesView::DeleteSequence(wxCommandEvent &e)
+{
+       // first delete the sequence for real
+       ((ShapesDocument*)GetDocument())->DeleteSequence(mSelectedColl, mSelectedVers, mSelectedSequence);
+       
+       // for updating the tree control we could just delete the selected
+       // sequence item, but then ShapesTreeItemData structures associated
+       // to the following items would be broken and everything would crash.
+       // We could correct them, but reinserting all items is simpler.
+       wxTreeItemId    seqnode = GetSequencesTreeItem(mSelectedColl, mSelectedVers);
+       
+       colltree->SelectItem(seqnode);
+       colltree->DeleteChildren(seqnode);
+       for (unsigned int k = 0; k < ((ShapesDocument*)GetDocument())->CollectionSequenceCount(mSelectedColl, mSelectedVers); k++) {
+               ShapesSequence          *seq = ((ShapesDocument*)GetDocument())->GetSequence(mSelectedColl, mSelectedVers, k);
+               wxString                label;
+               ShapesTreeItemData      *seqdata = new ShapesTreeItemData(mSelectedColl, mSelectedVers, TREESECTION_SEQUENCES, k);
+               
+               label << k;
+               if (seq->Name().Len() > 0)
+                       label << wxT(" - ") << seq->Name();
+               colltree->AppendItem(seqnode, label, -1, -1, seqdata);
+       }
+       
+       mSelectedSequence = -1;
+       ((ShapesDocument*)GetDocument())->Modify(true);
+}
+
+// sequence type menu in the sequence editor
+void ShapesView::EditSequenceType(wxCommandEvent &e)
+{
+       if (mSelectedSequence >= 0) {
+               ShapesSequence  *sel_seq = ((ShapesDocument*)GetDocument())->GetSequence(mSelectedColl, mSelectedVers, mSelectedSequence);
+               int                     real_nov, old_nov;
+               
+               old_nov = ActualNumberOfViews(sel_seq->NumberOfViews());
+               // always use ANIMATED_4, ANIMATED_5, ANIMATED_8
+               // and never other values like ANIMATED_3TO4. Apparently
+               // nobody knows the real meaning of these values
+               switch (s_type_menu->GetSelection()) {
+                       case 0: sel_seq->SetNumberOfViews(UNANIMATED);  break;
+                       case 1: sel_seq->SetNumberOfViews(ANIMATED_1);  break;
+                       case 2: sel_seq->SetNumberOfViews(ANIMATED_4);  break;
+                       case 3: sel_seq->SetNumberOfViews(ANIMATED_5);  break;
+                       case 4: sel_seq->SetNumberOfViews(ANIMATED_8);  break;
+               }
+               real_nov = ActualNumberOfViews(sel_seq->NumberOfViews());
+               
+               // Let's handle sequence frames changes...
+               if (real_nov > old_nov) {
+                       // We are adding one (or more) view
+                       // We need to add FramesPerView() * (real_nov - old_nov)
+                       // to the END of the frame_index array
+                       for (int i = 0; i < sel_seq->FramesPerView() * (real_nov - old_nov); i++)
+                               sel_seq->mFrameIndexes.push_back(-1);
+               } else if (real_nov < old_nov) {
+                       // We are removing one (or more) view
+                       // We need to remove FramesPerView() * (old_nov - real_nov)
+                       // from the END of the frame_index array
+                       for (int i = 0; i < sel_seq->FramesPerView() * (old_nov - real_nov); i++)
+                               sel_seq->mFrameIndexes.pop_back();
+               } else {
+                       // Hmm, number of views unchanged, don't bother...
+               }
+               s_fb->SetSeqParameters(sel_seq->NumberOfViews(), sel_seq->FramesPerView(), &sel_seq->mFrameIndexes, this);
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+// transfer mode menu in the sequence editor
+void ShapesView::EditSequenceXferMode(wxCommandEvent &e)
+{
+       if (mSelectedSequence >= 0) {
+               ShapesSequence  *sel_seq = ((ShapesDocument*)GetDocument())->GetSequence(mSelectedColl, mSelectedVers, mSelectedSequence);
+               
+               sel_seq->SetTransferMode(s_xfermode_menu->GetSelection());
+               ((ShapesDocument*)GetDocument())->Modify(true);
+       }
+}
+
+// user messed with fields in the sequence editor
+void ShapesView::EditSequenceFields(wxCommandEvent &e)
+{
+       if (mSelectedSequence >= 0) {
+               ShapesSequence  *sel_seq = ((ShapesDocument*)GetDocument())->GetSequence(mSelectedColl, mSelectedVers, mSelectedSequence);
+               wxString        s = e.GetString();
+               
+               if (sel_seq != NULL) {
+                       if (e.GetId() == FIELD_SEQ_NAME) {
+                               sel_seq->SetName(s.Left(32));
+                               // update the tree item label
+                               wxTreeItemId            seqnode = GetSequencesTreeItem(mSelectedColl, mSelectedVers);
+                               wxTreeItemIdValue       cookie;
+                               wxTreeItemId            id = colltree->GetFirstChild(seqnode, cookie);
+                               
+                               while (id.IsOk()) {
+                                       ShapesTreeItemData      *itemdata = dynamic_cast<ShapesTreeItemData *>(colltree->GetItemData(id));
+                                       
+                                       if (itemdata->Sequence() == mSelectedSequence) {
+                                               // here we are
+                                               wxString        blabel;
+                                               
+                                               blabel << mSelectedSequence;
+                                               if (sel_seq->Name().Length() > 0)
+                                                       blabel << wxT(" - ") << sel_seq->Name();
+                                               colltree->SetItemText(id, blabel);
+                                               break;
+                                       }
+                                       id = colltree->GetNextChild(seqnode, cookie);
+                               }
+                               ((ShapesDocument*)GetDocument())->Modify(true);
+                       } else {
+                               // numeric fields
+                               long    v;
+                               
+                               if (s.ToLong(&v)) {
+                                       switch (e.GetId()) {
+                                               case FIELD_SEQ_FRAMES_PER_VIEW:
+                                                       // must update the SequenceView too
+                                                       if (v != sel_seq->FramesPerView()) {
+                                                               int             real_nov = ActualNumberOfViews(sel_seq->NumberOfViews()),
+                                                               old_fpv = sel_seq->FramesPerView();
+                                                               short   old_indexes[real_nov * old_fpv];
+                                                               
+                                                               for (int i = 0; i < real_nov * old_fpv; i++)
+                                                                       old_indexes[i] = sel_seq->mFrameIndexes[i];
+                                                               sel_seq->SetFramesPerView(v);
+                                                               // try to preserve existing frame
+                                                               // references as much as possible
+                                                               sel_seq->mFrameIndexes.clear();
+                                                               for (int i = 0; i < real_nov; i++) {
+                                                                       for (int j = 0; j < v; j++) {
+                                                                               if (j < old_fpv)
+                                                                                       sel_seq->mFrameIndexes.push_back(old_indexes[i*old_fpv + j]);
+                                                                               else
+                                                                                       sel_seq->mFrameIndexes.push_back(-1);
+                                                                       }
+                                                               }
+                                                               s_fb->SetSeqParameters(sel_seq->NumberOfViews(), v, &sel_seq->mFrameIndexes, this);
+                                                       }
+                                                       break;
+                                               case FIELD_SEQ_TICKS_PER_FRAME:
+                                                       sel_seq->SetTicksPerFrame(v);
+                                                       break;
+                                               case FIELD_SEQ_LOOP_FRAME:
+                                                       sel_seq->SetLoopFrame(v);
+                                                       break;
+                                               case FIELD_SEQ_KEY_FRAME:
+                                                       sel_seq->SetKeyFrame(v);
+                                                       break;
+                                               case FIELD_SEQ_XFER_MODE_PERIOD:
+                                                       sel_seq->SetTransferModePeriod(v);
+                                                       break;
+                                               case FIELD_SEQ_FIRST_FRAME_SND:
+                                                       sel_seq->SetFirstFrameSound(v);
+                                                       break;
+                                               case FIELD_SEQ_KEY_FRAME_SND:
+                                                       sel_seq->SetKeyFrameSound(v);
+                                                       break;
+                                               case FIELD_SEQ_LAST_FRAME_SND:
+                                                       sel_seq->SetLastFrameSound(v);
+                                                       break;
+                                       }
+                                       ((ShapesDocument*)GetDocument())->Modify(true);
+                               }
+                       }
+               }
+       }
+}
+
diff --git a/Shapes/ShapesView.h b/Shapes/ShapesView.h
new file mode 100644 (file)
index 0000000..3ed5cd0
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef SHAPESVIEW_H
+#define SHAPESVIEW_H
+
+#include "wx/docview.h"
+#include "wx/treectrl.h"
+#include "wx/spinctrl.h"
+#include "wx/statline.h"
+#include "../ShapeFusionApp.h"
+#include "ShapesTreeItemData.h"
+#include "CTBrowser.h"
+#include "CTView.h"
+#include "BitmapBrowser.h"
+#include "BitmapView.h"
+#include "FrameBrowser.h"
+#include "FrameView.h"
+#include "SequenceView.h"
+#include "../ShapeFusionMenus.h"
+
+class ShapesView: public wxView
+{
+    DECLARE_DYNAMIC_CLASS(ShapesView)
+private:
+       // control ids
+       enum {
+               // color tables
+               CB_SELF_LUMINESCENT,
+               BTN_GRADIENT,
+               // bitmaps
+               BITMAP_BROWSER,
+               CB_COLUMN_ORDER,
+               CB_ENABLE_TRANSPARENCY,
+               // frames
+               FRAME_BROWSER,
+               FRAME_VIEW,
+               FIELD_BITMAP_INDEX,
+               CB_XMIRROR,
+               CB_YMIRROR,
+               CB_KEYPOINT,
+               FIELD_ORIGIN_X,
+               FIELD_ORIGIN_Y,
+               FIELD_KEY_X,
+               FIELD_KEY_Y,
+               FIELD_FRAME_SCALEFACTOR,
+               FIELD_MIN_LIGHT_INT,
+               // sequences
+               FIELD_SEQ_NAME,
+               BTN_DELETE_SEQ,
+               MENU_SEQ_TYPE,
+               FIELD_SEQ_NUMBER_OF_VIEWS,
+               FIELD_SEQ_FRAMES_PER_VIEW,
+               FIELD_SEQ_TICKS_PER_FRAME,
+               FIELD_SEQ_LOOP_FRAME,
+               FIELD_SEQ_KEY_FRAME,
+               MENU_SEQ_XFER_MODE,
+               FIELD_SEQ_XFER_MODE_PERIOD,
+               FIELD_SEQ_FIRST_FRAME_SND,
+               FIELD_SEQ_KEY_FRAME_SND,
+               FIELD_SEQ_LAST_FRAME_SND,
+       };
+
+       wxBoxSizer                      *mainbox;
+       wxPanel                         *main_panel;
+       wxMenuBar                       *menubar;
+       wxTreeCtrl                      *colltree;
+       wxBoxSizer                      *dummy_sizer;
+       // widgets for collection info
+       wxBoxSizer                      *coll_sizer;
+       wxStaticBox                     *coll_static_box;
+       wxStaticBoxSizer        *coll_inner_box;
+       wxStaticText            *coll_text;
+       // widgets for chunk info
+       wxBoxSizer                      *chunk_sizer;
+       wxStaticBox                     *chunk_static_box;
+       wxStaticBoxSizer        *chunk_inner_box;
+       wxStaticText                    *chunk_undef_label;
+       wxFlexGridSizer                 *chunk_grid;
+       wxStaticText                            *chunk_version_label,
+                                                               *chunk_type_label,
+                                                               *chunk_flags_label,
+                                                               *chunk_sf_label;
+       wxTextCtrl                                      *chunk_version_field,
+                                                               *chunk_flags_field,
+                                                               *chunk_sf_field;
+       wxChoice                                        *chunk_type_menu;
+       // widgets for color tables section
+       wxBoxSizer                      *ct_outer_sizer;
+       CTBrowser                       *ctb;
+       wxStaticText            *ct_count_label;
+       wxStaticBox                     *ct_edit_static_box;
+       wxStaticBoxSizer        *ct_edit_box;
+       CTView                                  *ct_view;
+       wxBoxSizer                              *ct_inner_edit_box;
+       wxCheckBox                                      *ct_self_lumin_checkbox;
+       wxButton                                        *ct_gradient_button;
+       // widgets for bitmaps section
+       wxBoxSizer                      *b_outer_sizer,
+                                               *b_edit_inner_box;
+       BitmapBrowser           *bb;
+       wxStaticText            *b_count_label;
+       wxStaticBox                     *b_edit_static_box;
+       wxStaticBoxSizer        *b_edit_box;
+       wxCheckBox                      *b_order_checkbox,
+                                               *b_transparency_checkbox;
+       wxStaticText            *b_info_label;
+       BitmapView                      *b_view;
+       // widgets for frames section
+       wxBoxSizer                      *f_outer_sizer,
+                                               *f_edit_inner_box;
+       FrameBrowser            *fb;
+       wxStaticText            *f_count_label;
+       wxStaticBox                     *f_edit_static_box;
+       wxStaticBoxSizer        *f_edit_box;
+       wxStaticText            *f_bitmap_label;
+       wxSpinCtrl                      *f_bitmap_id;
+       wxTextCtrl                      *f_origin_x_field,
+                                               *f_origin_y_field,
+                                               *f_key_x_field,
+                                               *f_key_y_field,
+                                               *f_scalefactor_field;
+       wxCheckBox                      *f_xmirror_checkbox,
+                                               *f_ymirror_checkbox,
+                                               *f_keypoint_checkbox;
+       FrameView                       *f_view;
+       wxFlexGridSizer         *f_origin_box;
+       wxStaticText            *f_origin_x_label,
+                                               *f_origin_y_label,
+                                               *f_key_x_label,
+                                               *f_key_y_label,
+                                               *f_scalefactor_label,
+                                               *f_mli_label,
+                                               *f_w_left_label,
+                                               *f_w_right_label,
+                                               *f_w_top_label,
+                                               *f_w_bottom_label,
+                                               *f_w_x0_label,
+                                               *f_w_y0_label;
+       wxTextCtrl                      *f_mli_field,
+                                               *f_w_left_field,
+                                               *f_w_right_field,
+                                               *f_w_top_field,
+                                               *f_w_bottom_field,
+                                               *f_w_x0_field,
+                                               *f_w_y0_field;
+       // widgets for sequences section
+       wxStaticBoxSizer        *s_outer_sizer;
+       wxStaticBox                     *s_outer_static_box;
+       wxBoxSizer                      *s_box1;
+       wxStaticText                    *s_name_label;
+       wxTextCtrl                              *s_name_field;
+       wxButton                                *s_delete_button;
+       wxBoxSizer                      *s_box2;
+       wxFlexGridSizer                 *s_grid_box;
+       wxStaticText                            *s_type_label;
+       wxChoice                                        *s_type_menu;
+       wxStaticText                            *s_fpv_label;
+       wxTextCtrl                                      *s_fpv_field;
+       wxStaticText                    *s_tpf_label;
+       wxTextCtrl                      *s_tpf_field;
+       wxStaticText                            *s_lf_label;
+       wxTextCtrl                                      *s_lf_field;
+       wxStaticText                            *s_kf_label;
+       wxTextCtrl                                      *s_kf_field;
+       wxPanel         *s_separator;
+       wxFlexGridSizer                 *s_grid_box2;
+       wxStaticText                            *s_xfermode_label;
+       wxChoice                                        *s_xfermode_menu;
+       wxStaticText                            *s_xferperiod_label;
+       wxTextCtrl                                      *s_xferperiod_field;
+       wxStaticText                            *s_ffs_label,
+                                                               *s_kfs_label,
+                                                               *s_lfs_label;
+       wxTextCtrl                                      *s_ffs_field,
+                                                               *s_kfs_field,
+                                                               *s_lfs_field;
+       SequenceView            *s_fb;
+
+       int             mSelectedColl,
+                       mSelectedVers,
+                       mSelectedSequence,
+                       mViewColorTable;
+    wxFrame    *mFrame;
+       
+protected:
+       DECLARE_EVENT_TABLE();
+
+public:
+       ShapesView();
+       ~ShapesView(void);
+       
+       bool OnCreate(wxDocument *doc, long flags);
+       void OnDraw(wxDC *dc);
+       void OnUpdate(wxView *sender, wxObject *hint = (wxObject *) NULL);
+       bool OnClose(bool deleteWindow = true);
+       wxTreeItemId GetSequencesTreeItem(unsigned int collection, unsigned int version) const;
+       // menu event callbacks
+       void MenuFileOpen(wxCommandEvent &e);
+       void MenuFileSave(wxCommandEvent&);
+       void MenuFileQuit(wxCommandEvent &e);
+       void MenuEditCopy(wxCommandEvent& e);
+       void MenuEditDelete(wxCommandEvent &e);
+       void MenuEditPaste(wxCommandEvent& e);
+       void MenuViewCT(wxCommandEvent &e);
+       void MenuViewTNSize(wxCommandEvent &e);
+       void MenuViewTransparency(wxCommandEvent &e);
+       void MenuViewCenterOrigin(wxCommandEvent &e);
+       void MenuShapesAddColorTable(wxCommandEvent &e);
+       void MenuShapesSaveColorTable(wxCommandEvent &e);
+       void MenuShapesSaveColorTableToPS(wxCommandEvent &e);
+       void MenuShapesAddBitmap(wxCommandEvent &e);
+       void MenuShapesExportBitmap(wxCommandEvent &e);
+       void MenuShapesExportBitmapMask(wxCommandEvent &e);
+       void MenuShapesExportBitmaps(wxCommandEvent &e);
+       void MenuShapesExportBitmapMasks(wxCommandEvent &e);
+       void MenuShapesNewFrame(wxCommandEvent &e);
+       void MenuShapesNewSequence(wxCommandEvent &e);
+       void MenuShapesGeneratePatch(wxCommandEvent& e);
+       void MenuShapesImportPatch(wxCommandEvent& e);
+       // control callbacks
+       void OnTreeSelect(wxTreeEvent &e);
+       void OnBitmapSelect(wxCommandEvent &e);
+       void BitmapDelete(wxCommandEvent &e);
+       void OnCTSelect(wxCommandEvent &e);
+       void CTColorSelect(wxCommandEvent &e);
+       void CTColorChanged(wxCommandEvent &e);
+       void ToggleSelfLuminCheckbox(wxCommandEvent &e);
+       void MakeCTGradient(wxCommandEvent &e);
+       void ToggleBitmapCheckboxes(wxCommandEvent &e);
+       void OnFrameSelect(wxCommandEvent &e);
+       void FrameDelete(wxCommandEvent &e);
+       void OnFramePointDrag(wxCommandEvent &e);
+       void BitmapIndexSpin(wxSpinEvent &e);
+       void ToggleFrameCheckboxes(wxCommandEvent &e);
+       void EditFrameFields(wxCommandEvent &e);
+       void DeleteSequence(wxCommandEvent &e);
+       void EditSequenceType(wxCommandEvent &e);
+       void EditSequenceXferMode(wxCommandEvent &e);
+       void EditSequenceFields(wxCommandEvent &e);
+
+       void DoCopyBitmap(int which);
+       void DoPasteBitmap(int which);
+
+       void DoCopyChunk(unsigned int coll, unsigned int chunk);
+       void DoPasteChunk(unsigned int coll, unsigned int chunk);
+
+       void DoDeleteColorTable(int which);
+       void DoDeleteBitmap(int which);
+       void DoDeleteFrame(int which);
+
+};
+
+#endif
diff --git a/Shapes/utilities.cpp b/Shapes/utilities.cpp
new file mode 100644 (file)
index 0000000..7eeeb3e
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include "ShapesElements.h"
+#include "utilities.h"
+
+// convert an 8-bit ShapesBitmap to a RGB wxImage using the provided color table.
+// <white_transparency> renders transparent pixels as white instead of using
+// the chroma-key color. NOTE: this routine assumes valid pointers.
+wxImage ShapesBitmapToImage(ShapesBitmap *bp, ShapesColorTable *ct, bool white_transparency)
+{
+       int                             w = bp->Width(),
+                                       h = bp->Height();
+       bool                    transparency_enabled = bp->IsTransparent();
+       wxImage                 img(w, h);
+       unsigned char   *imgbuf = img.GetData(),
+                                       *inp = bp->Pixels(),
+                                       *outp = imgbuf;
+       unsigned int    colors_per_table = ct->ColorCount();
+
+       for (int i = 0; i < w * h; i++) {
+               unsigned char   value = *inp++;
+
+               if (value == 0 && transparency_enabled && white_transparency) {
+                       *outp++ = 255;
+                       *outp++ = 255;
+                       *outp++ = 255;
+               } else if (value < colors_per_table) {
+                       ShapesColor     *color = ct->GetColor(value);
+
+                       *outp++ = color->Red() >> 8;
+                       *outp++ = color->Green() >> 8;
+                       *outp++ = color->Blue() >> 8;
+               } else {
+                       wxLogError(wxT("[utilities ShapesBitmapToImage] Pixel value %u with just %u colors/table. Aborting"),
+                                                       value, colors_per_table);
+                       break;
+               }
+       }
+       return img;
+}
+
+// create a wxBitmap thumbnail of the given wxImage. If the major wxImage
+// dimension is greater than the specified thumbnail size, the wxImage
+// will be scaled down (keeping its aspect ratio). If the wxImage is smaller,
+// it will be just converted to a wxBitmap.
+wxBitmap ImageThumbnail(wxImage &img, int tn_size, bool filtering)
+{
+       int     w = img.GetWidth(),
+               h = img.GetHeight();
+
+       // scale the wxImage down to thumbnail size if larger
+       if (w > tn_size || h > tn_size) {
+               int     new_w, new_h;
+
+               if (w > h) {
+                       new_w = tn_size;
+                       new_h = new_w * h / w;
+                       if (new_h < 1)
+                               new_h = 1;
+               } else {
+                       new_h = tn_size;
+                       new_w = new_h * w / h;
+                       if (new_w < 1)
+                               new_w = 1;
+               }
+
+               if (filtering) {
+                       // wx doesn't allow nice scaling, so we supply here. The thing works this way:
+                       // 1) calculate where each source pixel will end up in the final image
+                       // 2) add the source pixel value to the destination pixel
+                       // 3) divide each destination pixel by the number of pixels
+                       //    that were added there.
+                       // It's nothing more than a brutal pixel-level average, but results are quite good.
+                       wxImage                 scaledimg(new_w, new_h);
+                       unsigned char   *src = img.GetData(),
+                                                       *srcp = src,
+                                                       *dst = scaledimg.GetData();
+                       unsigned int    pixcount = new_w * new_h,
+                                                       *tempbuf = new unsigned int[pixcount * 3],
+                                                       *countbuf = new unsigned int[pixcount];
+
+                       memset(tempbuf, 0, pixcount * 3 * sizeof(unsigned int));
+                       memset(countbuf, 0, pixcount * sizeof(unsigned int));
+                       // sum
+                       for (int y = 0; y < h; y++) {
+                               unsigned int    dsty = (y * new_h) / h * new_w;
+
+                               for (int x = 0; x < w; x++) {
+                                       unsigned int    i = x * new_w / w + dsty,
+                                                                       *tempp = &tempbuf[3 * i];
+
+                                       *tempp++ += *srcp++;
+                                       *tempp++ += *srcp++;
+                                       *tempp += *srcp++;
+                                       countbuf[i]++;
+                               }
+                       }
+                       // divide
+                       unsigned int    *tempp = tempbuf,
+                                                       *countp = countbuf;
+                       unsigned char   *dstp = dst;
+
+                       for (unsigned int i = 0; i < pixcount; i++) {
+                               unsigned int    count = *countp++;
+
+                               if (count == 0) {
+                                       *dstp++ = 0;
+                                       *dstp++ = 0;
+                                       *dstp++ = 0;
+                               } else {
+                                       *dstp++ = *tempp++ / count;
+                                       *dstp++ = *tempp++ / count;
+                                       *dstp++ = *tempp++ / count;
+                               }
+                       }
+
+                       delete[] tempbuf;
+                       delete[] countbuf;
+                       return wxBitmap(scaledimg);
+               } else {
+                       // ugly (but fast and simple) wx scaler
+                       img.Rescale(new_w, new_h);
+                       return wxBitmap(img);
+               }
+       } else {
+               return wxBitmap(img);
+       }
+}
+
+// create the "bad item" (red 'X') thumbnail
+wxBitmap BadThumbnail(int tn_size)
+{
+       wxImage                 newimg(tn_size, tn_size);
+       unsigned char   *imgbuf = newimg.GetData(), *p = imgbuf;
+
+       for (int y = 0; y < tn_size; y++) {
+               for (int x = 0; x < tn_size; x++) {
+                       if (x == y || (tn_size - x - 1) == y || (x - 1) == y || (x + 1) == y
+                               || (tn_size - x - 2) == y || (tn_size - x) == y) {
+                               *p++ = 255;
+                               *p++ = 0;
+                               *p++ = 0;
+                       } else {
+                               *p++ = 255;
+                               *p++ = 255;
+                               *p++ = 255;
+                       }
+               }
+       }
+       return wxBitmap(newimg);
+}
+
+// compute (squared) distance between given RGB colours (range [0;1]).
+// This is used to quantize imported bitmaps against collection palettes.
+// The formula seems to work quite well even for photos and very bad
+// destination palettes. It was taken from the article "Colour metric"
+// by T. Riemersma, available under a Creative Commons license at
+// http://www.compuphase.com/cmetric.htm.
+float ColourDistance(float r1, float g1, float b1, float r2, float g2, float b2)
+{
+       float   rMean = (r1 + r2) / 2.0,
+                       deltaR = r1 - r2,
+                       deltaG = g1 - g2,
+                       deltaB = b1 - b2;
+       
+       return (2.0+rMean)*deltaR*deltaR + 4.0*deltaG*deltaG + (2.0+1.0-rMean)*deltaB*deltaB;
+}
+
diff --git a/Shapes/utilities.h b/Shapes/utilities.h
new file mode 100644 (file)
index 0000000..067e9a4
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#ifndef UTILITIES_H
+#define UTILITIES_H
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+#include "wx/image.h"
+
+wxImage ShapesBitmapToImage(ShapesBitmap *bp, ShapesColorTable *ct, bool white_transparency);
+wxBitmap ImageThumbnail(wxImage &img, int tn_size, bool filtering);
+wxBitmap BadThumbnail(int tn_size);
+float ColourDistance(float r1, float g1, float b1, float r2, float g2, float b2);
+
+#endif
diff --git a/Sounds/Makefile.am b/Sounds/Makefile.am
new file mode 100644 (file)
index 0000000..30172c9
--- /dev/null
@@ -0,0 +1,6 @@
+## Process this file with automake to produce Makefile.in 
+
+noinst_LIBRARIES = libsounds.a
+
+libsounds_a_SOURCES = SoundsDocument.h SoundsElements.h SoundsView.h   \
+       SoundsDocument.cpp SoundsView.cpp SoundsElements.cpp
diff --git a/Sounds/Makefile.in b/Sounds/Makefile.in
new file mode 100644 (file)
index 0000000..4856a74
--- /dev/null
@@ -0,0 +1,466 @@
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = Sounds
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libsounds_a_AR = $(AR) $(ARFLAGS)
+libsounds_a_LIBADD =
+am_libsounds_a_OBJECTS = SoundsDocument.$(OBJEXT) SoundsView.$(OBJEXT) \
+       SoundsElements.$(OBJEXT)
+libsounds_a_OBJECTS = $(am_libsounds_a_OBJECTS)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+       -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libsounds_a_SOURCES)
+DIST_SOURCES = $(libsounds_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SNDFILE_CFLAGS = @SNDFILE_CFLAGS@
+SNDFILE_LIBS = @SNDFILE_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+WX_CFLAGS = @WX_CFLAGS@
+WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@
+WX_CONFIG_PATH = @WX_CONFIG_PATH@
+WX_CPPFLAGS = @WX_CPPFLAGS@
+WX_CXXFLAGS = @WX_CXXFLAGS@
+WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@
+WX_LIBS = @WX_LIBS@
+WX_LIBS_STATIC = @WX_LIBS_STATIC@
+WX_RESCOMP = @WX_RESCOMP@
+WX_VERSION = @WX_VERSION@
+WX_VERSION_MAJOR = @WX_VERSION_MAJOR@
+WX_VERSION_MICRO = @WX_VERSION_MICRO@
+WX_VERSION_MINOR = @WX_VERSION_MINOR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+noinst_LIBRARIES = libsounds.a
+libsounds_a_SOURCES = SoundsDocument.h SoundsElements.h SoundsView.h   \
+       SoundsDocument.cpp SoundsView.cpp SoundsElements.cpp
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Sounds/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu Sounds/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libsounds.a: $(libsounds_a_OBJECTS) $(libsounds_a_DEPENDENCIES) 
+       -rm -f libsounds.a
+       $(libsounds_a_AR) libsounds.a $(libsounds_a_OBJECTS) $(libsounds_a_LIBADD)
+       $(RANLIB) libsounds.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SoundsDocument.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SoundsElements.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SoundsView.Po@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am
+
+
+# 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/Sounds/SoundsDocument.cpp b/Sounds/SoundsDocument.cpp
new file mode 100644 (file)
index 0000000..6ab6fb6
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#if wxUSE_STD_IOSTREAM
+    #include "wx/ioswrap.h"
+#else
+    #include "wx/txtstrm.h"
+#endif
+
+#include "SoundsDocument.h"
+#include "SoundsView.h"
+
+// Construct four-character-code
+#define FOUR_CHARS_TO_INT(a,b,c,d) (((unsigned int)(a) << 24) | ((unsigned int)(b) << 16) | ((unsigned int)(c) << 8) | (unsigned int)(d))
+
+enum {
+       _sound_8bit = 0,
+       _sound_16bit,
+       NUMBER_OF_SOUND_SOURCES
+};
+
+IMPLEMENT_DYNAMIC_CLASS(SoundsDocument, wxDocument)
+
+SoundsDocument::SoundsDocument(): wxDocument(), SoundsElement(true), mM2Demo(false)
+{
+       // We need storage for our sound sources...
+       mSoundDefinitions.resize(NUMBER_OF_SOUND_SOURCES);
+}
+
+SoundsDocument::~SoundsDocument()
+{
+}
+
+SoundsDefinition *SoundsDocument::GetSoundDefinition(unsigned short source_index, unsigned short sound_index)
+{
+       if (source_index > mSoundDefinitions.size())
+               return NULL;
+       if (sound_index > mSoundDefinitions[source_index].size())
+               return NULL;
+       return mSoundDefinitions[source_index][sound_index];
+}
+
+SoundsDefinition *SoundsDocument::Get8BitSoundDefinition(unsigned short sound_index)
+{
+       return GetSoundDefinition(_sound_8bit, sound_index);
+}
+
+SoundsDefinition *SoundsDocument::Get16BitSoundDefinition(unsigned short sound_index)
+{
+       return GetSoundDefinition(_sound_16bit, sound_index);
+}
+
+void SoundsDocument::AddSoundDefinition(void)
+{
+       // As there's always two versions (8-bit/16-bit) of the same sound, we add both there...
+       SoundsDefinition        *snd8 = new SoundsDefinition(),
+                                               *snd16 = new SoundsDefinition();
+
+       // We add 8-bit...
+       mSoundDefinitions[_sound_8bit].push_back(snd8);
+       // ... and 16-bit
+       mSoundDefinitions[_sound_16bit].push_back(snd16);
+       
+       // We mark ourselves as modified...
+       Modify(true);
+}
+
+void SoundsDocument::DeleteSoundDefinition(unsigned int index)
+{
+       // We check we really have that much sounds...
+       if (index > mSoundDefinitions[_sound_8bit].size())
+               return;
+       
+       // We remove 8-bit version
+       mSoundDefinitions[_sound_8bit].erase(mSoundDefinitions[_sound_8bit].begin() + index);
+       // We remove 16-bit version
+       mSoundDefinitions[_sound_16bit].erase(mSoundDefinitions[_sound_16bit].begin() + index);
+       
+       // We mark ourselves as modified...
+       Modify(true);
+}
+
+bool SoundsDocument::DoOpenDocument(const wxString& file)
+{
+       bool wxOpen = wxDocument::DoOpenDocument(file);
+       
+       if (!(wxOpen && mGoodData)) {
+               wxLogError(wxT("[SoundsDocument] There was an error while loading, see log"));
+               return false;
+       }
+       return true;
+}
+
+unsigned int SoundsDocument::GetSizeInFile(void)
+{
+       unsigned int size = SIZEOF_sound_file_header;
+       
+       for (unsigned int i = 0; i < mSoundDefinitions.size(); i++)
+               for (unsigned int j = 0; j < mSoundDefinitions[i].size(); j++)
+                       size += mSoundDefinitions[i][j]->GetSizeInFile();
+       
+       return size;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD ostream& SoundsDocument::SaveObject(wxSTD ostream& stream)
+#else
+wxOutputStream& SoundsDocument::SaveObject(wxOutputStream& stream)
+#endif
+{
+       BigEndianBuffer filebuffer(GetSizeInFile());
+       
+       unsigned int source_count = mSoundDefinitions.size();
+       unsigned int sound_count = mSoundDefinitions[0].size();
+       
+       filebuffer.WriteLong(mVersion);
+       filebuffer.WriteLong(mTag);
+       
+       if (mM2Demo) {
+               filebuffer.WriteShort(mSoundCount);
+               filebuffer.WriteShort(0);
+       } else {
+               filebuffer.WriteShort(source_count);
+               filebuffer.WriteShort(sound_count);
+       }
+       
+       filebuffer.Position(SIZEOF_sound_file_header);
+       
+       unsigned int current_sound_offset = SIZEOF_sound_file_header
+                       + source_count * sound_count * SIZEOF_sound_definition;
+       
+       for (unsigned int i = 0; i < mSoundDefinitions.size(); i++) {
+               for (unsigned int j = 0; j < mSoundDefinitions[i].size(); j++) {
+                       mSoundDefinitions[i][j]->SaveObject(filebuffer, current_sound_offset);
+               }
+       }
+       
+#if wxUSE_STD_IOSTREAM
+       stream.write((char *)filebuffer.Data(), filebuffer.Size());
+#else
+       stream.Write((char *)filebuffer.Data(), filebuffer.Size());
+#endif
+
+       return stream;
+}
+
+#if wxUSE_STD_IOSTREAM
+wxSTD istream& SoundsDocument::LoadObject(wxSTD istream& stream)
+#else
+wxInputStream& SoundsDocument::LoadObject(wxInputStream& stream)
+#endif
+{
+#if wxUSE_STD_IOSTREAM
+       stream.seekg(0, std::ios::end);
+       wxInt32 filesize = stream.tellg();
+       stream.seekg(0, std::ios::beg);
+#else
+       wxInt32 filesize = stream.GetSize();
+#endif
+
+       BigEndianBuffer filebuffer(filesize);
+       
+#if wxUSE_STD_IOSTREAM
+       stream.read((char *)filebuffer.Data(), filebuffer.Size());
+#else
+       stream.Read((char *)filebuffer.Data(), filebuffer.Size());
+#endif
+       
+       mVersion = filebuffer.ReadLong();
+       mTag = filebuffer.ReadLong();
+       mSourceCount = filebuffer.ReadShort();
+       mSoundCount = filebuffer.ReadShort();
+       
+       if ((mVersion != 0 && mVersion != 1) || mTag != FOUR_CHARS_TO_INT('s','n','d','2')) {
+               wxLogError(wxT("[SoundsDocument] Error loading : Incorrect version/tag, (%d/%x)"), mVersion, mTag);
+               return stream;
+       }
+       
+       if (mSoundCount < 0 || mSourceCount < 0) {
+               wxLogError(wxT("[SoundsDocument] Error loading : Incorrect Sound/Source count (%d/%d)"), mSoundCount, mSourceCount);
+               return stream;
+       }
+       
+       if (mSoundCount == 0) {
+               /* Handling Marathon 2 Demo
+                * We have to swap our counts
+                */
+               mSoundCount = mSourceCount;
+               mSourceCount = 1;
+               mM2Demo = true;
+       }
+       
+       if (IsVerbose()) {
+               wxLogDebug(wxT("[SoundsDocument] Version:               %d"), mVersion);
+               wxLogDebug(wxT("[SoundsDocument] Tag:                   %d"), mTag);
+               wxLogDebug(wxT("[SoundsDocument] Source Count:  %d"), mSourceCount);
+               wxLogDebug(wxT("[SoundsDocument] Sound Count:   %d"), mSoundCount);
+       }
+       
+       /* We move to the end of the Sound file header */
+       filebuffer.Position(SIZEOF_sound_file_header);
+       
+       /* Now we load 8-bit and 16-bit sounds */
+       for (int i = 0; i < mSourceCount; i++) {
+               for (int j = 0; j < mSoundCount; j++) {
+                       SoundsDefinition *snd = new SoundsDefinition(IsVerbose());
+                       
+                       if (IsVerbose())
+                               wxLogDebug(wxT("[SoundsDocument] Loading source %d, sound %d"), i, j);
+                       
+                       unsigned int oldpos = filebuffer.Position();
+                       
+                       snd->LoadObject(filebuffer);
+                       
+                       if (!snd->IsGood()) {
+                               wxLogError(wxT("[SoundsDocument] Error loading sound definition. Skipping..."));
+                               return stream;
+                       }
+                       
+                       filebuffer.Position(oldpos + SIZEOF_sound_definition);
+                       
+                       mSoundDefinitions[i].push_back(snd);
+               }
+       }
+       
+       mGoodData = true;
+       return stream;
+}
+
diff --git a/Sounds/SoundsDocument.h b/Sounds/SoundsDocument.h
new file mode 100644 (file)
index 0000000..32b24ab
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __SOUNDDOCUMENT_H__
+#define __SOUNDDOCUMENT_H__
+
+#include "wx/docview.h"
+#include "wx/cmdproc.h"
+#include "SoundsElements.h"
+
+class SoundsDocument: public wxDocument, public SoundsElement
+{
+    DECLARE_DYNAMIC_CLASS(SoundsDocument)
+
+private:
+       /* Marathon Sound Header */
+       int mVersion;
+       int mTag;
+
+       short mSourceCount; // usually 2 (8-bit, 16-bit)
+       short mSoundCount;
+       
+       // immediately followed by source_count*sound_count sound_definition structures
+       std::vector< std::vector<SoundsDefinition*> > mSoundDefinitions;
+
+       /* some of our needed info */
+       bool mM2Demo;
+
+public:
+    SoundsDocument(void);
+    ~SoundsDocument(void);
+       
+       int GetVersion(void) const {return mVersion;}
+       int GetTag(void) const {return mTag;}
+       
+       unsigned int GetSourceCount(void) const {return mSourceCount;}
+       unsigned int GetSoundCount(void) const {return mSoundCount;}
+       
+       SoundsDefinition *GetSoundDefinition(unsigned short source_index, unsigned short sound_index);
+       SoundsDefinition *Get8BitSoundDefinition(unsigned short sound_index);
+       SoundsDefinition *Get16BitSoundDefinition(unsigned short sound_index);
+       
+       void AddSoundDefinition(void);
+       void DeleteSoundDefinition(unsigned int index);
+       
+       bool IsM2DemoFile(void) const {return mM2Demo;}
+       void SetM2DemoFile(bool b) {mM2Demo = b;}
+       
+       bool DoOpenDocument(const wxString& file);
+       
+       // Utilities
+       unsigned int GetSizeInFile(void);
+#if wxUSE_STD_IOSTREAM
+    wxSTD ostream& SaveObject(wxSTD ostream& stream);
+    wxSTD istream& LoadObject(wxSTD istream& stream);
+#else
+    wxOutputStream& SaveObject(wxOutputStream& stream);
+    wxInputStream& LoadObject(wxInputStream& stream);
+#endif
+};
+
+#endif
diff --git a/Sounds/SoundsElements.cpp b/Sounds/SoundsElements.cpp
new file mode 100644 (file)
index 0000000..efb19c9
--- /dev/null
@@ -0,0 +1,698 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#if wxUSE_STD_IOSTREAM
+    #include "wx/ioswrap.h"
+#else
+    #include "wx/txtstrm.h"
+#endif
+#include "wx/filename.h"
+#include "wx/sound.h"
+
+#include "SoundsElements.h"
+#include "../LittleEndianBuffer.h"
+
+#include <sndfile.h>
+
+#define FOUR_CHARS_TO_INT(a,b,c,d) (((unsigned int)(a) << 24) | ((unsigned int)(b) << 16) | ((unsigned int)(c) << 8) | (unsigned int)(d))
+
+struct sf_adapter
+{
+public:
+       sf_adapter(std::vector<unsigned char>& data) : data_(data), p_(data.begin()) { }
+
+       static sf_count_t get_filelen(void *pv) {
+               return ((sf_adapter*) pv)->_get_filelen();
+       }
+
+       static sf_count_t seek(sf_count_t offset, int whence, void *pv) {
+               return ((sf_adapter*) pv)->_seek(offset, whence);
+       }
+
+       static sf_count_t read(void *ptr, sf_count_t count, void *pv) {
+               return ((sf_adapter*) pv)->_read(ptr, count);
+       }
+
+       static sf_count_t write(const void *ptr, sf_count_t count, void *pv) {
+               return ((sf_adapter*) pv)->_write(ptr, count);
+       }
+
+       static sf_count_t tell(void *pv) {
+               return ((sf_adapter*) pv)->_tell();
+       }
+
+private:
+       std::vector<unsigned char>& data_;
+       std::vector<unsigned char>::iterator p_;
+
+       sf_count_t _get_filelen() {
+               return data_.size();
+       }
+
+       sf_count_t _seek(sf_count_t offset, int whence) {
+               if (whence == SEEK_SET)
+                       p_ = data_.begin() + offset;
+               else if (whence == SEEK_END)
+                       p_ = data_.end() - offset;
+               else if (whence == SEEK_CUR)
+                       p_ += offset;
+
+               return ((p_ >= data_.begin() && p_ <= data_.end()) ? 0 : -1);
+       }
+
+       sf_count_t _read(void *ptr, sf_count_t count) {
+               if (p_ >= data_.end()) return -1;
+               char *dst = reinterpret_cast<char *>(ptr);
+               int i = 0;
+               for (; i < count && p_ < data_.end(); ++i)
+               {
+                       *(dst++) = *(p_++);
+               }
+
+               return i;
+       }
+
+       sf_count_t _write(const void *ptr, sf_count_t count) {
+               if (p_ >= data_.end()) return -1;
+
+               const char *src = reinterpret_cast<const char *>(ptr);
+               int i = 0;
+               for (; i < count && p_ < data_.end(); ++i)
+               {
+                       *(p_++) = *(src++);
+               }
+
+               return i;
+       }
+
+       sf_count_t _tell() {
+               return p_ - data_.begin();
+       }
+
+};
+
+AppleSoundHeader::AppleSoundHeader(bool verbose): SoundsElement(verbose)
+{
+}
+
+AppleSoundHeader::~AppleSoundHeader()
+{
+}
+
+bool AppleSoundHeader::operator==(const AppleSoundHeader& right) const
+{
+       return (mSixteenBit == right.mSixteenBit &&
+               mStereo == right.mStereo &&
+               mSigned == right.mSigned &&
+               mBytesPerFrame == right.mBytesPerFrame &&
+               mSampleRate == right.mSampleRate &&
+               mLoopStart == right.mLoopStart &&
+               mLoopEnd == right.mLoopEnd &&
+               mBaseFrequency == right.mBaseFrequency &&
+               mData == right.mData);
+}
+
+BigEndianBuffer& AppleSoundHeader::LoadObject(BigEndianBuffer& buffer)
+{
+       unsigned char headerType = buffer.Data()[buffer.Position() + 20];
+       switch (headerType) {
+               case standardSoundHeader:
+               {
+                       mBytesPerFrame = 1;
+                       mSigned = false;
+                       mStereo = false;
+                       mSixteenBit = false;
+
+                       buffer.ReadULong(); // sample pointer
+
+                       int frames = buffer.ReadLong();
+                       mSampleRate = buffer.ReadULong();
+                       mLoopStart = buffer.ReadLong();
+                       mLoopEnd = buffer.ReadLong();
+                       
+                       buffer.ReadUChar(); // type
+                       mBaseFrequency = buffer.ReadUChar();
+                       
+                       mData.resize(frames);
+                       buffer.ReadBlock(mData.size(), &mData[0]);
+                       break;
+               }
+               case extendedSoundHeader:
+               case compressedSoundHeader:
+               {
+                       buffer.ReadULong(); // samplePtr
+                       mStereo = (buffer.ReadLong() == 2);
+                       mSampleRate = buffer.ReadULong();
+                       mLoopStart = buffer.ReadLong();
+                       mLoopEnd = buffer.ReadLong();
+                       
+                       buffer.ReadUChar(); // type
+                       mBaseFrequency = buffer.ReadUChar();
+
+                       int frames = buffer.ReadLong();
+
+                       if (headerType == compressedSoundHeader) {
+                               buffer.Position(buffer.Position() + 10); // AIFF rate
+                               buffer.ReadULong(); // marker chunk
+                               unsigned int format = buffer.ReadULong();
+                               buffer.ReadULong(); // future use
+                               buffer.ReadULong(); // stateVars
+                               buffer.ReadULong(); // leftOverSamples
+                               short comp_id = buffer.ReadShort();
+                               if (format != FOUR_CHARS_TO_INT('t', 'w', 'o', 's') || comp_id != -1) {
+                                       wxLogError(wxT("[AppleSoundHeader] Unsupported compression format '%.4s.'"), &format);
+                                       mGoodData = false;
+                                       return buffer;
+                               }
+                               mSigned = true;
+                               buffer.ReadShort(); // packetSize
+                               buffer.ReadShort(); // unused
+                               mSixteenBit = (buffer.ReadShort() == 16);
+                       } else {
+                               mSigned = false;
+                               buffer.Position(buffer.Position() + 22);
+                               mSixteenBit = (buffer.ReadShort() == 16);
+                               buffer.Position(buffer.Position() + 14);
+                       }
+                       
+                       mBytesPerFrame = (mSixteenBit ? 2 : 1) * (mStereo ? 2 : 1);
+                       mData.resize(frames * mBytesPerFrame);
+                       buffer.ReadBlock(mData.size(), &mData[0]);
+                       break;
+               }
+               default:
+                       wxLogError(wxT("[AppleSoundHeader] Unknown header type %.2x."), headerType);
+                       mGoodData = false;
+                       return buffer;
+       }
+
+       mGoodData = true;
+       return buffer;
+}
+
+BigEndianBuffer& AppleSoundHeader::SaveObject(BigEndianBuffer& buffer)
+{
+       if (mSixteenBit || mStereo || mSigned) {
+               // extended or compressed sound header
+               buffer.WriteULong(0); // samplePtr
+               buffer.WriteLong(mStereo ? 2 : 1);
+               buffer.WriteULong(mSampleRate);
+               buffer.WriteLong(mLoopStart);
+               buffer.WriteLong(mLoopEnd);
+               
+               buffer.WriteUChar((mSigned && !mSixteenBit) ? compressedSoundHeader : extendedSoundHeader);
+               buffer.WriteUChar(mBaseFrequency);
+               buffer.WriteLong(mData.size() / mBytesPerFrame);
+               buffer.WriteZeroes(10); // AIFF rate
+               buffer.WriteULong(0); // marker chunk
+               if (mSigned && !mSixteenBit) {
+                       buffer.Write4CharCode('t', 'w', 'o', 's');
+                       buffer.WriteLong(0); // futureUse2
+                       buffer.WriteULong(0); // stateVars
+                       buffer.WriteULong(0); // leftOverSamples
+                       buffer.WriteShort(-1); // compressionID
+                       buffer.WriteShort(0); // packetSize
+                       buffer.WriteShort(0); // synthID
+                       buffer.WriteShort(mSixteenBit ? 16 : 8);
+               } else {
+                       buffer.WriteULong(0); // instrument chunks
+                       buffer.WriteULong(0); // AESRecording
+                       buffer.WriteShort(mSixteenBit ? 16 : 8);
+                       buffer.WriteZeroes(14); // futureUse1 through futureUse4
+               }
+               buffer.WriteBlock(mData.size(), &mData[0]);
+       } else {
+               // standard sound header
+               buffer.WriteULong(0); // sample ptr
+               buffer.WriteLong(mData.size()); // frames
+               buffer.WriteULong(mSampleRate);
+               buffer.WriteLong(mLoopStart);
+               buffer.WriteLong(mLoopEnd);
+               buffer.WriteUChar(standardSoundHeader);
+               buffer.WriteUChar(mBaseFrequency);
+               buffer.WriteBlock(mData.size(), &mData[0]);
+       }
+
+       return buffer;
+}
+
+static const int kBufferSize = 8192;
+
+// RAII for SNDFILE*
+class SNDFILE_ptr {
+public:
+       SNDFILE_ptr(SNDFILE* file) : mFile(file) {}
+       ~SNDFILE_ptr() { if (mFile) sf_close(mFile); mFile = 0; }
+       SNDFILE* get() { return mFile; }
+private:
+       SNDFILE_ptr(const SNDFILE_ptr&);
+       SNDFILE_ptr& operator= (const SNDFILE_ptr&);
+       SNDFILE* mFile;
+};
+
+bool AppleSoundHeader::LoadFromFile(wxString path)
+{
+       SF_INFO inputInfo;
+       SNDFILE_ptr infile(sf_open(path.fn_str(), SFM_READ, &inputInfo));
+       if (!infile.get()) {
+               wxLogError(wxT("[AppleSoundHeader] libsndfile could not open file."));
+               return false;
+       }
+
+       mSixteenBit = !(inputInfo.format & (SF_FORMAT_PCM_S8 | SF_FORMAT_PCM_U8));
+       if (inputInfo.samplerate <= 44100) {
+               mSampleRate = inputInfo.samplerate << 16;
+       } else {
+               mSampleRate = 44100 << 16;
+       }
+       mStereo = (inputInfo.channels >= 2);
+       mSigned = false;
+       mBytesPerFrame = (mSixteenBit ? 2 : 1) * (mStereo ? 2 : 1);
+       mLoopStart = mLoopEnd = 0;
+       mBaseFrequency = 60;
+       
+       SF_INFO outputInfo;
+       outputInfo.samplerate = mSampleRate >> 16;
+       outputInfo.channels = mStereo ? 2 : 1;
+       if (mSixteenBit) {
+               outputInfo.format = SF_FORMAT_PCM_16 | SF_FORMAT_RAW | SF_ENDIAN_BIG;
+       } else {
+               outputInfo.format = SF_FORMAT_PCM_U8 | SF_FORMAT_RAW | SF_ENDIAN_BIG;
+       }
+
+       SF_VIRTUAL_IO virtual_io = {
+               &sf_adapter::get_filelen,
+               &sf_adapter::seek,
+               &sf_adapter::read,
+               &sf_adapter::write,
+               &sf_adapter::tell };
+       
+       mData.resize(inputInfo.frames * mBytesPerFrame);
+       sf_adapter adapter(mData);
+
+       SNDFILE_ptr outfile(sf_open_virtual(&virtual_io, SFM_WRITE, &outputInfo, &adapter));
+       if (!outfile.get()) {
+               wxLogError(wxT("[AppleSoundHeader] libsndfile write error."));
+               return false;
+       }
+
+       int frames_remaining = inputInfo.frames;
+       while (frames_remaining > 0) {
+               int buf[kBufferSize * 2];
+               int frames = std::min(kBufferSize, frames_remaining);
+               
+               if (sf_readf_int(infile.get(), buf, frames) != frames) {
+                       wxLogError(wxT("[AppleSoundHeader] libsndfile read error."));
+                       return false;
+               }
+               if (sf_writef_int(outfile.get(), buf, frames) != frames) {
+                       wxLogError(wxT("[AppleSoundHeader] libsndfile write error."));
+                       return false;
+               }
+
+               frames_remaining -= frames;
+       }
+
+       return true;
+}
+
+bool AppleSoundHeader::SaveToWaveOrAiff(wxString path, bool aiff)
+{
+       int inputFormat;
+       int outputFormat;
+
+       if (mSixteenBit) {
+               inputFormat = outputFormat = SF_FORMAT_PCM_16;
+       } else if (mSigned) {
+               inputFormat = SF_FORMAT_PCM_S8;
+               outputFormat = SF_FORMAT_PCM_U8;
+       } else {
+               inputFormat = outputFormat = SF_FORMAT_PCM_U8;
+       }
+       
+       SF_INFO outputInfo;
+       outputInfo.samplerate = mSampleRate >> 16;
+       outputInfo.channels = mStereo ? 2 : 1;
+       if (aiff) {
+               outputInfo.format = SF_FORMAT_AIFF | outputFormat;
+       } else {
+               outputInfo.format = SF_FORMAT_WAV | outputFormat;
+       }
+       
+       SNDFILE* outfile = sf_open(path.fn_str(), SFM_WRITE, &outputInfo);
+
+       SF_VIRTUAL_IO virtual_io = {
+               &sf_adapter::get_filelen,
+               &sf_adapter::seek,
+               &sf_adapter::read,
+               &sf_adapter::write,
+               &sf_adapter::tell };
+
+       sf_adapter adapter(mData);
+
+       SF_INFO inputInfo;
+       inputInfo.samplerate = mSampleRate >> 16;
+       inputInfo.channels = mStereo ? 2 : 1;
+       inputInfo.format = SF_FORMAT_RAW | inputFormat | SF_ENDIAN_BIG;
+
+       SNDFILE* infile = sf_open_virtual(&virtual_io, SFM_READ, &inputInfo, &adapter);
+
+       int frames_remaining = mData.size() / mBytesPerFrame;
+       while (frames_remaining) {
+               int buf[kBufferSize * 2];
+               int frames = std::min(kBufferSize, frames_remaining);
+               if (sf_readf_int(infile, buf, frames) != frames) {
+                       wxLogError(wxT("[AppleSoundHeader] libsndfile read error"));
+                       sf_close(infile);
+                       sf_close(outfile);
+                       return false;
+               }
+               if (sf_writef_int(outfile, buf, frames) != frames) {
+                       wxLogError(wxT("[AppleSoundHeader] libsndfile write error"));
+                       sf_close(infile);
+                       sf_close(outfile);
+                       return false;
+               }
+
+               frames_remaining -= frames;
+       }
+       
+       sf_close(infile);
+       sf_close(outfile);
+
+       return true;
+}
+
+void AppleSoundHeader::PlaySound(void)
+{
+       wxString        tempfile = wxFileName::CreateTempFileName(wxT("sf")) + wxString(wxT(".wav"));
+       
+       wxBeginBusyCursor();
+       SaveToWave(tempfile);
+       wxSound(tempfile).Play(wxSOUND_SYNC);
+       wxRemoveFile(tempfile);
+       wxEndBusyCursor();
+}
+
+unsigned int AppleSoundHeader::Size(void)
+{
+       if (mSixteenBit || mStereo || mSigned) {
+               // compressed or extended header
+               return mData.size() + 64;
+       } else {
+               return mData.size() + 22;
+       }
+}
+
+unsigned char* AppleSoundHeader::Data(void)
+{
+       return &mData[0];
+}
+
+SoundsDefinition::SoundsDefinition(bool verbose): SoundsElement(verbose)
+{
+       mSoundCode = -1;
+       mBehaviorIndex = _sound_is_quiet;
+       mFlags = 0;
+       mChance = _always;
+       mSounds.clear();
+}
+
+SoundsDefinition::~SoundsDefinition()
+{
+}
+
+bool SoundsDefinition::HaveSameAttributesAs(const SoundsDefinition& right) const
+{
+       return ((mSoundCode == right.mSoundCode) &&
+                       (mBehaviorIndex == right.mBehaviorIndex) &&
+                       (mFlags == right.mFlags) &&
+                       (mChance == right.mChance) &&
+                       (mLowPitch == right.mLowPitch) &&
+                       (mHighPitch == right.mHighPitch));
+}
+
+bool SoundsDefinition::HaveSameSoundsAs(const SoundsDefinition& right) const
+{
+       return (mSounds == right.mSounds);
+}
+
+bool SoundsDefinition::operator== (const SoundsDefinition& right) const
+{
+       return (HaveSameAttributesAs(right) && HaveSameSoundsAs(right));
+}
+
+bool SoundsDefinition::operator!=(const SoundsDefinition& right) const
+{
+       return (!HaveSameAttributesAs(right) || !HaveSameSoundsAs(right));
+}
+
+unsigned int SoundsDefinition::GetSizeInFile(void)
+{
+       unsigned int    size = SIZEOF_sound_definition;
+
+       for (unsigned int i = 0; i < mSounds.size(); i++)
+               size += mSounds[i].Size();
+       return size;
+}
+
+short SoundsDefinition::GetChance(void) const
+{
+       for (int i = 0; i < 10; i++) {
+               if (mChance == 32768*i/10)
+                       return i;
+       }
+       wxLogDebug(wxT("Invalid chance %d"), mChance);
+       return -1;
+}
+
+void SoundsDefinition::SetChance(short chance)
+{
+       if (chance < 0 || chance > 10)
+               wxLogDebug(wxT("Invalid chance %d"), mChance);
+       mChance = 32768*chance/10;
+}
+
+BigEndianBuffer& SoundsDefinition::SaveObject(BigEndianBuffer& buffer, unsigned int& offset)
+{
+       unsigned int oldpos = buffer.Position();
+       
+       // We write sound_definition header
+       buffer.WriteShort(mSoundCode);
+       
+       buffer.WriteShort(mBehaviorIndex);
+       buffer.WriteUShort(mFlags);
+       
+       buffer.WriteUShort(mChance);
+       
+       float   low_pitch_integer, low_pitch_fractional,
+                       high_pitch_integer, high_pitch_fractional;
+       long    low_pitch = 0, high_pitch = 0;
+       
+       // float to fixed
+       low_pitch_fractional = modff(mLowPitch, &low_pitch_integer);
+       low_pitch |= (((short)low_pitch_integer) << 16) & 0xffff0000;
+       low_pitch |= (short)roundf(low_pitch_fractional * 0xffff) & 0x0000ffff;
+       
+       high_pitch_fractional = modff(mHighPitch, &high_pitch_integer);
+       high_pitch |= (((short)high_pitch_integer) << 16) & 0xffff0000;
+       high_pitch |= (short)roundf(high_pitch_fractional * 0xffff) & 0x0000ffff;
+       
+       buffer.WriteLong(low_pitch);
+       buffer.WriteLong(high_pitch);
+       
+       buffer.WriteShort(mSounds.size());
+       buffer.WriteUShort(mPermutationsPlayed);
+       
+       // We need to recalculate those fields...
+       unsigned long single_length = (mSounds.size() >= 1 ? mSounds[0].Size() : 0);
+       unsigned long total_length = single_length;
+       std::vector<long> soundOffsets;
+       soundOffsets.push_back(0);
+       
+       // ... and the corresponding offsets ...
+       for (unsigned int i = 1; i < mSounds.size(); i++) {
+               soundOffsets.push_back(total_length);
+               total_length += mSounds[i].Size();
+       }
+       
+       // ... and write everything
+       buffer.WriteLong(offset);
+       buffer.WriteLong(single_length);
+       buffer.WriteLong(total_length);
+       
+       // We have to pad with zeroes, as engine always expect MAXIMUM_PERMUTATIONS_PER_SOUND sound offsets...
+       for (unsigned int i = 0; i < MAXIMUM_PERMUTATIONS_PER_SOUND; i++) {
+               if (i < soundOffsets.size())
+                       buffer.WriteLong(soundOffsets[i]);
+               else
+                       buffer.WriteLong(0);
+       }
+       
+       buffer.WriteULong(mLastPlayed);
+       
+       // Now, we write actual sound data where it belongs...
+       buffer.Position(offset);
+       
+       for (unsigned int i = 0; i < mSounds.size(); i++) {
+               mSounds[i].SaveObject(buffer);
+       }
+       
+       // We put back position to the end of the written sound_definition...
+       buffer.Position(oldpos + SIZEOF_sound_definition);
+       // ... and add our total_length to the offset, so that next invocation
+       // writes its sound data at the correct place.
+       offset += total_length;
+       
+       return buffer;
+}
+
+BigEndianBuffer& SoundsDefinition::LoadObject(BigEndianBuffer& buffer)
+{
+       mSoundCode = buffer.ReadShort();
+
+       mBehaviorIndex = buffer.ReadShort();
+       mFlags = buffer.ReadUShort();
+       
+       mChance = buffer.ReadUShort();
+       
+       if ((mBehaviorIndex > NUMBER_OF_SOUND_BEHAVIOR_DEFINITIONS) || (mChance > _ten_percent)) {
+               wxLogError(wxT("[SoundsDefinition] incorrect Behavior/Chance (%d/%d)"), mBehaviorIndex, mChance);
+               return buffer;
+       }
+       
+       wxInt32         low_pitch_fixed, high_pitch_fixed;
+       
+       low_pitch_fixed = buffer.ReadLong();
+       high_pitch_fixed = buffer.ReadLong();
+       
+       mLowPitch = ((low_pitch_fixed >> 16) & 0xffff) + (float)(low_pitch_fixed & 0xffff) / 65536.0;   // convert fixed point [0,1] to float
+       mHighPitch = ((high_pitch_fixed >> 16) & 0xffff) + (float)(high_pitch_fixed & 0xffff) / 65536.0;        // convert fixed point [0,1] to float
+
+       short permutations = buffer.ReadShort();
+       
+       if (permutations < 0 || permutations > MAXIMUM_PERMUTATIONS_PER_SOUND) {
+               wxLogError(wxT("[SoundsDefinition] incorrect permutation count : %d"), permutations);
+               return buffer;
+       }
+       
+       mPermutationsPlayed = buffer.ReadUShort();
+       int groupOffset = buffer.ReadULong();
+       int singleLength = buffer.ReadULong();
+       int totalLength = buffer.ReadULong();
+       
+       // Bug fix for RED Sounds : When groupOffset is out of bounds, consider sound empty.
+       if (groupOffset < 0)
+               permutations = 0;
+       
+       if (permutations != 0 && (unsigned int)(groupOffset + totalLength) > buffer.Size()) {
+               wxLogError(wxT("[SoundsDefinition] incorrect group offset / total length (%d/%d)"), groupOffset, totalLength);
+               return buffer;
+       }
+       
+       std::vector<long> soundOffsets;
+       
+       soundOffsets.resize(MAXIMUM_PERMUTATIONS_PER_SOUND);
+       for (unsigned int i = 0; i < MAXIMUM_PERMUTATIONS_PER_SOUND; i++) {
+               soundOffsets[i] = buffer.ReadLong();
+       }
+       
+       mLastPlayed = buffer.ReadULong();
+       
+       if (IsVerbose()) {
+               wxLogDebug(wxT("[SoundsDefinition] Sound Code:                  %d"), mSoundCode);
+               wxLogDebug(wxT("[SoundsDefinition] Behavior Index:              %d"), mBehaviorIndex);
+               wxLogDebug(wxT("[SoundsDefinition] Flags:                               %d"), mFlags);
+               wxLogDebug(wxT("[SoundsDefinition] Chance:                              %d"), mChance);
+               wxLogDebug(wxT("[SoundsDefinition] Low Pitch:                   %f"), mLowPitch);
+               wxLogDebug(wxT("[SoundsDefinition] High Pitch:                  %f"), mHighPitch);
+               wxLogDebug(wxT("[SoundsDefinition] Permutations:                %d"), permutations);
+               wxLogDebug(wxT("[SoundsDefinition] Permutations Played: %d"), mPermutationsPlayed);
+               wxLogDebug(wxT("[SoundsDefinition] Group Offset:                %d"), groupOffset);
+               wxLogDebug(wxT("[SoundsDefinition] Single Length:               %d"), singleLength);
+               wxLogDebug(wxT("[SoundsDefinition] Total Length:                %d"), totalLength);
+               wxLogDebug(wxT("[SoundsDefinition] Last Played:                 %d"), mLastPlayed);
+       }
+       
+       // Now we load actual sound data
+       // We save our current position, 'coz we need to restore it at the end
+       unsigned int oldpos = buffer.Position();
+
+       for (short i = 0; i < permutations; i++) {
+               unsigned int size = 0;
+               if (permutations == 1)
+                       size = singleLength;
+               else if (i == permutations - 1)
+                       size = totalLength - soundOffsets[i];
+               else
+                       size = soundOffsets[i + 1] - soundOffsets[i];
+               
+               AppleSoundHeader sndbuffer(IsVerbose());
+
+               buffer.Position(groupOffset + soundOffsets[i]);
+               sndbuffer.LoadObject(buffer);
+               if (sndbuffer.IsGood()) {
+                       mSounds.push_back(sndbuffer);
+               } else {
+                       mGoodData = false;
+                       return buffer;
+               }
+       }
+
+       buffer.Position(oldpos);
+       
+       mGoodData = true;
+       return buffer;
+}
+
+AppleSoundHeader* SoundsDefinition::GetPermutation(unsigned int permutation_index)
+{
+       if (permutation_index >= mSounds.size())
+               return NULL;
+       return &mSounds[permutation_index];
+}
+
+void SoundsDefinition::DeletePermutation(unsigned int permutation_index)
+{
+       mSounds.erase(mSounds.begin() + permutation_index);
+}
+
+AppleSoundHeader* SoundsDefinition::NewPermutation(wxString path)
+{
+       if (mSounds.size() >= MAXIMUM_PERMUTATIONS_PER_SOUND) {
+               return NULL;
+       }
+
+       AppleSoundHeader header(IsVerbose());
+       if (header.LoadFromFile(path)) {
+               mSounds.push_back(header);
+               return &mSounds.back();
+       } else {
+               return NULL;
+       }
+}
diff --git a/Sounds/SoundsElements.h b/Sounds/SoundsElements.h
new file mode 100644 (file)
index 0000000..d502742
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef SOUNDSELEMENTS_H
+#define SOUNDSELEMENTS_H
+
+#include <fstream>
+#include <vector>
+using std::vector;
+
+#include "../BigEndianBuffer.h"
+
+/* ---------- constants */
+
+#define MAXIMUM_PERMUTATIONS_PER_SOUND         5
+#define SOUND_FILE_VERSION                                     1
+#define SIZEOF_sound_file_header                       260
+#define SIZEOF_sound_definition                                64
+
+enum /* sound behaviors */
+{
+       _sound_is_quiet,
+       _sound_is_normal,
+       _sound_is_loud,
+       NUMBER_OF_SOUND_BEHAVIOR_DEFINITIONS
+};
+
+enum // Sounds flags
+{
+       _sound_cannot_be_restarted= 0x0001,
+       _sound_does_not_self_abort= 0x0002,
+       _sound_resists_pitch_changes= 0x0004, // 0.5 external pitch changes
+       _sound_cannot_change_pitch= 0x0008, // no external pitch changes
+       _sound_cannot_be_obstructed= 0x0010, // ignore obstructions
+       _sound_cannot_be_media_obstructed= 0x0020, // ignore media obstructions
+       _sound_is_ambient= 0x0040 // will not be loaded unless _ambient_sound_flag is asserted
+};
+
+enum /* sound chances */
+{
+       _ten_percent= 32768*9/10,
+       _twenty_percent= 32768*8/10,
+       _thirty_percent= 32768*7/10,
+       _fourty_percent= 32768*6/10,
+       _fifty_percent= 32768*5/10,
+       _sixty_percent= 32768*4/10,
+       _seventy_percent= 32768*3/10,
+       _eighty_percent= 32768*2/10,
+       _ninty_percent= 32768*1/10,
+       _always= 0
+};
+
+/* ---------- structures */
+
+/*typedef struct {
+       short sound_index;
+}  ambient_sound_definition;
+
+typedef struct {
+       short sound_index;
+} random_sound_definition;*/
+
+class SoundsElement // : public wxObject
+{
+private:
+       bool    mVerboseLoading;
+
+protected:
+       // So that subclasses can change their status
+       bool    mGoodData;
+
+public:
+       SoundsElement(bool verbose) : mVerboseLoading(verbose), mGoodData(false) {}
+       ~SoundsElement(void) {}
+       
+       bool IsGood() const {return mGoodData;}
+       bool IsVerbose() const {return mVerboseLoading;}
+};
+
+class AppleSoundHeader : public SoundsElement
+{
+private:
+       // Stuff for reading System 7 Sound info
+       /*sampled sound header encoding options*/
+       enum {
+               standardSoundHeader             = 0x00,
+               extendedSoundHeader             = 0xFF,
+               compressedSoundHeader   = 0xFE
+       };
+
+       bool mSixteenBit;
+       bool mStereo;
+       bool mSigned;
+       int mBytesPerFrame;
+       unsigned int mSampleRate; // 16.16 unsigned fixed
+       int mLoopStart;
+       int mLoopEnd;
+       unsigned char mBaseFrequency;
+
+       std::vector<unsigned char> mData;
+
+       bool SaveToWaveOrAiff(wxString path, bool aiff);
+
+public:
+       AppleSoundHeader(bool verbose = false);
+       ~AppleSoundHeader();
+
+       bool operator==(const AppleSoundHeader& right) const;
+       
+       bool LoadFromFile(wxString path);
+       bool LoadFromWave(wxString path);
+       bool SaveToWave(wxString path) { return SaveToWaveOrAiff(path, false); }
+       bool LoadFromAiff(wxString path);
+       bool SaveToAiff(wxString path) { return SaveToWaveOrAiff(path, true); }
+       void PlaySound(void);
+
+       bool IsSixteenBit() const { return mSixteenBit; }
+       bool IsStereo() const { return mStereo; }
+       bool IsSigned() const { return mSigned; }
+       int GetBytesPerFrame() const { return mBytesPerFrame; }
+       unsigned int GetSampleRate() const { return mSampleRate; }
+       
+       void SetSixteenBit(bool s) { mSixteenBit = s; }
+       void SetStereo(bool s) { mStereo = s; }
+       void SetSigned(bool s) { mSigned = s; }
+       void SetBytesPerFrame(int b) { mBytesPerFrame = b; }
+       void SetSampleRate(unsigned int sr) { mSampleRate = sr; }
+
+       // Utilities
+       unsigned int Size(void);
+       unsigned char* Data(void);
+    BigEndianBuffer& SaveObject(BigEndianBuffer& buffer);
+    BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+};
+
+class SoundsDefinition : public SoundsElement 
+{
+private:
+       /* Marathon Sound Definition */
+       short mSoundCode;
+       short mBehaviorIndex;
+       unsigned short mFlags;
+       unsigned short mChance; // play sound if AbsRandom()>=chance
+       /* if low_pitch==0, use FIXED_ONE;
+        * if high_pitch==0 use low pitch;
+        * else choose in [low_pitch,high_pitch]
+        */
+       float mLowPitch, mHighPitch;
+       /* filled in later */
+//     short mPermutations;
+       unsigned short mPermutationsPlayed;
+//     int mGroupOffset, mSingleLength, mTotalLength; // magic numbers necessary to load sounds
+//     std::vector<int> mSoundOffsets;
+       std::vector<AppleSoundHeader> mSounds;
+       unsigned int mLastPlayed; // machine ticks
+       // Pointer to loaded sound and size of sound object pointed to
+//     short *ptr;
+//     int size;
+       
+       bool mRemap8bit;
+
+public:
+       SoundsDefinition(bool verbose = false);
+       ~SoundsDefinition();
+       
+       bool HaveSameAttributesAs(const SoundsDefinition& right) const;
+       bool HaveSameSoundsAs(const SoundsDefinition& right) const;
+       bool operator== (const SoundsDefinition& right) const;
+       bool operator!=(const SoundsDefinition& right) const;
+       
+       short GetSoundCode(void) const {return mSoundCode;}
+       short GetBehaviorIndex(void) const {return mBehaviorIndex;}
+       
+       bool IsNotRestartable(void) const {return mFlags & _sound_cannot_be_restarted;}
+       bool IsNotSelfAbortable(void) const {return mFlags & _sound_does_not_self_abort;}
+       bool IsPitchChangeResistant(void) const {return mFlags & _sound_resists_pitch_changes;}
+       bool IsNotPitchChangeable(void) const {return mFlags & _sound_cannot_change_pitch;}
+       bool IsNotObstructed(void) const {return mFlags & _sound_cannot_be_obstructed;}
+       bool IsNotMediaObstructed(void) const {return mFlags & _sound_cannot_be_media_obstructed;}
+       bool IsAmbient(void) const {return mFlags & _sound_is_ambient;}
+       
+       short GetChance(void) const;
+       
+       float GetLowPitch(void) const {return mLowPitch;}
+       float GetHighPitch(void) const {return mHighPitch;}
+       
+       void SetSoundCode(short s) {mSoundCode = s;}
+       void SetBehaviorIndex(int i) {mBehaviorIndex = i;}
+       
+       void SetNotRestartable(bool f) {mFlags |= _sound_cannot_be_restarted;}
+       void SetNotSelfAbortable(bool f) {mFlags |= _sound_does_not_self_abort;}
+       void SetPitchChangeResistant(bool b) {mFlags |= _sound_resists_pitch_changes;}
+       void SetNotPitchChangeable(bool b) {mFlags |= _sound_cannot_change_pitch;}
+       void SetNotObstructed(bool b) {mFlags |= _sound_cannot_be_obstructed;}
+       void SetNotMediaObstructed(bool b) {mFlags |= _sound_cannot_be_media_obstructed;}
+       void SetAmbient(bool b) {mFlags |= _sound_is_ambient;}
+       
+       void SetChance(short i);
+       
+       void SetLowPitch(int p) {mLowPitch = p;}
+       void SetHighPitch(int p) {mHighPitch = p;}
+       
+       unsigned int GetPermutationCount(void) const {return mSounds.size();}
+       void DeletePermutation(unsigned int permutation_index);
+       AppleSoundHeader* GetPermutation(unsigned int permutation_index);
+       AppleSoundHeader* NewPermutation(wxString path);
+       
+       // Utilities
+       unsigned int GetSizeInFile(void);
+    BigEndianBuffer& SaveObject(BigEndianBuffer& buffer, unsigned int& offset);
+    BigEndianBuffer& LoadObject(BigEndianBuffer& buffer);
+};
+
+#endif
+
diff --git a/Sounds/SoundsView.cpp b/Sounds/SoundsView.cpp
new file mode 100644 (file)
index 0000000..f4ea028
--- /dev/null
@@ -0,0 +1,582 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include "wx/wfstream.h"
+
+#include "../ShapeFusionApp.h"
+#include "../ShapeFusionMenus.h"
+#include "../DefaultNames.h"
+#include "SoundsView.h"
+
+BEGIN_EVENT_TABLE(SoundsView, wxView)
+       EVT_LISTBOX(SOUND_CLASS_LIST, SoundsView::SoundClassChanged)
+       EVT_TEXT(SOUND_CLASS_ID_FIELD, SoundsView::SoundClassIdChanged)
+       EVT_RADIOBOX(SOUND_VOLUME_RADIO_BUTTON, SoundsView::VolumeButtonChanged)
+       EVT_CHOICE(SOUND_CHANCE_MENU, SoundsView::ChanceMenuChanged)
+       EVT_CHECKBOX(SOUND_FLAGS_RESTART, SoundsView::FlagsChanged)
+       EVT_CHECKBOX(SOUND_FLAGS_ABORT, SoundsView::FlagsChanged)
+       EVT_CHECKBOX(SOUND_FLAGS_RESIST, SoundsView::FlagsChanged)
+       EVT_CHECKBOX(SOUND_FLAGS_CHANGE, SoundsView::FlagsChanged)
+       EVT_CHECKBOX(SOUND_FLAGS_OBSTRUCTED, SoundsView::FlagsChanged)
+       EVT_CHECKBOX(SOUND_FLAGS_MOBSTRUCTED, SoundsView::FlagsChanged)
+       EVT_CHECKBOX(SOUND_FLAGS_AMBIENT, SoundsView::FlagsChanged)
+       EVT_LISTBOX(SOUND_EIGHT_BIT_PERMUTATIONS_LIST, SoundsView::SoundPermutationSelected)
+       EVT_LISTBOX(SOUND_SIXTEEN_BIT_PERMUTATIONS_LIST, SoundsView::SoundPermutationSelected)
+       EVT_LISTBOX_DCLICK(SOUND_EIGHT_BIT_PERMUTATIONS_LIST, SoundsView::SoundPermutationDoubleClicked)
+       EVT_LISTBOX_DCLICK(SOUND_SIXTEEN_BIT_PERMUTATIONS_LIST, SoundsView::SoundPermutationDoubleClicked)
+       EVT_MENU(EDIT_MENU_DELETE, SoundsView::MenuDelete)
+       EVT_MENU(SOUNDS_MENU_ADDCLASS, SoundsView::MenuAddSoundClass)
+       EVT_MENU(SOUNDS_MENU_EXPORT, SoundsView::MenuExportSound)
+       EVT_MENU(SOUNDS_MENU_IMPORT, SoundsView::MenuImportSound)
+END_EVENT_TABLE()
+
+IMPLEMENT_DYNAMIC_CLASS(SoundsView, wxView)
+
+SoundsView::SoundsView(): mSoundClass(wxNOT_FOUND), mSoundSource(wxNOT_FOUND), mSoundPermutation(wxNOT_FOUND)
+{
+       frame = NULL;
+       menubar = NULL;
+       payload = NULL;
+}
+
+// What to do when a view is created. Creates actual
+// windows for displaying the view.
+bool SoundsView::OnCreate(wxDocument *doc, long WXUNUSED(flags))
+{
+       wxString frameTitle = _T("ShapeFusion : Sounds : ");
+
+       frameTitle.Append(doc->GetFilename());
+       
+    frame = wxGetApp().CreateChildFrame(doc, this, frameTitle, wxPoint(0, 0), wxSize(600, 400), wxDEFAULT_FRAME_STYLE);// & ~ (wxRESIZE_BORDER | wxRESIZE_BOX | wxMAXIMIZE_BOX));
+       
+       payload = (SoundsDocument*)doc;
+       
+       menubar = frame->GetMenuBar();  
+       CreateSoundsMenu(menubar);
+       
+       // Because we can always add sound classes
+       menubar->Enable(SOUNDS_MENU_ADDCLASS, true);
+
+       wxString volume_labels[] = { wxT("Soft"), wxT("Medium"), wxT("Loud") };
+       wxString chances_labels[] = { wxT("100%"), wxT("90%"), wxT("80%"), wxT("70%"), wxT("60%"), wxT("50%"), wxT("40%"), wxT("30%"), wxT("20%"), wxT("10%") };
+
+       main_panel = new wxPanel(frame);
+       main_panel->Show();
+       
+       sound_class_text = new wxStaticText(main_panel, wxID_ANY, wxT("Sound classes: "));
+       sound_class_id_text = new wxStaticText(main_panel, wxID_ANY, wxT("Class ID: "));
+       sound_class_id_field = new wxTextCtrl(main_panel, SOUND_CLASS_ID_FIELD, wxT(""));
+       
+       sound_class_number_text = new wxStaticText(main_panel, wxID_ANY, wxT("Class number: "));
+       sound_class_number_field = new wxStaticText(main_panel, SOUND_CLASS_NUMBER_FIELD, wxT(""));
+       
+       sound_class_list = new wxListBox(main_panel, (wxWindowID)SOUND_CLASS_LIST);
+       
+       sound_flag_restart_checkbox = new wxCheckBox(main_panel, SOUND_FLAGS_RESTART, wxT("Cannot be restarted"));
+       sound_flag_abort_checkbox = new wxCheckBox(main_panel, SOUND_FLAGS_ABORT, wxT("Does not self-abort"));
+       sound_flag_resist_checkbox = new wxCheckBox(main_panel, SOUND_FLAGS_RESIST, wxT("Resists pitch changes"));
+       sound_flag_change_checkbox = new wxCheckBox(main_panel, SOUND_FLAGS_CHANGE, wxT("Can't change pitch"));
+       sound_flag_obstructed_checkbox = new wxCheckBox(main_panel, SOUND_FLAGS_OBSTRUCTED, wxT("Can't be obstructed"));
+       sound_flag_mobstructed_checkbox = new wxCheckBox(main_panel, SOUND_FLAGS_MOBSTRUCTED, wxT("Can't be media obstructed"));
+       sound_flag_ambient_checkbox = new wxCheckBox(main_panel, SOUND_FLAGS_AMBIENT, wxT("Is ambient"));
+       
+       sound_volume_radio_button = new wxRadioBox(main_panel, SOUND_VOLUME_RADIO_BUTTON, wxT("Volume"), wxDefaultPosition, wxDefaultSize, 3, volume_labels, 3, wxRA_SPECIFY_COLS);
+       
+       sound_chance_text = new wxStaticText(main_panel, wxID_ANY, wxT("Chance: "));
+       sound_chance_menu = new wxChoice(main_panel, SOUND_CHANCE_MENU, wxDefaultPosition, wxDefaultSize, 10, chances_labels);
+       
+       sound_low_pitch_text = new wxStaticText(main_panel, wxID_ANY, wxT("Low pitch: "));
+       sound_low_pitch_field = new wxTextCtrl(main_panel, SOUND_LOW_PITCH_FIELD);
+       sound_high_pitch_text = new wxStaticText(main_panel, wxID_ANY, wxT("High pitch: "));
+       sound_high_pitch_field = new wxTextCtrl(main_panel, SOUND_HIGH_PITCH_FIELD);
+       
+       sound_eight_bit_text = new wxStaticText(main_panel, wxID_ANY, wxT("8-bit sounds:"));
+       sound_eight_bit_list = new wxListBox(main_panel, (wxWindowID)SOUND_EIGHT_BIT_PERMUTATIONS_LIST);
+       
+       sound_sixteen_bit_text = new wxStaticText(main_panel, wxID_ANY, wxT("16-bit sounds: "));
+       sound_sixteen_bit_list = new wxListBox(main_panel, (wxWindowID)SOUND_SIXTEEN_BIT_PERMUTATIONS_LIST);
+       
+       sound_remap_check_box = new wxCheckBox(main_panel, SOUND_REMAP_CHECK_BOX, wxT("Remap 8-bit"));
+       
+       frame_sizer = new wxBoxSizer(wxHORIZONTAL);
+       sound_class_sizer = new wxBoxSizer(wxVERTICAL);
+       sound_class_header_sizer = new wxFlexGridSizer(2, 2, 0, 0);
+       sound_editor_sizer = new wxBoxSizer(wxVERTICAL);
+       sound_flags_sizer = new wxStaticBoxSizer(wxVERTICAL, main_panel, wxT("Flags"));
+       sound_menus_sizer = new wxFlexGridSizer(2, 3, 0, 0);
+       sound_permutation_sizer = new wxBoxSizer(wxHORIZONTAL);
+       sound_eight_bit_sizer = new wxBoxSizer(wxVERTICAL);
+       sound_sixteen_bit_sizer = new wxBoxSizer(wxVERTICAL);
+       
+       sound_class_header_sizer->Add(sound_class_id_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+       sound_class_header_sizer->Add(sound_class_id_field, 0, 0, 0);
+       sound_class_header_sizer->Add(sound_class_number_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+       sound_class_header_sizer->Add(sound_class_number_field, 0, 0, 0);
+       
+       sound_class_sizer->Add(sound_class_text, 0, 0, 0);
+       sound_class_sizer->Add(sound_class_header_sizer, 0, 0, 0);
+       sound_class_sizer->Add(sound_class_list, 1, wxEXPAND, 0);
+       
+       sound_flags_sizer->Add(sound_flag_restart_checkbox, 0, 0, 0);
+       sound_flags_sizer->Add(sound_flag_abort_checkbox, 0, 0, 0);
+       sound_flags_sizer->Add(sound_flag_resist_checkbox, 0, 0, 0);
+       sound_flags_sizer->Add(sound_flag_change_checkbox, 0, 0, 0);
+       sound_flags_sizer->Add(sound_flag_obstructed_checkbox, 0, 0, 0);
+       sound_flags_sizer->Add(sound_flag_mobstructed_checkbox, 0, 0, 0);
+       sound_flags_sizer->Add(sound_flag_ambient_checkbox, 0, 0, 0);
+       
+       sound_menus_sizer->Add(sound_chance_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+       sound_menus_sizer->Add(sound_chance_menu, 0, 0, 0);
+       sound_menus_sizer->Add(sound_low_pitch_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+       sound_menus_sizer->Add(sound_low_pitch_field, 0, 0, 0);
+       sound_menus_sizer->Add(sound_high_pitch_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+       sound_menus_sizer->Add(sound_high_pitch_field, 0, 0, 0);
+       
+       sound_eight_bit_sizer->Add(sound_eight_bit_text, 0, 0, 0);
+       sound_eight_bit_sizer->Add(sound_eight_bit_list, 1, wxEXPAND | wxRIGHT, 5);
+       sound_sixteen_bit_sizer->Add(sound_sixteen_bit_text, 0, 0, 0);
+       sound_sixteen_bit_sizer->Add(sound_sixteen_bit_list, 1, wxEXPAND, 0);
+       sound_sixteen_bit_sizer->Add(sound_remap_check_box, 0, 0, 0);
+       
+       sound_permutation_sizer->Add(sound_eight_bit_sizer, 1, wxEXPAND, 0);
+       sound_permutation_sizer->Add(sound_sixteen_bit_sizer, 1, wxEXPAND, 0);
+       
+       sound_editor_sizer->Add(sound_flags_sizer, 0, 0, 0);
+       sound_editor_sizer->AddSpacer(1);
+       sound_editor_sizer->Add(sound_volume_radio_button, 0, 0, 0);
+       sound_editor_sizer->AddSpacer(1);
+       sound_editor_sizer->Add(sound_menus_sizer, 0, 0, 0);
+       sound_editor_sizer->AddSpacer(5);
+       sound_editor_sizer->Add(sound_permutation_sizer, 1, wxEXPAND, 0);
+       
+       frame_sizer->Add(sound_class_sizer, 0, wxEXPAND | wxALL, 5);
+       frame_sizer->AddSpacer(5);
+       frame_sizer->Add(sound_editor_sizer, 0, wxEXPAND | wxALL, 5);
+       
+       main_panel->SetSizer(frame_sizer);
+       frame_sizer->Layout();
+       frame_sizer->SetSizeHints(frame);
+       
+       frame->Show(true);
+#ifdef __X__
+       // X seems to require a forced resize
+       int x, y;
+       frame->GetSize(&x, &y);
+       frame->SetSize(wxDefaultCoord, wxDefaultCoord, x, y);
+#endif
+       
+       return true;
+}
+
+// Sneakily gets used for default print/preview
+// as well as drawing on the screen.
+void SoundsView::OnDraw(wxDC *dc)
+{
+}
+
+void SoundsView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint))
+{
+       bool    gequals = true;
+
+       sound_class_list->Clear();
+       for (unsigned int i = 0; i < payload->GetSoundCount(); i++) {
+               sound_class_list->Append(GetName(wxT("sound"), i));
+               // We check if there is a difference between 8-bit and 16-bit
+               // SoundsDefinitions
+               SoundsDefinition        *def8 = payload->Get8BitSoundDefinition(i),
+                                                       *def16 = payload->Get16BitSoundDefinition(i);
+               bool                            equals = false;
+
+               if (def8 != NULL && def16 != NULL)
+                       equals = def8->HaveSameAttributesAs(*def16);
+               else if (def8 == NULL && def16 == NULL)
+                       equals = true;
+
+               if (!equals)
+                       wxLogDebug(wxT("Sound source different at %d"), i);
+               gequals = gequals && equals;
+       }
+       if (!gequals) {
+               // FIXME : Update this when we have a "complete" editor...
+               wxMessageDialog msg(frame,
+                                               wxT("It seems 8-bit and 16-bit versions of some of this Sound file "
+                                               "sounds have differences. This editor will replace 16-bit sounds "
+                                               "flags with those from 8-bit sounds, to ensure consistency. "
+                                               "If you really need to be able to change 16-bit flags independently, "
+                                               "please file a feature request."),
+                                               wxT("Warning !"), wxOK | wxICON_WARNING);
+                                               
+               msg.ShowModal();
+       }
+       Update();
+}
+
+void SoundsView::Update(void)
+{
+       // We disable our menuitems, in case selection is invalid 
+       menubar->Enable(SOUNDS_MENU_IMPORT, false);
+       menubar->Enable(SOUNDS_MENU_EXPORT, false);
+       menubar->Enable(EDIT_MENU_DELETE, false);
+       
+       if (sound_class_list->GetCount() == 0) {
+               // There is no sound class
+               // We cannot have a selection
+               mSoundPermutation = wxNOT_FOUND;
+               mSoundSource = wxNOT_FOUND;
+
+       } else {
+               // We have a sound class
+               
+               // Make sure we always have something selected
+               mSoundClass = sound_class_list->GetSelection();
+               if (mSoundClass == wxNOT_FOUND) {
+                       wxLogDebug(wxT("[SoundsView] There is no sound selected. Selecting first item..."));
+                       sound_class_list->SetSelection(0);
+                       mSoundClass = sound_class_list->GetSelection();
+               }
+               
+               // We build the permutations listbox
+               sound_eight_bit_list->Clear();
+               sound_sixteen_bit_list->Clear();
+               
+               SoundsDefinition *def = payload->Get8BitSoundDefinition(mSoundClass);
+               if (def) {
+                       for (unsigned int i = 0; i < def->GetPermutationCount(); i++) {
+                               sound_eight_bit_list->Append(wxString::Format(wxT("%d"), def->GetPermutation(i)->Size()));
+                       }
+               }
+               
+               def = payload->Get16BitSoundDefinition(mSoundClass);
+               if (def) {
+                       for (unsigned int i = 0; i < def->GetPermutationCount(); i++) {
+                               sound_sixteen_bit_list->Append(wxString::Format(wxT("%d"), def->GetPermutation(i)->Size()));
+                       }
+               }
+               
+               // As soon as we have a sound class selected, we can
+               // - import a sound into it
+               // - delete it
+               menubar->Enable(SOUNDS_MENU_IMPORT, true);
+               menubar->Enable(EDIT_MENU_DELETE, true);
+               
+               if (payload->Get8BitSoundDefinition(mSoundClass)->GetPermutationCount() != 0) {
+                       // There is 8-bit sounds, we select first
+                       mSoundSource = 0;
+                       mSoundPermutation = 0;
+                       sound_eight_bit_list->SetSelection(0);
+                       // We deselect 16-bit list
+                       sound_sixteen_bit_list->SetSelection(wxNOT_FOUND);
+               } else {
+                       // There is no 8-bit sounds
+                       if (payload->Get16BitSoundDefinition(mSoundClass)->GetPermutationCount() != 0) {
+                               // We have 16-bit sounds, we select this one...
+                               mSoundSource = 1;
+                               mSoundPermutation = 0;
+                               sound_sixteen_bit_list->SetSelection(0);
+                               // We deselect 8-bit list
+                               sound_eight_bit_list->SetSelection(wxNOT_FOUND);
+                       } else {
+                               // There is neither 8-bit nor 16-bit sounds, don't select anything
+                               sound_eight_bit_list->SetSelection(wxNOT_FOUND);
+                               sound_sixteen_bit_list->SetSelection(wxNOT_FOUND);
+                               mSoundSource = wxNOT_FOUND;
+                               mSoundPermutation = wxNOT_FOUND;
+                       }
+               }
+               
+               // We enable this, our selection is valid...
+               menubar->Enable(SOUNDS_MENU_EXPORT, true);
+               
+               def = payload->Get8BitSoundDefinition(mSoundClass);
+                               
+               sound_class_number_field->SetLabel(wxString::Format(wxT("%d"), mSoundClass));
+               sound_class_id_field->ChangeValue(wxString::Format(wxT("%d"), def->GetSoundCode()));
+               
+               sound_volume_radio_button->SetSelection(def->GetBehaviorIndex());
+               sound_chance_menu->SetSelection(def->GetChance());
+               
+               sound_flag_restart_checkbox->SetValue(def->IsNotRestartable());
+               sound_flag_abort_checkbox->SetValue(def->IsNotSelfAbortable());
+               sound_flag_resist_checkbox->SetValue(def->IsPitchChangeResistant());
+               sound_flag_change_checkbox->SetValue(def->IsNotPitchChangeable());
+               sound_flag_obstructed_checkbox->SetValue(def->IsNotObstructed());
+               sound_flag_mobstructed_checkbox->SetValue(def->IsNotMediaObstructed());
+               sound_flag_ambient_checkbox->SetValue(def->IsAmbient());
+               sound_low_pitch_field->ChangeValue(wxString::Format(wxT("%g"), def->GetLowPitch()));
+               sound_high_pitch_field->ChangeValue(wxString::Format(wxT("%g"), def->GetHighPitch()));
+       }
+}
+
+// Clean up windows used for displaying the view.
+bool SoundsView::OnClose(bool deleteWindow)
+{
+       if (!GetDocument()->Close())
+               return false;
+       SetFrame((wxFrame *) NULL);
+       Activate(false);
+       if (deleteWindow) {
+               delete frame;
+               return true;
+       }
+       return true;
+}
+
+void SoundsView::SoundClassChanged(wxCommandEvent &e)
+{
+       Update();
+}
+
+void SoundsView::SoundClassIdChanged(wxCommandEvent& e)
+{
+       long v;
+       if (e.GetString().ToLong(&v))
+       {
+               SoundsDefinition* def = payload->Get8BitSoundDefinition(mSoundClass);
+               def->SetSoundCode(v);
+               
+               def = payload->Get16BitSoundDefinition(mSoundClass);
+               def->SetSoundCode(v);
+       }
+       GetDocument()->Modify(true);
+}
+
+void SoundsView::VolumeButtonChanged(wxCommandEvent &e)
+{
+       SoundsDefinition *def = payload->Get8BitSoundDefinition(mSoundClass);
+       def->SetBehaviorIndex(sound_volume_radio_button->GetSelection());
+       
+       def = payload->Get16BitSoundDefinition(mSoundClass);
+       def->SetBehaviorIndex(sound_volume_radio_button->GetSelection());
+       GetDocument()->Modify(true);
+}
+
+void SoundsView::ChanceMenuChanged(wxCommandEvent &e)
+{
+       SoundsDefinition *def = payload->Get8BitSoundDefinition(mSoundClass);
+       def->SetChance(sound_chance_menu->GetSelection());
+       
+       def = payload->Get16BitSoundDefinition(mSoundClass);
+       def->SetChance(sound_chance_menu->GetSelection());
+       GetDocument()->Modify(true);
+}
+
+void SoundsView::FlagsChanged(wxCommandEvent &e)
+{
+       SoundsDefinition *def8 = payload->Get8BitSoundDefinition(mSoundClass);
+       SoundsDefinition *def16 = payload->Get16BitSoundDefinition(mSoundClass);
+       switch (e.GetId()) {
+               case SOUND_FLAGS_RESTART:
+                       def8->SetNotRestartable(e.IsChecked());
+                       def16->SetNotRestartable(e.IsChecked());
+                       break;
+               case SOUND_FLAGS_ABORT:
+                       def8->SetNotSelfAbortable(e.IsChecked());
+                       def16->SetNotSelfAbortable(e.IsChecked());
+                       break;
+               case SOUND_FLAGS_RESIST:
+                       def8->SetPitchChangeResistant(e.IsChecked());
+                       def16->SetPitchChangeResistant(e.IsChecked());
+                       break;
+               case SOUND_FLAGS_CHANGE:
+                       def8->SetNotPitchChangeable(e.IsChecked());
+                       def16->SetNotPitchChangeable(e.IsChecked());
+                       break;
+               case SOUND_FLAGS_OBSTRUCTED:
+                       def8->SetNotObstructed(e.IsChecked());
+                       def16->SetNotObstructed(e.IsChecked());
+                       break;
+               case SOUND_FLAGS_MOBSTRUCTED:
+                       def8->SetNotMediaObstructed(e.IsChecked());
+                       def16->SetNotMediaObstructed(e.IsChecked());
+                       break;
+               case SOUND_FLAGS_AMBIENT:
+                       def8->SetAmbient(e.IsChecked());
+                       def16->SetAmbient(e.IsChecked());
+                       break;
+               default:
+                       wxLogDebug(wxT("Invalid control id in FlagsChanged"));
+                       break;
+       }
+       GetDocument()->Modify(true);
+}
+
+void SoundsView::LowPitchValueChanged(wxScrollEvent &e)
+{
+       long int l;
+
+       sound_low_pitch_field->GetValue().ToLong(&l);
+       
+       SoundsDefinition *def = payload->Get8BitSoundDefinition(mSoundClass);
+       def->SetLowPitch(l);
+       
+       def = payload->Get16BitSoundDefinition(mSoundClass);
+       def->SetLowPitch(l);
+       GetDocument()->Modify(true);
+}
+
+void SoundsView::HighPitchValueChanged(wxScrollEvent &e)
+{
+       long int l;
+
+       sound_high_pitch_field->GetValue().ToLong(&l);
+       
+       SoundsDefinition *def = payload->Get8BitSoundDefinition(mSoundClass);
+       def->SetHighPitch(l);
+       
+       def = payload->Get16BitSoundDefinition(mSoundClass);
+       def->SetHighPitch(l);
+       GetDocument()->Modify(true);
+}
+
+void SoundsView::MenuDelete(wxCommandEvent &e)
+{
+       wxWindow *win = sound_class_list->FindFocus();
+
+       switch (win->GetId()) {
+               case SOUND_CLASS_LIST:
+                       wxLogDebug(wxT("Delete Sound Class"));
+                       break;
+               case SOUND_EIGHT_BIT_PERMUTATIONS_LIST:
+               case SOUND_SIXTEEN_BIT_PERMUTATIONS_LIST:
+               {
+                       if (mSoundClass == wxNOT_FOUND || mSoundSource == wxNOT_FOUND || mSoundPermutation == wxNOT_FOUND) {
+                               return;
+                       }
+                       
+                       SoundsDefinition* def = payload->GetSoundDefinition(mSoundSource, mSoundClass);
+                       def->DeletePermutation(mSoundPermutation);
+                       Update();
+                       GetDocument()->Modify(true);
+                       break;
+               }
+               default:
+                       break;
+       }
+}
+
+void SoundsView::MenuAddSoundClass(wxCommandEvent &e)
+{
+       wxLogDebug(wxT("Adding an item"));
+       payload->AddSoundDefinition();
+       
+       // We add the new Sound class item by hand
+       sound_class_list->Append(wxString::Format(wxT("Sound %d"), sound_class_list->GetCount()));
+
+       GetDocument()->Modify(true);
+       
+       Update();
+}
+
+void SoundsView::MenuImportSound(wxCommandEvent &e)
+{
+       wxWindow* w = wxWindow::FindFocus();
+       SoundsDefinition* definition = 0;
+       if (w == static_cast<wxWindow*>(sound_sixteen_bit_list)) {
+               definition = payload->Get16BitSoundDefinition(mSoundClass);
+       } else if (w == static_cast<wxWindow*>(sound_eight_bit_list)) {
+               definition = payload->Get8BitSoundDefinition(mSoundClass);
+       } else {
+               wxMessageDialog msg(frame, wxT("Sorry, you need to select a sound class and 8-bit or 16-bit to import a sound"), wxT("Error: No selection"), wxOK | wxICON_EXCLAMATION);
+               msg.ShowModal();
+               return;
+       }
+
+       if (definition->GetPermutationCount() >= MAXIMUM_PERMUTATIONS_PER_SOUND) {
+               wxMessageDialog msg(frame, wxT("There are already five permutations for this sound"), wxT("Error: permutation limit reached"), wxOK | wxICON_EXCLAMATION);
+               msg.ShowModal();
+               return;
+       }
+       
+       wxFileDialog dlg(frame, wxT("Choose a sound file to add"), wxT(""), wxT(""), wxT("Common sound files (AIFF, WAV)|*.aif;*.wav"), wxOPEN);
+       if (dlg.ShowModal() == wxID_OK) {
+               if (definition->NewPermutation(dlg.GetPath()) == NULL) {
+                       wxMessageDialog msg(frame, wxT("Error importing sound"), wxT("Error"), wxOK | wxICON_EXCLAMATION);
+                       msg.ShowModal();
+                       return;
+               }
+       }
+
+       GetDocument()->Modify(true);
+
+       Update();
+}
+
+void SoundsView::MenuExportSound(wxCommandEvent &e)
+{
+       if (mSoundClass == wxNOT_FOUND || mSoundSource == wxNOT_FOUND || mSoundPermutation == wxNOT_FOUND) {
+               wxMessageDialog msg(frame, wxT("Sorry, you need to select a sound class and a permutation to export a sound"), wxT("Error : No selection"), wxOK | wxICON_EXCLAMATION);
+               msg.ShowModal();
+               return;
+       }
+       
+       wxFileDialog dlg(frame, wxT("Choose a file name :"), wxT(""), wxString::Format(wxT("Sound %d-%d.wav"), mSoundClass, mSoundPermutation), wxT("WAV files (*.wav)|*.wav|AIFF files (*.aif)|*.aif"), wxSAVE | wxOVERWRITE_PROMPT);
+
+       if (dlg.ShowModal() == wxID_OK) {
+               SoundsDefinition        *def = payload->GetSoundDefinition(mSoundSource, mSoundClass);
+               AppleSoundHeader        *sound = def->GetPermutation(mSoundPermutation);
+               bool                            result = false;
+
+               switch (dlg.GetFilterIndex()) {
+                       case 0: // Selected *.wav
+                               result = sound->SaveToWave(dlg.GetPath());
+                               break;
+                       case 1: // Selected *.aif
+                               result = sound->SaveToAiff(dlg.GetPath());
+                               break;
+                       default:
+                               break;
+               }
+
+               if (!result)
+                       wxLogDebug(wxT("[SoundsView] Error exporting sound"));
+       }
+}
+
+void SoundsView::SoundPermutationSelected(wxCommandEvent &e)
+{
+       // We unselect the other permutation field
+       if (e.GetId() == SOUND_EIGHT_BIT_PERMUTATIONS_LIST) {
+               wxLogDebug(wxT("Selected 8-bit"));
+               sound_sixteen_bit_list->SetSelection(wxNOT_FOUND);
+               mSoundSource = 0;
+               mSoundPermutation = sound_eight_bit_list->GetSelection();
+       } else if (e.GetId() == SOUND_SIXTEEN_BIT_PERMUTATIONS_LIST) {
+               wxLogDebug(wxT("Selected 16-bit"));
+               sound_eight_bit_list->SetSelection(wxNOT_FOUND);
+               mSoundSource = 1;
+               mSoundPermutation = sound_sixteen_bit_list->GetSelection();
+       }
+}
+
+void SoundsView::SoundPermutationDoubleClicked(wxCommandEvent &e)
+{
+       SoundsDefinition *def = payload->GetSoundDefinition(mSoundSource, mSoundClass);
+       def->GetPermutation(mSoundPermutation)->PlaySound();
+}
+
diff --git a/Sounds/SoundsView.h b/Sounds/SoundsView.h
new file mode 100644 (file)
index 0000000..6f9ec59
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
+ *
+ * ShapeFusion 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.
+ *
+ * ShapeFusion 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 ShapeFusion; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __SOUNDSVIEW_H__
+#define __SOUNDSVIEW_H__
+
+#include "wx/docview.h"
+#include "SoundsDocument.h"
+
+class SoundsView: public wxView
+{
+    DECLARE_DYNAMIC_CLASS(SoundsView)
+private:
+       // control ids
+       enum {
+               SOUND_CLASS_ID_FIELD,
+               SOUND_CLASS_NUMBER_FIELD,
+               SOUND_CLASS_LIST,
+               SOUND_FLAGS_RESTART,
+               SOUND_FLAGS_ABORT,
+               SOUND_FLAGS_RESIST,
+               SOUND_FLAGS_CHANGE,
+               SOUND_FLAGS_OBSTRUCTED,
+               SOUND_FLAGS_MOBSTRUCTED,
+               SOUND_FLAGS_AMBIENT,
+               SOUND_VOLUME_RADIO_BUTTON,
+               SOUND_CHANCE_MENU,
+               SOUND_LOW_PITCH_FIELD,
+               SOUND_HIGH_PITCH_FIELD,
+               SOUND_EIGHT_BIT_PERMUTATIONS_LIST,
+               SOUND_SIXTEEN_BIT_PERMUTATIONS_LIST,
+               SOUND_REMAP_CHECK_BOX
+       };
+
+       wxBoxSizer              *frame_sizer;
+       wxPanel                         *main_panel;
+       wxSizer                         *sound_class_sizer;
+       wxSizer                                 *sound_class_header_sizer;
+       wxStaticText                            *sound_class_text;
+       wxStaticText                            *sound_class_id_text;
+       wxTextCtrl                                      *sound_class_id_field;
+       wxStaticText                            *sound_class_number_text;
+       wxStaticText                            *sound_class_number_field;
+       wxListBox                               *sound_class_list;
+       wxSizer                         *sound_editor_sizer;
+       wxSizer                                 *sound_flags_sizer;
+       wxCheckBox                                      *sound_flag_restart_checkbox;
+       wxCheckBox                                      *sound_flag_abort_checkbox;
+       wxCheckBox                                      *sound_flag_resist_checkbox;
+       wxCheckBox                                      *sound_flag_change_checkbox;
+       wxCheckBox                                      *sound_flag_obstructed_checkbox;
+       wxCheckBox                                      *sound_flag_mobstructed_checkbox;
+       wxCheckBox                                      *sound_flag_ambient_checkbox;
+       wxRadioBox                              *sound_volume_radio_button;
+       wxSizer                                 *sound_menus_sizer;
+       wxStaticText                            *sound_chance_text;
+       wxChoice                                        *sound_chance_menu;
+       wxStaticText                            *sound_low_pitch_text;
+       wxTextCtrl                                      *sound_low_pitch_field;
+       wxStaticText                            *sound_high_pitch_text;
+       wxTextCtrl                                      *sound_high_pitch_field;
+       wxSizer                                 *sound_permutation_sizer;
+       wxSizer                                         *sound_eight_bit_sizer;
+       wxStaticText                                    *sound_eight_bit_text;
+       wxListBox                                               *sound_eight_bit_list;
+       wxSizer                                         *sound_sixteen_bit_sizer;
+       wxStaticText                                    *sound_sixteen_bit_text;
+       wxListBox                                               *sound_sixteen_bit_list;
+       wxCheckBox                                              *sound_remap_check_box;
+
+    wxFrame                    *frame;
+       wxMenuBar               *menubar;
+       SoundsDocument  *payload;
+       int                             mSoundClass,
+                                       mSoundSource,
+                                       mSoundPermutation;
+       
+public:
+    SoundsView(void);
+    ~SoundsView(void) {};
+    
+    bool OnCreate(wxDocument *doc, long flags);
+    void OnDraw(wxDC *dc);
+    void OnUpdate(wxView *sender, wxObject *hint = (wxObject *) NULL);
+    bool OnClose(bool deleteWindow = true);
+
+       void Update(void);
+
+       void SoundClassChanged(wxCommandEvent &e);
+       void SoundClassIdChanged(wxCommandEvent& e);
+       void AddSound(wxCommandEvent &e);
+       void RemoveSound(wxCommandEvent &e);
+       void SourceRadioButtonChanged(wxCommandEvent &e);
+       void VolumeButtonChanged(wxCommandEvent &e);
+       void ChanceMenuChanged(wxCommandEvent &e);
+       void FlagsChanged(wxCommandEvent &e);
+       void LowPitchValueChanged(wxScrollEvent &e);
+       void HighPitchValueChanged(wxScrollEvent &e);
+       void SoundPermutationSelected(wxCommandEvent &e);
+       void SoundPermutationDoubleClicked(wxCommandEvent &e);
+       
+       // Menu events
+       void MenuDelete(wxCommandEvent &e);
+       void MenuAddSoundClass(wxCommandEvent &e);
+       void MenuImportSound(wxCommandEvent &e);
+       void MenuExportSound(wxCommandEvent &e);
+
+       void ExportSound(wxString filepath);
+
+protected:
+    DECLARE_EVENT_TABLE()
+};
+#endif
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..db11b60
--- /dev/null
@@ -0,0 +1,2202 @@
+# generated automatically by aclocal 1.11.2 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 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.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=m4_default([$1], [0.9.0])
+       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+               PKG_CONFIG=""
+       fi
+               
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+    if test -n "$$1"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+                        [pkg_failed=yes])
+    fi
+else
+       pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+        else 
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+       ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+               [$4])
+elif test $pkg_failed = untried; then
+       ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
+               [$4])
+else
+       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+       ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+dnl ---------------------------------------------------------------------------
+dnl Author:          wxWidgets development team,
+dnl                  Francesco Montorsi,
+dnl                  Bob McCown (Mac-testing)
+dnl Creation date:   24/11/2001
+dnl RCS-ID:          $Id$
+dnl ---------------------------------------------------------------------------
+
+dnl ===========================================================================
+dnl Table of Contents of this macro file:
+dnl -------------------------------------
+dnl
+dnl SECTION A: wxWidgets main macros
+dnl  - WX_CONFIG_OPTIONS
+dnl  - WX_CONFIG_CHECK
+dnl  - WXRC_CHECK
+dnl  - WX_STANDARD_OPTIONS
+dnl  - WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS
+dnl  - WX_DETECT_STANDARD_OPTION_VALUES
+dnl
+dnl SECTION B: wxWidgets-related utilities
+dnl  - WX_LIKE_LIBNAME
+dnl  - WX_ARG_ENABLE_YESNOAUTO
+dnl  - WX_ARG_WITH_YESNOAUTO
+dnl
+dnl SECTION C: messages to the user
+dnl  - WX_STANDARD_OPTIONS_SUMMARY_MSG
+dnl  - WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN
+dnl  - WX_STANDARD_OPTIONS_SUMMARY_MSG_END
+dnl  - WX_BOOLOPT_SUMMARY
+dnl
+dnl The special "WX_DEBUG_CONFIGURE" variable can be set to 1 to enable extra
+dnl debug output on stdout from these macros.
+dnl ===========================================================================
+
+
+dnl ---------------------------------------------------------------------------
+dnl Macros for wxWidgets detection. Typically used in configure.in as:
+dnl
+dnl     AC_ARG_ENABLE(...)
+dnl     AC_ARG_WITH(...)
+dnl        ...
+dnl     WX_CONFIG_OPTIONS
+dnl        ...
+dnl        ...
+dnl     WX_CONFIG_CHECK([2.6.0], [wxWin=1])
+dnl     if test "$wxWin" != 1; then
+dnl        AC_MSG_ERROR([
+dnl                wxWidgets must be installed on your system
+dnl                but wx-config script couldn't be found.
+dnl
+dnl                Please check that wx-config is in path, the directory
+dnl                where wxWidgets libraries are installed (returned by
+dnl                'wx-config --libs' command) is in LD_LIBRARY_PATH or
+dnl                equivalent variable and wxWidgets version is 2.3.4 or above.
+dnl        ])
+dnl     fi
+dnl     CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS"
+dnl     CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY"
+dnl     CFLAGS="$CFLAGS $WX_CFLAGS_ONLY"
+dnl
+dnl     LIBS="$LIBS $WX_LIBS"
+dnl
+dnl If you want to support standard --enable-debug/unicode/shared options, you
+dnl may do the following:
+dnl
+dnl     ...
+dnl     AC_CANONICAL_SYSTEM
+dnl
+dnl     # define configure options
+dnl     WX_CONFIG_OPTIONS
+dnl     WX_STANDARD_OPTIONS([debug,unicode,shared,toolkit,wxshared])
+dnl
+dnl     # basic configure checks
+dnl     ...
+dnl
+dnl     # we want to always have DEBUG==WX_DEBUG and UNICODE==WX_UNICODE
+dnl     WX_DEBUG=$DEBUG
+dnl     WX_UNICODE=$UNICODE
+dnl
+dnl     WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS
+dnl     WX_CONFIG_CHECK([2.8.0], [wxWin=1],,[html,core,net,base],[$WXCONFIG_FLAGS])
+dnl     WX_DETECT_STANDARD_OPTION_VALUES
+dnl
+dnl     # write the output files
+dnl     AC_CONFIG_FILES([Makefile ...])
+dnl     AC_OUTPUT
+dnl
+dnl     # optional: just to show a message to the user
+dnl     WX_STANDARD_OPTIONS_SUMMARY_MSG
+dnl
+dnl ---------------------------------------------------------------------------
+
+
+dnl ---------------------------------------------------------------------------
+dnl WX_CONFIG_OPTIONS
+dnl
+dnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and
+dnl --wx-config command line options
+dnl ---------------------------------------------------------------------------
+
+AC_DEFUN([WX_CONFIG_OPTIONS],
+[
+    AC_ARG_WITH(wxdir,
+                [  --with-wxdir=PATH       Use uninstalled version of wxWidgets in PATH],
+                [ wx_config_name="$withval/wx-config"
+                  wx_config_args="--inplace"])
+    AC_ARG_WITH(wx-config,
+                [  --with-wx-config=CONFIG wx-config script to use (optional)],
+                wx_config_name="$withval" )
+    AC_ARG_WITH(wx-prefix,
+                [  --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)],
+                wx_config_prefix="$withval", wx_config_prefix="")
+    AC_ARG_WITH(wx-exec-prefix,
+                [  --with-wx-exec-prefix=PREFIX
+                          Exec prefix where wxWidgets is installed (optional)],
+                wx_config_exec_prefix="$withval", wx_config_exec_prefix="")
+])
+
+dnl Helper macro for checking if wx version is at least $1.$2.$3, set's
+dnl wx_ver_ok=yes if it is:
+AC_DEFUN([_WX_PRIVATE_CHECK_VERSION],
+[
+    wx_ver_ok=""
+    if test "x$WX_VERSION" != x ; then
+      if test $wx_config_major_version -gt $1; then
+        wx_ver_ok=yes
+      else
+        if test $wx_config_major_version -eq $1; then
+           if test $wx_config_minor_version -gt $2; then
+              wx_ver_ok=yes
+           else
+              if test $wx_config_minor_version -eq $2; then
+                 if test $wx_config_micro_version -ge $3; then
+                    wx_ver_ok=yes
+                 fi
+              fi
+           fi
+        fi
+      fi
+    fi
+])
+
+dnl ---------------------------------------------------------------------------
+dnl WX_CONFIG_CHECK(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND
+dnl                  [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]])
+dnl
+dnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC
+dnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME
+dnl environment variable to override the default name of the wx-config script
+dnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this
+dnl case the macro won't even waste time on tests for its existence.
+dnl
+dnl Optional WX-LIBS argument contains comma- or space-separated list of
+dnl wxWidgets libraries to link against. If it is not specified then WX_LIBS
+dnl and WX_LIBS_STATIC will contain flags to link with all of the core
+dnl wxWidgets libraries.
+dnl
+dnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config
+dnl invocation command in present. It can be used to fine-tune lookup of
+dnl best wxWidgets build available.
+dnl
+dnl Example use:
+dnl   WX_CONFIG_CHECK([2.6.0], [wxWin=1], [wxWin=0], [html,core,net]
+dnl                    [--unicode --debug])
+dnl ---------------------------------------------------------------------------
+
+dnl
+dnl Get the cflags and libraries from the wx-config script
+dnl
+AC_DEFUN([WX_CONFIG_CHECK],
+[
+  dnl do we have wx-config name: it can be wx-config or wxd-config or ...
+  if test x${WX_CONFIG_NAME+set} != xset ; then
+     WX_CONFIG_NAME=wx-config
+  fi
+
+  if test "x$wx_config_name" != x ; then
+     WX_CONFIG_NAME="$wx_config_name"
+  fi
+
+  dnl deal with optional prefixes
+  if test x$wx_config_exec_prefix != x ; then
+     wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix"
+     WX_LOOKUP_PATH="$wx_config_exec_prefix/bin"
+  fi
+  if test x$wx_config_prefix != x ; then
+     wx_config_args="$wx_config_args --prefix=$wx_config_prefix"
+     WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin"
+  fi
+  if test "$cross_compiling" = "yes"; then
+     wx_config_args="$wx_config_args --host=$host_alias"
+  fi
+
+  dnl don't search the PATH if WX_CONFIG_NAME is absolute filename
+  if test -x "$WX_CONFIG_NAME" ; then
+     AC_MSG_CHECKING(for wx-config)
+     WX_CONFIG_PATH="$WX_CONFIG_NAME"
+     AC_MSG_RESULT($WX_CONFIG_PATH)
+  else
+     AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, "$WX_LOOKUP_PATH:$PATH")
+  fi
+
+  if test "$WX_CONFIG_PATH" != "no" ; then
+    WX_VERSION=""
+
+    min_wx_version=ifelse([$1], ,2.2.1,$1)
+    if test -z "$5" ; then
+      AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version])
+    else
+      AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)])
+    fi
+
+    dnl don't add the libraries ($4) to this variable as this would result in
+    dnl an error when it's used with --version below
+    WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $5"
+
+    WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null`
+    wx_config_major_version=`echo $WX_VERSION | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    wx_config_minor_version=`echo $WX_VERSION | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    wx_config_micro_version=`echo $WX_VERSION | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+
+    wx_requested_major_version=`echo $min_wx_version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    wx_requested_minor_version=`echo $min_wx_version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    wx_requested_micro_version=`echo $min_wx_version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+
+    _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version],
+                              [$wx_requested_minor_version],
+                              [$wx_requested_micro_version])
+
+    if test -n "$wx_ver_ok"; then
+      AC_MSG_RESULT(yes (version $WX_VERSION))
+      WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs $4`
+
+      dnl is this even still appropriate?  --static is a real option now
+      dnl and WX_CONFIG_WITH_ARGS is likely to contain it if that is
+      dnl what the user actually wants, making this redundant at best.
+      dnl For now keep it in case anyone actually used it in the past.
+      AC_MSG_CHECKING([for wxWidgets static library])
+      WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs $4 2>/dev/null`
+      if test "x$WX_LIBS_STATIC" = "x"; then
+        AC_MSG_RESULT(no)
+      else
+        AC_MSG_RESULT(yes)
+      fi
+
+      dnl starting with version 2.2.6 wx-config has --cppflags argument
+      wx_has_cppflags=""
+      if test $wx_config_major_version -gt 2; then
+        wx_has_cppflags=yes
+      else
+        if test $wx_config_major_version -eq 2; then
+           if test $wx_config_minor_version -gt 2; then
+              wx_has_cppflags=yes
+           else
+              if test $wx_config_minor_version -eq 2; then
+                 if test $wx_config_micro_version -ge 6; then
+                    wx_has_cppflags=yes
+                 fi
+              fi
+           fi
+        fi
+      fi
+
+      dnl starting with version 2.7.0 wx-config has --rescomp option
+      wx_has_rescomp=""
+      if test $wx_config_major_version -gt 2; then
+        wx_has_rescomp=yes
+      else
+        if test $wx_config_major_version -eq 2; then
+           if test $wx_config_minor_version -ge 7; then
+              wx_has_rescomp=yes
+           fi
+        fi
+      fi
+      if test "x$wx_has_rescomp" = x ; then
+         dnl cannot give any useful info for resource compiler
+         WX_RESCOMP=
+      else
+         WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp`
+      fi
+
+      if test "x$wx_has_cppflags" = x ; then
+         dnl no choice but to define all flags like CFLAGS
+         WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags $4`
+         WX_CPPFLAGS=$WX_CFLAGS
+         WX_CXXFLAGS=$WX_CFLAGS
+
+         WX_CFLAGS_ONLY=$WX_CFLAGS
+         WX_CXXFLAGS_ONLY=$WX_CFLAGS
+      else
+         dnl we have CPPFLAGS included in CFLAGS included in CXXFLAGS
+         WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags $4`
+         WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags $4`
+         WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags $4`
+
+         WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"`
+         WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"`
+      fi
+
+      ifelse([$2], , :, [$2])
+
+    else
+
+       if test "x$WX_VERSION" = x; then
+          dnl no wx-config at all
+          AC_MSG_RESULT(no)
+       else
+          AC_MSG_RESULT(no (version $WX_VERSION is not new enough))
+       fi
+
+       WX_CFLAGS=""
+       WX_CPPFLAGS=""
+       WX_CXXFLAGS=""
+       WX_LIBS=""
+       WX_LIBS_STATIC=""
+       WX_RESCOMP=""
+
+       if test ! -z "$5"; then
+
+          wx_error_message="
+    The configuration you asked for $PACKAGE_NAME requires a wxWidgets
+    build with the following settings:
+        $5
+    but such build is not available.
+
+    To see the wxWidgets builds available on this system, please use
+    'wx-config --list' command. To use the default build, returned by
+    'wx-config --selected-config', use the options with their 'auto'
+    default values."
+
+       fi
+
+       wx_error_message="
+    The requested wxWidgets build couldn't be found.
+    $wx_error_message
+
+    If you still get this error, then check that 'wx-config' is
+    in path, the directory where wxWidgets libraries are installed
+    (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH
+    or equivalent variable and wxWidgets version is $1 or above."
+
+       ifelse([$3], , AC_MSG_ERROR([$wx_error_message]), [$3])
+
+    fi
+  else
+
+    WX_CFLAGS=""
+    WX_CPPFLAGS=""
+    WX_CXXFLAGS=""
+    WX_LIBS=""
+    WX_LIBS_STATIC=""
+    WX_RESCOMP=""
+
+    ifelse([$3], , :, [$3])
+
+  fi
+
+  AC_SUBST(WX_CPPFLAGS)
+  AC_SUBST(WX_CFLAGS)
+  AC_SUBST(WX_CXXFLAGS)
+  AC_SUBST(WX_CFLAGS_ONLY)
+  AC_SUBST(WX_CXXFLAGS_ONLY)
+  AC_SUBST(WX_LIBS)
+  AC_SUBST(WX_LIBS_STATIC)
+  AC_SUBST(WX_VERSION)
+  AC_SUBST(WX_RESCOMP)
+
+  dnl need to export also WX_VERSION_MINOR and WX_VERSION_MAJOR symbols
+  dnl to support wxpresets bakefiles (we export also WX_VERSION_MICRO for completeness):
+  WX_VERSION_MAJOR="$wx_config_major_version"
+  WX_VERSION_MINOR="$wx_config_minor_version"
+  WX_VERSION_MICRO="$wx_config_micro_version"
+  AC_SUBST(WX_VERSION_MAJOR)
+  AC_SUBST(WX_VERSION_MINOR)
+  AC_SUBST(WX_VERSION_MICRO)
+])
+
+dnl ---------------------------------------------------------------------------
+dnl Get information on the wxrc program for making C++, Python and xrs
+dnl resource files.
+dnl
+dnl     AC_ARG_ENABLE(...)
+dnl     AC_ARG_WITH(...)
+dnl        ...
+dnl     WX_CONFIG_OPTIONS
+dnl        ...
+dnl     WX_CONFIG_CHECK(2.6.0, wxWin=1)
+dnl     if test "$wxWin" != 1; then
+dnl        AC_MSG_ERROR([
+dnl                wxWidgets must be installed on your system
+dnl                but wx-config script couldn't be found.
+dnl
+dnl                Please check that wx-config is in path, the directory
+dnl                where wxWidgets libraries are installed (returned by
+dnl                'wx-config --libs' command) is in LD_LIBRARY_PATH or
+dnl                equivalent variable and wxWidgets version is 2.6.0 or above.
+dnl        ])
+dnl     fi
+dnl
+dnl     WXRC_CHECK([HAVE_WXRC=1], [HAVE_WXRC=0])
+dnl     if test "x$HAVE_WXRC" != x1; then
+dnl         AC_MSG_ERROR([
+dnl                The wxrc program was not installed or not found.
+dnl
+dnl                Please check the wxWidgets installation.
+dnl         ])
+dnl     fi
+dnl
+dnl     CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS"
+dnl     CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY"
+dnl     CFLAGS="$CFLAGS $WX_CFLAGS_ONLY"
+dnl
+dnl     LDFLAGS="$LDFLAGS $WX_LIBS"
+dnl ---------------------------------------------------------------------------
+
+dnl ---------------------------------------------------------------------------
+dnl WXRC_CHECK([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl
+dnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS
+dnl resources.  The variable WXRC will be set and substituted in the configure
+dnl script and Makefiles.
+dnl
+dnl Example use:
+dnl   WXRC_CHECK([wxrc=1], [wxrc=0])
+dnl ---------------------------------------------------------------------------
+
+dnl
+dnl wxrc program from the wx-config script
+dnl
+AC_DEFUN([WXRC_CHECK],
+[
+  AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler])
+
+  if test "x$WX_CONFIG_NAME" = x; then
+    AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.])
+  else
+
+    AC_MSG_CHECKING([for wxrc])
+
+    if test "x$WXRC" = x ; then
+      dnl wx-config --utility is a new addition to wxWidgets:
+      _WX_PRIVATE_CHECK_VERSION(2,5,3)
+      if test -n "$wx_ver_ok"; then
+        WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc`
+      fi
+    fi
+
+    if test "x$WXRC" = x ; then
+      AC_MSG_RESULT([not found])
+      ifelse([$2], , :, [$2])
+    else
+      AC_MSG_RESULT([$WXRC])
+      ifelse([$1], , :, [$1])
+    fi
+
+    AC_SUBST(WXRC)
+  fi
+])
+
+dnl ---------------------------------------------------------------------------
+dnl WX_LIKE_LIBNAME([output-var] [prefix], [name])
+dnl
+dnl Sets the "output-var" variable to the name of a library named with same
+dnl wxWidgets rule.
+dnl E.g. for output-var=='lib', name=='test', prefix='mine', sets
+dnl      the $lib variable to:
+dnl          'mine_gtk2ud_test-2.8'
+dnl      if WX_PORT=gtk2, WX_UNICODE=1, WX_DEBUG=1 and WX_RELEASE=28
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_LIKE_LIBNAME],
+    [
+        wx_temp="$2""_""$WX_PORT"
+
+        dnl add the [u][d] string
+        if test "$WX_UNICODE" = "1"; then
+            wx_temp="$wx_temp""u"
+        fi
+        if test "$WX_DEBUG" = "1"; then
+            wx_temp="$wx_temp""d"
+        fi
+
+        dnl complete the name of the lib
+        wx_temp="$wx_temp""_""$3""-$WX_VERSION_MAJOR.$WX_VERSION_MINOR"
+
+        dnl save it in the user's variable
+        $1=$wx_temp
+    ])
+
+dnl ---------------------------------------------------------------------------
+dnl WX_ARG_ENABLE_YESNOAUTO/WX_ARG_WITH_YESNOAUTO
+dnl
+dnl Two little custom macros which define the ENABLE/WITH configure arguments.
+dnl Macro arguments:
+dnl $1 = the name of the --enable / --with  feature
+dnl $2 = the name of the variable associated
+dnl $3 = the description of that feature
+dnl $4 = the default value for that feature
+dnl $5 = additional action to do in case option is given with "yes" value
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_ARG_ENABLE_YESNOAUTO],
+         [AC_ARG_ENABLE($1,
+            AC_HELP_STRING([--enable-$1], [$3 (default is $4)]),
+            [], [enableval="$4"])
+
+            dnl Show a message to the user about this option
+            AC_MSG_CHECKING([for the --enable-$1 option])
+            if test "$enableval" = "yes" ; then
+                AC_MSG_RESULT([yes])
+                $2=1
+                $5
+            elif test "$enableval" = "no" ; then
+                AC_MSG_RESULT([no])
+                $2=0
+            elif test "$enableval" = "auto" ; then
+                AC_MSG_RESULT([will be automatically detected])
+                $2="auto"
+            else
+                AC_MSG_ERROR([
+    Unrecognized option value (allowed values: yes, no, auto)
+                ])
+            fi
+         ])
+
+AC_DEFUN([WX_ARG_WITH_YESNOAUTO],
+         [AC_ARG_WITH($1,
+            AC_HELP_STRING([--with-$1], [$3 (default is $4)]),
+            [], [withval="$4"])
+
+            dnl Show a message to the user about this option
+            AC_MSG_CHECKING([for the --with-$1 option])
+            if test "$withval" = "yes" ; then
+                AC_MSG_RESULT([yes])
+                $2=1
+                $5
+            dnl NB: by default we don't allow --with-$1=no option
+            dnl     since it does not make much sense !
+            elif test "$6" = "1" -a "$withval" = "no" ; then
+                AC_MSG_RESULT([no])
+                $2=0
+            elif test "$withval" = "auto" ; then
+                AC_MSG_RESULT([will be automatically detected])
+                $2="auto"
+            else
+                AC_MSG_ERROR([
+    Unrecognized option value (allowed values: yes, auto)
+                ])
+            fi
+         ])
+
+
+dnl ---------------------------------------------------------------------------
+dnl WX_STANDARD_OPTIONS([options-to-add])
+dnl
+dnl Adds to the configure script one or more of the following options:
+dnl   --enable-[debug|unicode|shared|wxshared|wxdebug]
+dnl   --with-[gtk|msw|motif|x11|mac|mgl|dfb]
+dnl   --with-wxversion
+dnl Then checks for their presence and eventually set the DEBUG, UNICODE, SHARED,
+dnl PORT, WX_SHARED, WX_DEBUG, variables to one of the "yes", "no", "auto" values.
+dnl
+dnl Note that e.g. UNICODE != WX_UNICODE; the first is the value of the
+dnl --enable-unicode option (in boolean format) while the second indicates
+dnl if wxWidgets was built in Unicode mode (and still is in boolean format).
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_STANDARD_OPTIONS],
+        [
+
+        dnl the following lines will expand to WX_ARG_ENABLE_YESNOAUTO calls if and only if
+        dnl the $1 argument contains respectively the debug,unicode or shared options.
+
+        dnl be careful here not to set debug flag if only "wxdebug" was specified
+        ifelse(regexp([$1], [\bdebug]), [-1],,
+               [WX_ARG_ENABLE_YESNOAUTO([debug], [DEBUG], [Build in debug mode], [auto])])
+
+        ifelse(index([$1], [unicode]), [-1],,
+               [WX_ARG_ENABLE_YESNOAUTO([unicode], [UNICODE], [Build in Unicode mode], [auto])])
+
+        ifelse(regexp([$1], [\bshared]), [-1],,
+               [WX_ARG_ENABLE_YESNOAUTO([shared], [SHARED], [Build as shared library], [auto])])
+
+        dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-toolkit since it's an option
+        dnl which must be able to accept the auto|gtk1|gtk2|msw|... values
+        ifelse(index([$1], [toolkit]), [-1],,
+               [
+                AC_ARG_WITH([toolkit],
+                            AC_HELP_STRING([--with-toolkit],
+                                           [Build against a specific wxWidgets toolkit (default is auto)]),
+                            [], [withval="auto"])
+
+                dnl Show a message to the user about this option
+                AC_MSG_CHECKING([for the --with-toolkit option])
+                if test "$withval" = "auto" ; then
+                    AC_MSG_RESULT([will be automatically detected])
+                    TOOLKIT="auto"
+                else
+                    TOOLKIT="$withval"
+
+                    dnl PORT must be one of the allowed values
+                    if test "$TOOLKIT" != "gtk1" -a "$TOOLKIT" != "gtk2" -a \
+                            "$TOOLKIT" != "msw" -a "$TOOLKIT" != "motif" -a \
+                            "$TOOLKIT" != "x11" -a "$TOOLKIT" != "mac" -a \
+                            "$TOOLKIT" != "mgl" -a "$TOOLKIT" != "dfb" ; then
+                        AC_MSG_ERROR([
+    Unrecognized option value (allowed values: auto, gtk1, gtk2, msw, motif, x11, mac, mgl, dfb)
+                        ])
+                    fi
+
+                    AC_MSG_RESULT([$TOOLKIT])
+                fi
+               ])
+
+        dnl ****** IMPORTANT *******
+        dnl   Unlike for the UNICODE setting, you can build your program in
+        dnl   shared mode against a static build of wxWidgets. Thus we have the
+        dnl   following option which allows these mixtures. E.g.
+        dnl
+        dnl      ./configure --disable-shared --with-wxshared
+        dnl
+        dnl   will build your library in static mode against the first available
+        dnl   shared build of wxWidgets.
+        dnl
+        dnl   Note that's not possible to do the viceversa:
+        dnl
+        dnl      ./configure --enable-shared --without-wxshared
+        dnl
+        dnl   Doing so you would try to build your library in shared mode against a static
+        dnl   build of wxWidgets. This is not possible (you would mix PIC and non PIC code) !
+        dnl   A check for this combination of options is in WX_DETECT_STANDARD_OPTION_VALUES
+        dnl   (where we know what 'auto' should be expanded to).
+        dnl
+        dnl   If you try to build something in ANSI mode against a UNICODE build
+        dnl   of wxWidgets or in RELEASE mode against a DEBUG build of wxWidgets,
+        dnl   then at best you'll get ton of linking errors !
+        dnl ************************
+
+        ifelse(index([$1], [wxshared]), [-1],,
+               [
+                WX_ARG_WITH_YESNOAUTO(
+                    [wxshared], [WX_SHARED],
+                    [Force building against a shared build of wxWidgets, even if --disable-shared is given],
+                    [auto], [], [1])
+               ])
+
+        dnl Just like for SHARED and WX_SHARED it may happen that some adventurous
+        dnl peoples will want to mix a wxWidgets release build with a debug build of
+        dnl his app/lib. So, we have both DEBUG and WX_DEBUG variables.
+        ifelse(index([$1], [wxdebug]), [-1],,
+               [
+                WX_ARG_WITH_YESNOAUTO(
+                    [wxdebug], [WX_DEBUG],
+                    [Force building against a debug build of wxWidgets, even if --disable-debug is given],
+                    [auto], [], [1])
+               ])
+
+        dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-wxversion since it's an option
+        dnl which accepts the "auto|2.6|2.7|2.8|2.9|3.0" etc etc values
+        ifelse(index([$1], [wxversion]), [-1],,
+               [
+                AC_ARG_WITH([wxversion],
+                            AC_HELP_STRING([--with-wxversion],
+                                           [Build against a specific version of wxWidgets (default is auto)]),
+                            [], [withval="auto"])
+
+                dnl Show a message to the user about this option
+                AC_MSG_CHECKING([for the --with-wxversion option])
+                if test "$withval" = "auto" ; then
+                    AC_MSG_RESULT([will be automatically detected])
+                    WX_RELEASE="auto"
+                else
+
+                    wx_requested_major_version=`echo $withval | \
+                        sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\1/'`
+                    wx_requested_minor_version=`echo $withval | \
+                        sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\2/'`
+
+                    dnl both vars above must be exactly 1 digit
+                    if test "${#wx_requested_major_version}" != "1" -o \
+                            "${#wx_requested_minor_version}" != "1" ; then
+                        AC_MSG_ERROR([
+    Unrecognized option value (allowed values: auto, 2.6, 2.7, 2.8, 2.9, 3.0)
+                        ])
+                    fi
+
+                    WX_RELEASE="$wx_requested_major_version"".""$wx_requested_minor_version"
+                    AC_MSG_RESULT([$WX_RELEASE])
+                fi
+               ])
+
+        if test "$WX_DEBUG_CONFIGURE" = "1"; then
+            echo "[[dbg]] DEBUG: $DEBUG, WX_DEBUG: $WX_DEBUG"
+            echo "[[dbg]] UNICODE: $UNICODE, WX_UNICODE: $WX_UNICODE"
+            echo "[[dbg]] SHARED: $SHARED, WX_SHARED: $WX_SHARED"
+            echo "[[dbg]] TOOLKIT: $TOOLKIT, WX_TOOLKIT: $WX_TOOLKIT"
+            echo "[[dbg]] VERSION: $VERSION, WX_RELEASE: $WX_RELEASE"
+        fi
+    ])
+
+
+dnl ---------------------------------------------------------------------------
+dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS
+dnl
+dnl Sets the WXCONFIG_FLAGS string using the SHARED,DEBUG,UNICODE variable values
+dnl which are different from "auto".
+dnl Thus this macro needs to be called only once all options have been set.
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS],
+        [
+        if test "$WX_SHARED" = "1" ; then
+            WXCONFIG_FLAGS="--static=no "
+        elif test "$WX_SHARED" = "0" ; then
+            WXCONFIG_FLAGS="--static=yes "
+        fi
+
+        if test "$WX_DEBUG" = "1" ; then
+            WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=yes "
+        elif test "$WX_DEBUG" = "0" ; then
+            WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=no "
+        fi
+
+        dnl The user should have set WX_UNICODE=UNICODE
+        if test "$WX_UNICODE" = "1" ; then
+            WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=yes "
+        elif test "$WX_UNICODE" = "0" ; then
+            WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=no "
+        fi
+
+        if test "$TOOLKIT" != "auto" ; then
+            WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--toolkit=$TOOLKIT "
+        fi
+
+        if test "$WX_RELEASE" != "auto" ; then
+            WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--version=$WX_RELEASE "
+        fi
+
+        dnl strip out the last space of the string
+        WXCONFIG_FLAGS=${WXCONFIG_FLAGS% }
+
+        if test "$WX_DEBUG_CONFIGURE" = "1"; then
+            echo "[[dbg]] WXCONFIG_FLAGS: $WXCONFIG_FLAGS"
+        fi
+    ])
+
+
+dnl ---------------------------------------------------------------------------
+dnl _WX_SELECTEDCONFIG_CHECKFOR([RESULTVAR], [STRING], [MSG]
+dnl                             [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl
+dnl Outputs the given MSG. Then searches the given STRING in the wxWidgets
+dnl additional CPP flags and put the result of the search in WX_$RESULTVAR
+dnl also adding the "yes" or "no" message result to MSG.
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([_WX_SELECTEDCONFIG_CHECKFOR],
+        [
+        if test "$$1" = "auto" ; then
+
+            dnl The user does not have particular preferences for this option;
+            dnl so we will detect the wxWidgets relative build setting and use it
+            AC_MSG_CHECKING([$3])
+
+            dnl set WX_$1 variable to 1 if the $WX_SELECTEDCONFIG contains the $2
+            dnl string or to 0 otherwise.
+            dnl NOTE: 'expr match STRING REGEXP' cannot be used since on Mac it
+            dnl       doesn't work; we use 'expr STRING : REGEXP' instead
+            WX_$1=$(expr "$WX_SELECTEDCONFIG" : ".*$2.*")
+
+            if test "$WX_$1" != "0"; then
+                WX_$1=1
+                AC_MSG_RESULT([yes])
+                ifelse([$4], , :, [$4])
+            else
+                WX_$1=0
+                AC_MSG_RESULT([no])
+                ifelse([$5], , :, [$5])
+            fi
+        else
+
+            dnl Use the setting given by the user
+            WX_$1=$$1
+        fi
+    ])
+
+dnl ---------------------------------------------------------------------------
+dnl WX_DETECT_STANDARD_OPTION_VALUES
+dnl
+dnl Detects the values of the following variables:
+dnl 1) WX_RELEASE
+dnl 2) WX_UNICODE
+dnl 3) WX_DEBUG
+dnl 4) WX_SHARED    (and also WX_STATIC)
+dnl 5) WX_PORT
+dnl from the previously selected wxWidgets build; this macro in fact must be
+dnl called *after* calling the WX_CONFIG_CHECK macro.
+dnl
+dnl Note that the WX_VERSION_MAJOR, WX_VERSION_MINOR symbols are already set
+dnl by WX_CONFIG_CHECK macro
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_DETECT_STANDARD_OPTION_VALUES],
+        [
+        dnl IMPORTANT: WX_VERSION contains all three major.minor.micro digits,
+        dnl            while WX_RELEASE only the major.minor ones.
+        WX_RELEASE="$WX_VERSION_MAJOR""$WX_VERSION_MINOR"
+        if test $WX_RELEASE -lt 26 ; then
+
+            AC_MSG_ERROR([
+    Cannot detect the wxWidgets configuration for the selected wxWidgets build
+    since its version is $WX_VERSION < 2.6.0; please install a newer
+    version of wxWidgets.
+                         ])
+        fi
+
+        dnl The wx-config we are using understands the "--selected_config"
+        dnl option which returns an easy-parseable string !
+        WX_SELECTEDCONFIG=$($WX_CONFIG_WITH_ARGS --selected_config)
+
+        if test "$WX_DEBUG_CONFIGURE" = "1"; then
+            echo "[[dbg]] Using wx-config --selected-config"
+            echo "[[dbg]] WX_SELECTEDCONFIG: $WX_SELECTEDCONFIG"
+        fi
+
+
+        dnl we could test directly for WX_SHARED with a line like:
+        dnl    _WX_SELECTEDCONFIG_CHECKFOR([SHARED], [shared],
+        dnl                                [if wxWidgets was built in SHARED mode])
+        dnl but wx-config --selected-config DOES NOT outputs the 'shared'
+        dnl word when wx was built in shared mode; it rather outputs the
+        dnl 'static' word when built in static mode.
+        if test $WX_SHARED = "1"; then
+            STATIC=0
+        elif test $WX_SHARED = "0"; then
+            STATIC=1
+        elif test $WX_SHARED = "auto"; then
+            STATIC="auto"
+        fi
+
+        dnl Now set the WX_UNICODE, WX_DEBUG, WX_STATIC variables
+        _WX_SELECTEDCONFIG_CHECKFOR([UNICODE], [unicode],
+                                    [if wxWidgets was built with UNICODE enabled])
+        _WX_SELECTEDCONFIG_CHECKFOR([DEBUG], [debug],
+                                    [if wxWidgets was built in DEBUG mode])
+        _WX_SELECTEDCONFIG_CHECKFOR([STATIC], [static],
+                                    [if wxWidgets was built in STATIC mode])
+
+        dnl init WX_SHARED from WX_STATIC
+        if test "$WX_STATIC" != "0"; then
+            WX_SHARED=0
+        else
+            WX_SHARED=1
+        fi
+
+        AC_SUBST(WX_UNICODE)
+        AC_SUBST(WX_DEBUG)
+        AC_SUBST(WX_SHARED)
+
+        dnl detect the WX_PORT to use
+        if test "$TOOLKIT" = "auto" ; then
+
+            dnl The user does not have particular preferences for this option;
+            dnl so we will detect the wxWidgets relative build setting and use it
+            AC_MSG_CHECKING([which wxWidgets toolkit was selected])
+
+            WX_GTKPORT1=$(expr "$WX_SELECTEDCONFIG" : ".*gtk1.*")
+            WX_GTKPORT2=$(expr "$WX_SELECTEDCONFIG" : ".*gtk2.*")
+            WX_MSWPORT=$(expr "$WX_SELECTEDCONFIG" : ".*msw.*")
+            WX_MOTIFPORT=$(expr "$WX_SELECTEDCONFIG" : ".*motif.*")
+            WX_OSXCOCOAPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_cocoa.*")
+            WX_OSXCARBONPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_carbon.*")
+            WX_X11PORT=$(expr "$WX_SELECTEDCONFIG" : ".*x11.*")
+            WX_MGLPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mgl.*")
+            WX_DFBPORT=$(expr "$WX_SELECTEDCONFIG" : ".*dfb.*")
+
+            WX_PORT="unknown"
+            if test "$WX_GTKPORT1" != "0"; then WX_PORT="gtk1"; fi
+            if test "$WX_GTKPORT2" != "0"; then WX_PORT="gtk2"; fi
+            if test "$WX_MSWPORT" != "0"; then WX_PORT="msw"; fi
+            if test "$WX_MOTIFPORT" != "0"; then WX_PORT="motif"; fi
+            if test "$WX_OSXCOCOAPORT" != "0"; then WX_PORT="osx_cocoa"; fi
+            if test "$WX_OSXCARBONPORT" != "0"; then WX_PORT="osx_carbon"; fi
+            if test "$WX_X11PORT" != "0"; then WX_PORT="x11"; fi
+            if test "$WX_MGLPORT" != "0"; then WX_PORT="mgl"; fi
+            if test "$WX_DFBPORT" != "0"; then WX_PORT="dfb"; fi
+
+            dnl NOTE: backward-compatible check for wx2.8; in wx2.9 the mac
+            dnl       ports are called 'osx_cocoa' and 'osx_carbon' (see above)
+            WX_MACPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mac.*")
+            if test "$WX_MACPORT" != "0"; then WX_PORT="mac"; fi
+
+            dnl check at least one of the WX_*PORT has been set !
+
+            if test "$WX_PORT" = "unknown" ; then
+                AC_MSG_ERROR([
+        Cannot detect the currently installed wxWidgets port !
+        Please check your 'wx-config --cxxflags'...
+                            ])
+            fi
+
+            AC_MSG_RESULT([$WX_PORT])
+        else
+
+            dnl Use the setting given by the user
+            if test -z "$TOOLKIT" ; then
+                WX_PORT=$TOOLKIT
+            else
+                dnl try with PORT
+                WX_PORT=$PORT
+            fi
+        fi
+
+        AC_SUBST(WX_PORT)
+
+        if test "$WX_DEBUG_CONFIGURE" = "1"; then
+            echo "[[dbg]] Values of all WX_* options after final detection:"
+            echo "[[dbg]] WX_DEBUG: $WX_DEBUG"
+            echo "[[dbg]] WX_UNICODE: $WX_UNICODE"
+            echo "[[dbg]] WX_SHARED: $WX_SHARED"
+            echo "[[dbg]] WX_RELEASE: $WX_RELEASE"
+            echo "[[dbg]] WX_PORT: $WX_PORT"
+        fi
+
+        dnl Avoid problem described in the WX_STANDARD_OPTIONS which happens when
+        dnl the user gives the options:
+        dnl      ./configure --enable-shared --without-wxshared
+        dnl or just do
+        dnl      ./configure --enable-shared
+        dnl but there is only a static build of wxWidgets available.
+        if test "$WX_SHARED" = "0" -a "$SHARED" = "1"; then
+            AC_MSG_ERROR([
+    Cannot build shared library against a static build of wxWidgets !
+    This error happens because the wxWidgets build which was selected
+    has been detected as static while you asked to build $PACKAGE_NAME
+    as shared library and this is not possible.
+    Use the '--disable-shared' option to build $PACKAGE_NAME
+    as static library or '--with-wxshared' to use wxWidgets as shared library.
+                         ])
+        fi
+
+        dnl now we can finally update the DEBUG,UNICODE,SHARED options
+        dnl to their final values if they were set to 'auto'
+        if test "$DEBUG" = "auto"; then
+            DEBUG=$WX_DEBUG
+        fi
+        if test "$UNICODE" = "auto"; then
+            UNICODE=$WX_UNICODE
+        fi
+        if test "$SHARED" = "auto"; then
+            SHARED=$WX_SHARED
+        fi
+        if test "$TOOLKIT" = "auto"; then
+            TOOLKIT=$WX_PORT
+        fi
+
+        dnl in case the user needs a BUILD=debug/release var...
+        if test "$DEBUG" = "1"; then
+            BUILD="debug"
+        elif test "$DEBUG" = "0" -o "$DEBUG" = ""; then
+            BUILD="release"
+        fi
+
+        dnl respect the DEBUG variable adding the optimize/debug flags
+        dnl NOTE: the CXXFLAGS are merged together with the CPPFLAGS so we
+        dnl       don't need to set them, too
+        if test "$DEBUG" = "1"; then
+            CXXFLAGS="$CXXFLAGS -g -O0"
+            CFLAGS="$CFLAGS -g -O0"
+        else
+            CXXFLAGS="$CXXFLAGS -O2"
+            CFLAGS="$CFLAGS -O2"
+        fi
+    ])
+
+dnl ---------------------------------------------------------------------------
+dnl WX_BOOLOPT_SUMMARY([name of the boolean variable to show summary for],
+dnl                   [what to print when var is 1],
+dnl                   [what to print when var is 0])
+dnl
+dnl Prints $2 when variable $1 == 1 and prints $3 when variable $1 == 0.
+dnl This macro mainly exists just to make configure.ac scripts more readable.
+dnl
+dnl NOTE: you need to use the [" my message"] syntax for 2nd and 3rd arguments
+dnl       if you want that m4 avoid to throw away the spaces prefixed to the
+dnl       argument value.
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_BOOLOPT_SUMMARY],
+        [
+        if test "x$$1" = "x1" ; then
+            echo $2
+        elif test "x$$1" = "x0" ; then
+            echo $3
+        else
+            echo "$1 is $$1"
+        fi
+    ])
+
+dnl ---------------------------------------------------------------------------
+dnl WX_STANDARD_OPTIONS_SUMMARY_MSG
+dnl
+dnl Shows a summary message to the user about the WX_* variable contents.
+dnl This macro is used typically at the end of the configure script.
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG],
+        [
+        echo
+        echo "  The wxWidgets build which will be used by $PACKAGE_NAME $PACKAGE_VERSION"
+        echo "  has the following settings:"
+        WX_BOOLOPT_SUMMARY([WX_DEBUG],   ["  - DEBUG build"],  ["  - RELEASE build"])
+        WX_BOOLOPT_SUMMARY([WX_UNICODE], ["  - UNICODE mode"], ["  - ANSI mode"])
+        WX_BOOLOPT_SUMMARY([WX_SHARED],  ["  - SHARED mode"],  ["  - STATIC mode"])
+        echo "  - VERSION: $WX_VERSION"
+        echo "  - PORT: $WX_PORT"
+    ])
+
+
+dnl ---------------------------------------------------------------------------
+dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN, WX_STANDARD_OPTIONS_SUMMARY_MSG_END
+dnl
+dnl Like WX_STANDARD_OPTIONS_SUMMARY_MSG macro but these two macros also gives info
+dnl about the configuration of the package which used the wxpresets.
+dnl
+dnl Typical usage:
+dnl    WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN
+dnl    echo "   - Package setting 1: $SETTING1"
+dnl    echo "   - Package setting 2: $SETTING1"
+dnl    ...
+dnl    WX_STANDARD_OPTIONS_SUMMARY_MSG_END
+dnl
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN],
+        [
+        echo
+        echo " ----------------------------------------------------------------"
+        echo "  Configuration for $PACKAGE_NAME $PACKAGE_VERSION successfully completed."
+        echo "  Summary of main configuration settings for $PACKAGE_NAME:"
+        WX_BOOLOPT_SUMMARY([DEBUG], ["  - DEBUG build"], ["  - RELEASE build"])
+        WX_BOOLOPT_SUMMARY([UNICODE], ["  - UNICODE mode"], ["  - ANSI mode"])
+        WX_BOOLOPT_SUMMARY([SHARED], ["  - SHARED mode"], ["  - STATIC mode"])
+    ])
+
+AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_END],
+        [
+        WX_STANDARD_OPTIONS_SUMMARY_MSG
+        echo
+        echo "  Now, just run make."
+        echo " ----------------------------------------------------------------"
+        echo
+    ])
+
+
+dnl ---------------------------------------------------------------------------
+dnl Deprecated macro wrappers
+dnl ---------------------------------------------------------------------------
+
+AC_DEFUN([AM_OPTIONS_WXCONFIG], [WX_CONFIG_OPTIONS])
+AC_DEFUN([AM_PATH_WXCONFIG], [
+    WX_CONFIG_CHECK([$1],[$2],[$3],[$4],[$5])
+])
+AC_DEFUN([AM_PATH_WXRC], [WXRC_CHECK([$1],[$2])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.2], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.2])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+             [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                 [_AM_DEPENDENCIES(CC)],
+                 [define([AC_PROG_CC],
+                         defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                 [_AM_DEPENDENCIES(CXX)],
+                 [define([AC_PROG_CXX],
+                         defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                 [_AM_DEPENDENCIES(OBJC)],
+                 [define([AC_PROG_OBJC],
+                         defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/config.guess b/config.guess
new file mode 100644 (file)
index 0000000..8152efd
--- /dev/null
@@ -0,0 +1,1522 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011 Free Software Foundation, Inc.
+
+timestamp='2011-11-11'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           sh5el) machine=sh5le-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep -q __ELF__
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "${UNAME_VERSION}" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit ;;
+    *:OpenBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+       exit ;;
+    *:ekkoBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+       exit ;;
+    *:SolidBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+       exit ;;
+    macppc:MirBSD:*:*)
+       echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    *:MirBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    alpha:OSF1:*:*)
+       case $UNAME_RELEASE in
+       *4.0)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+               ;;
+       *5.*)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               ;;
+       esac
+       # According to Compaq, /usr/sbin/psrinfo has been available on
+       # OSF/1 and Tru64 systems produced since 1995.  I hope that
+       # covers most systems running today.  This code pipes the CPU
+       # types through head -n 1, so we only detect the type of CPU 0.
+       ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+       case "$ALPHA_CPU_TYPE" in
+           "EV4 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "EV4.5 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "LCA4 (21066/21068)")
+               UNAME_MACHINE="alpha" ;;
+           "EV5 (21164)")
+               UNAME_MACHINE="alphaev5" ;;
+           "EV5.6 (21164A)")
+               UNAME_MACHINE="alphaev56" ;;
+           "EV5.6 (21164PC)")
+               UNAME_MACHINE="alphapca56" ;;
+           "EV5.7 (21164PC)")
+               UNAME_MACHINE="alphapca57" ;;
+           "EV6 (21264)")
+               UNAME_MACHINE="alphaev6" ;;
+           "EV6.7 (21264A)")
+               UNAME_MACHINE="alphaev67" ;;
+           "EV6.8CB (21264C)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8AL (21264B)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8CX (21264D)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.9A (21264/EV69A)")
+               UNAME_MACHINE="alphaev69" ;;
+           "EV7 (21364)")
+               UNAME_MACHINE="alphaev7" ;;
+           "EV7.9 (21364A)")
+               UNAME_MACHINE="alphaev79" ;;
+       esac
+       # A Pn.n version is a patched version.
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+       exitcode=$?
+       trap '' 0
+       exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit ;;
+    *:z/VM:*:*)
+       echo s390-ibm-zvmoe
+       exit ;;
+    *:OS400:*:*)
+       echo powerpc-ibm-os400
+       exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+       echo arm-unknown-riscos
+       exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit ;;
+    DRS?6000:unix:4.0:6*)
+       echo sparc-icl-nx6
+       exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7; exit ;;
+       esac ;;
+    s390x:SunOS:*:*)
+       echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+       echo i386-pc-auroraux${UNAME_RELEASE}
+       exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+       eval $set_cc_for_build
+       SUN_ARCH="i386"
+       # If there is a compiler, see if it is configured for 64-bit objects.
+       # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+       # This test works for both compilers.
+       if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+           if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+               (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+               grep IS_64BIT_ARCH >/dev/null
+           then
+               SUN_ARCH="x86_64"
+           fi
+       fi
+       echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+       echo m68k-milan-mint${UNAME_RELEASE}
+       exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+       echo m68k-hades-mint${UNAME_RELEASE}
+       exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+       echo m68k-unknown-mint${UNAME_RELEASE}
+       exit ;;
+    m68k:machten:*:*)
+       echo m68k-apple-machten${UNAME_RELEASE}
+       exit ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c &&
+         dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+         SYSTEM_NAME=`$dummy $dummyarg` &&
+           { echo "$SYSTEM_NAME"; exit; }
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit ;;
+    AViiON:dgux:*:*)
+       # DG/UX returns AViiON for all architectures
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+       exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $set_cc_for_build
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+               then
+                       echo "$SYSTEM_NAME"
+               else
+                       echo rs6000-ibm-aix3.2.5
+               fi
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit ;;
+    *:AIX:*:[4567])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                   sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                   case "${sc_cpu_version}" in
+                     523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                     528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                     532)                      # CPU_PA_RISC2_0
+                       case "${sc_kernel_bits}" in
+                         32) HP_ARCH="hppa2.0n" ;;
+                         64) HP_ARCH="hppa2.0w" ;;
+                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                       esac ;;
+                   esac
+               fi
+               if [ "${HP_ARCH}" = "" ]; then
+                   eval $set_cc_for_build
+                   sed 's/^            //' << EOF >$dummy.c
+
+               #define _HPUX_SOURCE
+               #include <stdlib.h>
+               #include <unistd.h>
+
+               int main ()
+               {
+               #if defined(_SC_KERNEL_BITS)
+                   long bits = sysconf(_SC_KERNEL_BITS);
+               #endif
+                   long cpu  = sysconf (_SC_CPU_VERSION);
+
+                   switch (cpu)
+                       {
+                       case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+                       case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+                       case CPU_PA_RISC2_0:
+               #if defined(_SC_KERNEL_BITS)
+                           switch (bits)
+                               {
+                               case 64: puts ("hppa2.0w"); break;
+                               case 32: puts ("hppa2.0n"); break;
+                               default: puts ("hppa2.0"); break;
+                               } break;
+               #else  /* !defined(_SC_KERNEL_BITS) */
+                           puts ("hppa2.0"); break;
+               #endif
+                       default: puts ("hppa1.0"); break;
+                       }
+                   exit (0);
+               }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+                   test -z "$HP_ARCH" && HP_ARCH=hppa
+               fi ;;
+       esac
+       if [ ${HP_ARCH} = "hppa2.0w" ]
+       then
+           eval $set_cc_for_build
+
+           # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+           # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+           # generating 64-bit code.  GNU and HP use different nomenclature:
+           #
+           # $ CC_FOR_BUILD=cc ./config.guess
+           # => hppa2.0w-hp-hpux11.23
+           # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+           # => hppa64-hp-hpux11.23
+
+           if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+               grep -q __LP64__
+           then
+               HP_ARCH="hppa2.0w"
+           else
+               HP_ARCH="hppa64"
+           fi
+       fi
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit ;;
+    3050*:HI-UX:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+               { echo "$SYSTEM_NAME"; exit; }
+       echo unknown-hitachi-hiuxwe2
+       exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+       exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+       exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+       exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+       exit ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    *:UNICOS/mp:*:*)
+       echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+       echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    5000:UNIX_System_V:4.*:*)
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+       echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:FreeBSD:*:*)
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       case ${UNAME_PROCESSOR} in
+           amd64)
+               echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+           *)
+               echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+       esac
+       exit ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit ;;
+    *:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit ;;
+    i*:MSYS*:*)
+       echo ${UNAME_MACHINE}-pc-msys
+       exit ;;
+    i*:windows32*:*)
+       # uname -m includes "-pc" on this system.
+       echo ${UNAME_MACHINE}-mingw32
+       exit ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit ;;
+    *:Interix*:*)
+       case ${UNAME_MACHINE} in
+           x86)
+               echo i586-pc-interix${UNAME_RELEASE}
+               exit ;;
+           authenticamd | genuineintel | EM64T)
+               echo x86_64-unknown-interix${UNAME_RELEASE}
+               exit ;;
+           IA64)
+               echo ia64-unknown-interix${UNAME_RELEASE}
+               exit ;;
+       esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+       echo i${UNAME_MACHINE}-pc-mks
+       exit ;;
+    8664:Windows_NT:*)
+       echo x86_64-pc-mks
+       exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i586-pc-interix
+       exit ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+       echo x86_64-unknown-cygwin
+       exit ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    *:GNU:*:*)
+       # the GNU system
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit ;;
+    *:GNU/*:*:*)
+       # other systems with GNU libc and userland
+       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+       exit ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+       esac
+       objdump --private-headers /bin/sh | grep -q ld.so.1
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit ;;
+    arm*:Linux:*:*)
+       eval $set_cc_for_build
+       if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+           | grep -q __ARM_EABI__
+       then
+           echo ${UNAME_MACHINE}-unknown-linux-gnu
+       else
+           if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+               | grep -q __ARM_PCS_VFP
+           then
+               echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+           else
+               echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+           fi
+       fi
+       exit ;;
+    avr32*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    cris:Linux:*:*)
+       echo cris-axis-linux-gnu
+       exit ;;
+    crisv32:Linux:*:*)
+       echo crisv32-axis-linux-gnu
+       exit ;;
+    frv:Linux:*:*)
+       echo frv-unknown-linux-gnu
+       exit ;;
+    hexagon:Linux:*:*)
+       echo hexagon-unknown-linux-gnu
+       exit ;;
+    i*86:Linux:*:*)
+       LIBC=gnu
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #ifdef __dietlibc__
+       LIBC=dietlibc
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+       echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+       exit ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m32r*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef ${UNAME_MACHINE}
+       #undef ${UNAME_MACHINE}el
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=${UNAME_MACHINE}el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=${UNAME_MACHINE}
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+       ;;
+    or32:Linux:*:*)
+       echo or32-unknown-linux-gnu
+       exit ;;
+    padre:Linux:*:*)
+       echo sparc-unknown-linux-gnu
+       exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit ;;
+    sh64*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    tile*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    vax:Linux:*:*)
+       echo ${UNAME_MACHINE}-dec-linux-gnu
+       exit ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit ;;
+    xtensa*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+       # Unixware is an offshoot of SVR4, but it has its own version
+       # number series starting with 2...
+       # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+       # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit ;;
+    i*86:syllable:*:*)
+       echo ${UNAME_MACHINE}-pc-syllable
+       exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit ;;
+    i*86:*:5:[678]*)
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+       # uname -m prints for DJGPP always 'pc', but it prints nothing about
+       # the processor, so we play safe by assuming i586.
+       # Note: whatever this is, it MUST be the same as what config.sub
+       # prints for the "djgpp" host, or else GDB configury will decide that
+       # this is a cross-build.
+       echo i586-pc-msdosdjgpp
+       exit ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit ;;
+    M68*:*:R3V[5678]*:*)
+       test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+       OS_REL='.3'
+       test -r /etc/.relid \
+           && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+           && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+           && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+           && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit ;;
+    PENTIUM:*:4.0*:*)  # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                       # says <Richard.M.Bartel@ccMail.Census.GOV>
+       echo i586-unisys-sysv4
+       exit ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit ;;
+    i*86:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo ${UNAME_MACHINE}-stratus-vos
+       exit ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+       exit ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit ;;
+    BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
+       echo i586-pc-haiku
+       exit ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-7:SUPER-UX:*:*)
+       echo sx7-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-8:SUPER-UX:*:*)
+       echo sx8-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-8R:SUPER-UX:*:*)
+       echo sx8r-nec-superux${UNAME_RELEASE}
+       exit ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Darwin:*:*)
+       UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+       case $UNAME_PROCESSOR in
+           i386)
+               eval $set_cc_for_build
+               if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+                 if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                     (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+                     grep IS_64BIT_ARCH >/dev/null
+                 then
+                     UNAME_PROCESSOR="x86_64"
+                 fi
+               fi ;;
+           unknown) UNAME_PROCESSOR=powerpc ;;
+       esac
+       echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+       exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=`uname -p`
+       if test "$UNAME_PROCESSOR" = "x86"; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+       exit ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+       echo neo-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+       echo nse-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit ;;
+    SEI:*:*:SEIUX)
+       echo mips-sei-seiux${UNAME_RELEASE}
+       exit ;;
+    *:DragonFly:*:*)
+       echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit ;;
+    *:*VMS:*:*)
+       UNAME_MACHINE=`(uname -p) 2>/dev/null`
+       case "${UNAME_MACHINE}" in
+           A*) echo alpha-dec-vms ; exit ;;
+           I*) echo ia64-dec-vms ; exit ;;
+           V*) echo vax-dec-vms ; exit ;;
+       esac ;;
+    *:XENIX:*:SysV)
+       echo i386-pc-xenix
+       exit ;;
+    i*86:skyos:*:*)
+       echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+       exit ;;
+    i*86:rdos:*:*)
+       echo ${UNAME_MACHINE}-pc-rdos
+       exit ;;
+    i*86:AROS:*:*)
+       echo ${UNAME_MACHINE}-pc-aros
+       exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+       "4"
+#else
+       ""
+#endif
+       ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+       { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    c34*)
+       echo c34-convex-bsd
+       exit ;;
+    c38*)
+       echo c38-convex-bsd
+       exit ;;
+    c4*)
+       echo c4-convex-bsd
+       exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..dd3b02c
--- /dev/null
@@ -0,0 +1,25 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
diff --git a/config.sub b/config.sub
new file mode 100644 (file)
index 0000000..e76eaf4
--- /dev/null
@@ -0,0 +1,1771 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011 Free Software Foundation, Inc.
+
+timestamp='2011-11-11'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis | -knuth | -cray | -microblaze)
+               os=
+               basic_machine=$1
+               ;;
+       -bluegene*)
+               os=-cnk
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco6)
+               os=-sco5v6
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5v6*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | am33_2.0 \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
+       | bfin \
+       | c4x | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | epiphany \
+       | fido | fr30 | frv \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | hexagon \
+       | i370 | i860 | i960 | ia64 \
+       | ip2k | iq2000 \
+       | le32 | le64 \
+       | lm32 \
+       | m32c | m32r | m32rle | m68000 | m68k | m88k \
+       | maxq | mb | microblaze | mcore | mep | metag \
+       | mips | mipsbe | mipseb | mipsel | mipsle \
+       | mips16 \
+       | mips64 | mips64el \
+       | mips64octeon | mips64octeonel \
+       | mips64orion | mips64orionel \
+       | mips64r5900 | mips64r5900el \
+       | mips64vr | mips64vrel \
+       | mips64vr4100 | mips64vr4100el \
+       | mips64vr4300 | mips64vr4300el \
+       | mips64vr5000 | mips64vr5000el \
+       | mips64vr5900 | mips64vr5900el \
+       | mipsisa32 | mipsisa32el \
+       | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa64 | mipsisa64el \
+       | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64sb1 | mipsisa64sb1el \
+       | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | moxie \
+       | mt \
+       | msp430 \
+       | nds32 | nds32le | nds32be \
+       | nios | nios2 \
+       | ns16k | ns32k \
+       | open8 \
+       | or32 \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle \
+       | pyramid \
+       | rl78 | rx \
+       | score \
+       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+       | sh64 | sh64le \
+       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+       | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+       | spu \
+       | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+       | ubicom32 \
+       | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+       | we32k \
+       | x86 | xc16x | xstormy16 | xtensa \
+       | z8k | z80)
+               basic_machine=$basic_machine-unknown
+               ;;
+       c54x)
+               basic_machine=tic54x-unknown
+               ;;
+       c55x)
+               basic_machine=tic55x-unknown
+               ;;
+       c6x)
+               basic_machine=tic6x-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12 | picochip)
+               # Motorola 68HC11/12.
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+       ms1)
+               basic_machine=mt-unknown
+               ;;
+
+       strongarm | thumb | xscale)
+               basic_machine=arm-unknown
+               ;;
+
+       xscaleeb)
+               basic_machine=armeb-unknown
+               ;;
+
+       xscaleel)
+               basic_machine=armel-unknown
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+       | avr-* | avr32-* \
+       | be32-* | be64-* \
+       | bfin-* | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* \
+       | clipper-* | craynv-* | cydra-* \
+       | d10v-* | d30v-* | dlx-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | hexagon-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | ip2k-* | iq2000-* \
+       | le32-* | le64-* \
+       | lm32-* \
+       | m32c-* | m32r-* | m32rle-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+       | mips16-* \
+       | mips64-* | mips64el-* \
+       | mips64octeon-* | mips64octeonel-* \
+       | mips64orion-* | mips64orionel-* \
+       | mips64r5900-* | mips64r5900el-* \
+       | mips64vr-* | mips64vrel-* \
+       | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* \
+       | mips64vr5000-* | mips64vr5000el-* \
+       | mips64vr5900-* | mips64vr5900el-* \
+       | mipsisa32-* | mipsisa32el-* \
+       | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa64-* | mipsisa64el-* \
+       | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipstx39-* | mipstx39el-* \
+       | mmix-* \
+       | mt-* \
+       | msp430-* \
+       | nds32-* | nds32le-* | nds32be-* \
+       | nios-* | nios2-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | open8-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+       | pyramid-* \
+       | rl78-* | romp-* | rs6000-* | rx-* \
+       | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+       | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+       | sparclite-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+       | tahoe-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tile*-* \
+       | tron-* \
+       | ubicom32-* \
+       | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+       | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xc16x-* | xps100-* \
+       | xstormy16-* | xtensa*-* \
+       | ymp-* \
+       | z8k-* | z80-*)
+               ;;
+       # Recognize the basic CPU types without company name, with glob match.
+       xtensa*)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       abacus)
+               basic_machine=abacus-unknown
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amd64)
+               basic_machine=x86_64-pc
+               ;;
+       amd64-*)
+               basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aros)
+               basic_machine=i386-pc
+               os=-aros
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       blackfin)
+               basic_machine=bfin-unknown
+               os=-linux
+               ;;
+       blackfin-*)
+               basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       bluegene*)
+               basic_machine=powerpc-ibm
+               os=-cnk
+               ;;
+       c54x-*)
+               basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c55x-*)
+               basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c6x-*)
+               basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       cegcc)
+               basic_machine=arm-unknown
+               os=-cegcc
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       craynv)
+               basic_machine=craynv-cray
+               os=-unicosmp
+               ;;
+       cr16 | cr16-*)
+               basic_machine=cr16-unknown
+               os=-elf
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       crisv32 | crisv32-* | etraxfs*)
+               basic_machine=crisv32-axis
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       crx)
+               basic_machine=crx-unknown
+               os=-elf
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dicos)
+               basic_machine=i686-pc
+               os=-dicos
+               ;;
+       djgpp)
+               basic_machine=i586-pc
+               os=-msdosdjgpp
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m68knommu)
+               basic_machine=m68k-unknown
+               os=-linux
+               ;;
+       m68knommu-*)
+               basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       microblaze)
+               basic_machine=microblaze-xilinx
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       mingw32ce)
+               basic_machine=arm-unknown
+               os=-mingw32ce
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       ms1-*)
+               basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+               ;;
+       msys)
+               basic_machine=i386-pc
+               os=-msys
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       nacl)
+               basic_machine=le32-unknown
+               os=-nacl
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       neo-tandem)
+               basic_machine=neo-tandem
+               ;;
+       nse-tandem)
+               basic_machine=nse-tandem
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       openrisc | openrisc-*)
+               basic_machine=or32-unknown
+               ;;
+       os400)
+               basic_machine=powerpc-ibm
+               os=-os400
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       parisc)
+               basic_machine=hppa-unknown
+               os=-linux
+               ;;
+       parisc-*)
+               basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+       pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pc98)
+               basic_machine=i386-pc
+               ;;
+       pc98-*)
+               basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon | athlon_*)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2 | pentiumiii | pentium3)
+               basic_machine=i686-pc
+               ;;
+       pentium4)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium4-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc | ppcbe)    basic_machine=powerpc-unknown
+               ;;
+       ppc-* | ppcbe-*)
+               basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rdos)
+               basic_machine=i386-pc
+               os=-rdos
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sb1)
+               basic_machine=mipsisa64sb1-unknown
+               ;;
+       sb1el)
+               basic_machine=mipsisa64sb1el-unknown
+               ;;
+       sde)
+               basic_machine=mipsisa32-sde
+               os=-elf
+               ;;
+       sei)
+               basic_machine=mips-sei
+               os=-seiux
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sh5el)
+               basic_machine=sh5le-unknown
+               ;;
+       sh64)
+               basic_machine=sh64-unknown
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       strongarm-* | thumb-*)
+               basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
+               ;;
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
+               ;;
+       tile*)
+               basic_machine=$basic_machine-unknown
+               os=-linux-gnu
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       tpf)
+               basic_machine=s390x-ibm
+               os=-tpf
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       xbox)
+               basic_machine=i686-pc
+               os=-mingw32
+               ;;
+       xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       xscale-* | xscalee[bl]-*)
+               basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       z80-*-coff)
+               basic_machine=z80-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       mmix)
+               basic_machine=mmix-knuth
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+               basic_machine=sh-unknown
+               ;;
+       sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+               basic_machine=sparc-sun
+               ;;
+       cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+       # First match some system type aliases
+       # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -auroraux)
+               os=-auroraux
+               ;;
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+             | -sym* | -kopensolaris* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* | -aros* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+             | -openbsd* | -solidbsd* \
+             | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+             | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* | -cegcc* \
+             | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-uclibc* \
+             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+             | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto-qnx*)
+               ;;
+       -nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux-dietlibc)
+               os=-linux-dietlibc
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+       -os400*)
+               os=-os400
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -syllable*)
+               os=-syllable
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -tpf*)
+               os=-tpf
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -aros*)
+               os=-aros
+               ;;
+       -kaos*)
+               os=-kaos
+               ;;
+       -zvmoe)
+               os=-zvmoe
+               ;;
+       -dicos*)
+               os=-dicos
+               ;;
+       -nacl*)
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       score-*)
+               os=-elf
+               ;;
+       spu-*)
+               os=-elf
+               ;;
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       c4x-* | tic4x-*)
+               os=-coff
+               ;;
+       tic54x-*)
+               os=-coff
+               ;;
+       tic55x-*)
+               os=-coff
+               ;;
+       tic6x-*)
+               os=-coff
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=-tops20
+               ;;
+       pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       mep-*)
+               os=-elf
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       or32-*)
+               os=-coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-haiku)
+               os=-haiku
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-knuth)
+               os=-mmixware
+               ;;
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+       *-gould)
+               os=-sysv
+               ;;
+       *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+       *-sgi)
+               os=-irix
+               ;;
+       *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -cnk*|-aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -os400*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -tpf*)
+                               vendor=ibm
+                               ;;
+                       -vxsim* | -vxworks* | -windiss*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100644 (file)
index 0000000..8e16e5e
--- /dev/null
+++ b/configure
@@ -0,0 +1,6665 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for ShapeFusion 0.5.
+#
+# Report bugs to <http://sourceforge.net/bugs/?group_id=1997>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+        /*)
+          for as_base in sh bash ksh sh5; do
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+          done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+       # neutralization value for shells without unset; and this also
+       # works around shells that cannot unset nonexistent variables.
+       # Preserve -v and -x to the replacement shell.
+       BASH_ENV=/dev/null
+       ENV=/dev/null
+       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+       export CONFIG_SHELL
+       case $- in # ((((
+         *v*x* | *x*v* ) as_opts=-vx ;;
+         *v* ) as_opts=-v ;;
+         *x* ) as_opts=-x ;;
+         * ) as_opts= ;;
+       esac
+       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: http://sourceforge.net/bugs/?group_id=1997 about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in #(
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='ShapeFusion'
+PACKAGE_TARNAME='ShapeFusion'
+PACKAGE_VERSION='0.5'
+PACKAGE_STRING='ShapeFusion 0.5'
+PACKAGE_BUGREPORT='http://sourceforge.net/bugs/?group_id=1997'
+PACKAGE_URL=''
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+MAKE_WINDOWS_FALSE
+MAKE_WINDOWS_TRUE
+SNDFILE_LIBS
+SNDFILE_CFLAGS
+PKG_CONFIG
+WX_VERSION_MICRO
+WX_VERSION_MINOR
+WX_VERSION_MAJOR
+WX_RESCOMP
+WX_VERSION
+WX_LIBS_STATIC
+WX_LIBS
+WX_CXXFLAGS_ONLY
+WX_CFLAGS_ONLY
+WX_CXXFLAGS
+WX_CFLAGS
+WX_CPPFLAGS
+WX_CONFIG_PATH
+WINDRES
+RANLIB
+CXXCPP
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+with_wxdir
+with_wx_config
+with_wx_prefix
+with_wx_exec_prefix
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+CXX
+CXXFLAGS
+CCC
+CXXCPP
+PKG_CONFIG
+SNDFILE_CFLAGS
+SNDFILE_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+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=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$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 ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=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 ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# 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 the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures ShapeFusion 0.5 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/ShapeFusion]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of ShapeFusion 0.5:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-wxdir=PATH       Use uninstalled version of wxWidgets in PATH
+  --with-wx-config=CONFIG wx-config script to use (optional)
+  --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)
+  --with-wx-exec-prefix=PREFIX
+                          Exec prefix where wxWidgets is installed (optional)
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  SNDFILE_CFLAGS
+              C compiler flags for SNDFILE, overriding pkg-config
+  SNDFILE_LIBS
+              linker flags for SNDFILE, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <http://sourceforge.net/bugs/?group_id=1997>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+ShapeFusion configure 0.5
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by ShapeFusion $as_me 0.5, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+am__api_version='1.11'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           rm -rf conftest.one conftest.two conftest.dir
+           echo one > conftest.one
+           echo two > conftest.two
+           mkdir conftest.dir
+           if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+             test -s conftest.one && test -s conftest.two &&
+             test -s conftest.dir/conftest.one &&
+             test -s conftest.dir/conftest.two
+           then
+             ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+             break 3
+           fi
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+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.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+        for ac_exec_ext in '' $ac_executable_extensions; do
+          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+          case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+            'mkdir (GNU coreutils) '* | \
+            'mkdir (coreutils) '* | \
+            'mkdir (fileutils) '4.1*)
+              ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+              break 3;;
+          esac
+        done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='ShapeFusion'
+ VERSION='0.5'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_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 $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+       if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+        CXXFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&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
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+case $target in
+*-*-mingw32*)
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
+set dummy ${ac_tool_prefix}windres; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_WINDRES+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$WINDRES"; then
+  ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_WINDRES="${ac_tool_prefix}windres"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+WINDRES=$ac_cv_prog_WINDRES
+if test -n "$WINDRES"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5
+$as_echo "$WINDRES" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_WINDRES"; then
+  ac_ct_WINDRES=$WINDRES
+  # Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_WINDRES+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_WINDRES"; then
+  ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_WINDRES="windres"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES
+if test -n "$ac_ct_WINDRES"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5
+$as_echo "$ac_ct_WINDRES" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_WINDRES" = x; then
+    WINDRES=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    WINDRES=$ac_ct_WINDRES
+  fi
+else
+  WINDRES="$ac_cv_prog_WINDRES"
+fi
+
+       ;;
+*-*-netbsd*)
+       CPPFLAGS="$CPPFLAGS -I/usr/pkg/include"
+       ;;
+*)
+       ;;
+esac
+
+
+
+# Check whether --with-wxdir was given.
+if test "${with_wxdir+set}" = set; then :
+  withval=$with_wxdir;  wx_config_name="$withval/wx-config"
+                  wx_config_args="--inplace"
+fi
+
+
+# Check whether --with-wx-config was given.
+if test "${with_wx_config+set}" = set; then :
+  withval=$with_wx_config; wx_config_name="$withval"
+fi
+
+
+# Check whether --with-wx-prefix was given.
+if test "${with_wx_prefix+set}" = set; then :
+  withval=$with_wx_prefix; wx_config_prefix="$withval"
+else
+  wx_config_prefix=""
+fi
+
+
+# Check whether --with-wx-exec-prefix was given.
+if test "${with_wx_exec_prefix+set}" = set; then :
+  withval=$with_wx_exec_prefix; wx_config_exec_prefix="$withval"
+else
+  wx_config_exec_prefix=""
+fi
+
+
+reqwx=2.8.0
+case $target in
+*-*-mingw32*)
+
+
+    if test x${WX_CONFIG_NAME+set} != xset ; then
+     WX_CONFIG_NAME=wx-config
+  fi
+
+  if test "x$wx_config_name" != x ; then
+     WX_CONFIG_NAME="$wx_config_name"
+  fi
+
+    if test x$wx_config_exec_prefix != x ; then
+     wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix"
+     WX_LOOKUP_PATH="$wx_config_exec_prefix/bin"
+  fi
+  if test x$wx_config_prefix != x ; then
+     wx_config_args="$wx_config_args --prefix=$wx_config_prefix"
+     WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin"
+  fi
+  if test "$cross_compiling" = "yes"; then
+     wx_config_args="$wx_config_args --host=$host_alias"
+  fi
+
+    if test -x "$WX_CONFIG_NAME" ; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5
+$as_echo_n "checking for wx-config... " >&6; }
+     WX_CONFIG_PATH="$WX_CONFIG_NAME"
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+$as_echo "$WX_CONFIG_PATH" >&6; }
+  else
+     # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args.
+set dummy $WX_CONFIG_NAME; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_WX_CONFIG_PATH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $WX_CONFIG_PATH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy=""$WX_LOOKUP_PATH:$PATH""
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no"
+  ;;
+esac
+fi
+WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH
+if test -n "$WX_CONFIG_PATH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+$as_echo "$WX_CONFIG_PATH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+
+  if test "$WX_CONFIG_PATH" != "no" ; then
+    WX_VERSION=""
+
+    min_wx_version=$reqwx
+    if test -z "--unicode=no" ; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5
+$as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version (--unicode=no)" >&5
+$as_echo_n "checking for wxWidgets version >= $min_wx_version (--unicode=no)... " >&6; }
+    fi
+
+            WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode=no"
+
+    WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null`
+    wx_config_major_version=`echo $WX_VERSION | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    wx_config_minor_version=`echo $WX_VERSION | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    wx_config_micro_version=`echo $WX_VERSION | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+
+    wx_requested_major_version=`echo $min_wx_version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    wx_requested_minor_version=`echo $min_wx_version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    wx_requested_micro_version=`echo $min_wx_version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+
+
+    wx_ver_ok=""
+    if test "x$WX_VERSION" != x ; then
+      if test $wx_config_major_version -gt $wx_requested_major_version; then
+        wx_ver_ok=yes
+      else
+        if test $wx_config_major_version -eq $wx_requested_major_version; then
+           if test $wx_config_minor_version -gt $wx_requested_minor_version; then
+              wx_ver_ok=yes
+           else
+              if test $wx_config_minor_version -eq $wx_requested_minor_version; then
+                 if test $wx_config_micro_version -ge $wx_requested_micro_version; then
+                    wx_ver_ok=yes
+                 fi
+              fi
+           fi
+        fi
+      fi
+    fi
+
+
+    if test -n "$wx_ver_ok"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5
+$as_echo "yes (version $WX_VERSION)" >&6; }
+      WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs `
+
+                              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5
+$as_echo_n "checking for wxWidgets static library... " >&6; }
+      WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs  2>/dev/null`
+      if test "x$WX_LIBS_STATIC" = "x"; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      fi
+
+            wx_has_cppflags=""
+      if test $wx_config_major_version -gt 2; then
+        wx_has_cppflags=yes
+      else
+        if test $wx_config_major_version -eq 2; then
+           if test $wx_config_minor_version -gt 2; then
+              wx_has_cppflags=yes
+           else
+              if test $wx_config_minor_version -eq 2; then
+                 if test $wx_config_micro_version -ge 6; then
+                    wx_has_cppflags=yes
+                 fi
+              fi
+           fi
+        fi
+      fi
+
+            wx_has_rescomp=""
+      if test $wx_config_major_version -gt 2; then
+        wx_has_rescomp=yes
+      else
+        if test $wx_config_major_version -eq 2; then
+           if test $wx_config_minor_version -ge 7; then
+              wx_has_rescomp=yes
+           fi
+        fi
+      fi
+      if test "x$wx_has_rescomp" = x ; then
+                  WX_RESCOMP=
+      else
+         WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp`
+      fi
+
+      if test "x$wx_has_cppflags" = x ; then
+                  WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags `
+         WX_CPPFLAGS=$WX_CFLAGS
+         WX_CXXFLAGS=$WX_CFLAGS
+
+         WX_CFLAGS_ONLY=$WX_CFLAGS
+         WX_CXXFLAGS_ONLY=$WX_CFLAGS
+      else
+                  WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags `
+         WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags `
+         WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags `
+
+         WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"`
+         WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"`
+      fi
+
+      wxWidgets=1
+
+    else
+
+       if test "x$WX_VERSION" = x; then
+                    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       else
+          { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5
+$as_echo "no (version $WX_VERSION is not new enough)" >&6; }
+       fi
+
+       WX_CFLAGS=""
+       WX_CPPFLAGS=""
+       WX_CXXFLAGS=""
+       WX_LIBS=""
+       WX_LIBS_STATIC=""
+       WX_RESCOMP=""
+
+       if test ! -z "--unicode=no"; then
+
+          wx_error_message="
+    The configuration you asked for $PACKAGE_NAME requires a wxWidgets
+    build with the following settings:
+        --unicode=no
+    but such build is not available.
+
+    To see the wxWidgets builds available on this system, please use
+    'wx-config --list' command. To use the default build, returned by
+    'wx-config --selected-config', use the options with their 'auto'
+    default values."
+
+       fi
+
+       wx_error_message="
+    The requested wxWidgets build couldn't be found.
+    $wx_error_message
+
+    If you still get this error, then check that 'wx-config' is
+    in path, the directory where wxWidgets libraries are installed
+    (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH
+    or equivalent variable and wxWidgets version is $reqwx or above."
+
+       as_fn_error $? "$wx_error_message" "$LINENO" 5
+
+    fi
+  else
+
+    WX_CFLAGS=""
+    WX_CPPFLAGS=""
+    WX_CXXFLAGS=""
+    WX_LIBS=""
+    WX_LIBS_STATIC=""
+    WX_RESCOMP=""
+
+    :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+
+      WX_VERSION_MAJOR="$wx_config_major_version"
+  WX_VERSION_MINOR="$wx_config_minor_version"
+  WX_VERSION_MICRO="$wx_config_micro_version"
+
+
+
+
+
+       ;;
+*)
+
+
+    if test x${WX_CONFIG_NAME+set} != xset ; then
+     WX_CONFIG_NAME=wx-config
+  fi
+
+  if test "x$wx_config_name" != x ; then
+     WX_CONFIG_NAME="$wx_config_name"
+  fi
+
+    if test x$wx_config_exec_prefix != x ; then
+     wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix"
+     WX_LOOKUP_PATH="$wx_config_exec_prefix/bin"
+  fi
+  if test x$wx_config_prefix != x ; then
+     wx_config_args="$wx_config_args --prefix=$wx_config_prefix"
+     WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin"
+  fi
+  if test "$cross_compiling" = "yes"; then
+     wx_config_args="$wx_config_args --host=$host_alias"
+  fi
+
+    if test -x "$WX_CONFIG_NAME" ; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5
+$as_echo_n "checking for wx-config... " >&6; }
+     WX_CONFIG_PATH="$WX_CONFIG_NAME"
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+$as_echo "$WX_CONFIG_PATH" >&6; }
+  else
+     # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args.
+set dummy $WX_CONFIG_NAME; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_WX_CONFIG_PATH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $WX_CONFIG_PATH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy=""$WX_LOOKUP_PATH:$PATH""
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no"
+  ;;
+esac
+fi
+WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH
+if test -n "$WX_CONFIG_PATH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+$as_echo "$WX_CONFIG_PATH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+
+  if test "$WX_CONFIG_PATH" != "no" ; then
+    WX_VERSION=""
+
+    min_wx_version=$reqwx
+    if test -z "" ; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5
+$as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()" >&5
+$as_echo_n "checking for wxWidgets version >= $min_wx_version ()... " >&6; }
+    fi
+
+            WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args "
+
+    WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null`
+    wx_config_major_version=`echo $WX_VERSION | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    wx_config_minor_version=`echo $WX_VERSION | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    wx_config_micro_version=`echo $WX_VERSION | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+
+    wx_requested_major_version=`echo $min_wx_version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    wx_requested_minor_version=`echo $min_wx_version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    wx_requested_micro_version=`echo $min_wx_version | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+
+
+    wx_ver_ok=""
+    if test "x$WX_VERSION" != x ; then
+      if test $wx_config_major_version -gt $wx_requested_major_version; then
+        wx_ver_ok=yes
+      else
+        if test $wx_config_major_version -eq $wx_requested_major_version; then
+           if test $wx_config_minor_version -gt $wx_requested_minor_version; then
+              wx_ver_ok=yes
+           else
+              if test $wx_config_minor_version -eq $wx_requested_minor_version; then
+                 if test $wx_config_micro_version -ge $wx_requested_micro_version; then
+                    wx_ver_ok=yes
+                 fi
+              fi
+           fi
+        fi
+      fi
+    fi
+
+
+    if test -n "$wx_ver_ok"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5
+$as_echo "yes (version $WX_VERSION)" >&6; }
+      WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs `
+
+                              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5
+$as_echo_n "checking for wxWidgets static library... " >&6; }
+      WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs  2>/dev/null`
+      if test "x$WX_LIBS_STATIC" = "x"; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      fi
+
+            wx_has_cppflags=""
+      if test $wx_config_major_version -gt 2; then
+        wx_has_cppflags=yes
+      else
+        if test $wx_config_major_version -eq 2; then
+           if test $wx_config_minor_version -gt 2; then
+              wx_has_cppflags=yes
+           else
+              if test $wx_config_minor_version -eq 2; then
+                 if test $wx_config_micro_version -ge 6; then
+                    wx_has_cppflags=yes
+                 fi
+              fi
+           fi
+        fi
+      fi
+
+            wx_has_rescomp=""
+      if test $wx_config_major_version -gt 2; then
+        wx_has_rescomp=yes
+      else
+        if test $wx_config_major_version -eq 2; then
+           if test $wx_config_minor_version -ge 7; then
+              wx_has_rescomp=yes
+           fi
+        fi
+      fi
+      if test "x$wx_has_rescomp" = x ; then
+                  WX_RESCOMP=
+      else
+         WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp`
+      fi
+
+      if test "x$wx_has_cppflags" = x ; then
+                  WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags `
+         WX_CPPFLAGS=$WX_CFLAGS
+         WX_CXXFLAGS=$WX_CFLAGS
+
+         WX_CFLAGS_ONLY=$WX_CFLAGS
+         WX_CXXFLAGS_ONLY=$WX_CFLAGS
+      else
+                  WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags `
+         WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags `
+         WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags `
+
+         WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"`
+         WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"`
+      fi
+
+      wxWidgets=1
+
+    else
+
+       if test "x$WX_VERSION" = x; then
+                    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       else
+          { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5
+$as_echo "no (version $WX_VERSION is not new enough)" >&6; }
+       fi
+
+       WX_CFLAGS=""
+       WX_CPPFLAGS=""
+       WX_CXXFLAGS=""
+       WX_LIBS=""
+       WX_LIBS_STATIC=""
+       WX_RESCOMP=""
+
+       if test ! -z ""; then
+
+          wx_error_message="
+    The configuration you asked for $PACKAGE_NAME requires a wxWidgets
+    build with the following settings:
+
+    but such build is not available.
+
+    To see the wxWidgets builds available on this system, please use
+    'wx-config --list' command. To use the default build, returned by
+    'wx-config --selected-config', use the options with their 'auto'
+    default values."
+
+       fi
+
+       wx_error_message="
+    The requested wxWidgets build couldn't be found.
+    $wx_error_message
+
+    If you still get this error, then check that 'wx-config' is
+    in path, the directory where wxWidgets libraries are installed
+    (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH
+    or equivalent variable and wxWidgets version is $reqwx or above."
+
+       as_fn_error $? "$wx_error_message" "$LINENO" 5
+
+    fi
+  else
+
+    WX_CFLAGS=""
+    WX_CPPFLAGS=""
+    WX_CXXFLAGS=""
+    WX_LIBS=""
+    WX_LIBS_STATIC=""
+    WX_RESCOMP=""
+
+    :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+
+      WX_VERSION_MAJOR="$wx_config_major_version"
+  WX_VERSION_MINOR="$wx_config_minor_version"
+  WX_VERSION_MICRO="$wx_config_micro_version"
+
+
+
+
+
+  ;;
+esac
+if test "$wxWidgets" != 1; then
+       as_fn_error $? "
+               wxWidgets must be installed on your system.
+
+               Please check that wx-config is in path, the directory
+               where wxWidgets libraries are installed (returned by
+               'wx-config --libs' or 'wx-config --static --libs' command)
+               is in LD_LIBRARY_PATH or equivalent variable and
+               wxWidgets version is $reqwx or above.
+               " "$LINENO" 5
+fi
+
+CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS"
+CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY"
+CFLAGS="$CFLAGS $WX_CFLAGS_ONLY"
+LIBS="$LIBS $WX_LIBS"
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5
+$as_echo_n "checking for SNDFILE... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$SNDFILE_CFLAGS"; then
+        pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "sndfile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$SNDFILE_LIBS"; then
+        pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "sndfile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "sndfile"`
+        else
+               SNDFILE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "sndfile"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$SNDFILE_PKG_ERRORS" >&5
+
+       as_fn_error $? "ShapeFusion requires libsndfile" "$LINENO" 5
+elif test $pkg_failed = untried; then
+       as_fn_error $? "ShapeFusion requires libsndfile" "$LINENO" 5
+else
+       SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS
+       SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+                 CPPFLAGS="$SNDFILE_CFLAGS $CPPFLAGS"
+                 LIBS="$SNDFILE_LIBS $LIBS"
+fi
+
+
+case $target in
+*-*-mingw32*)
+       make_windows=true
+       ;;
+*)
+       make_windows=false ;;
+esac
+ if test x$make_windows = xtrue; then
+  MAKE_WINDOWS_TRUE=
+  MAKE_WINDOWS_FALSE='#'
+else
+  MAKE_WINDOWS_TRUE='#'
+  MAKE_WINDOWS_FALSE=
+fi
+
+
+ac_config_files="$ac_config_files Makefile Physics/Makefile Shapes/Makefile Sounds/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# 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.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+       cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+         mv -f confcache "$cache_file"$$ &&
+         mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+         mv -f confcache "$cache_file" ;;
+       esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAKE_WINDOWS_TRUE}" && test -z "${MAKE_WINDOWS_FALSE}"; then
+  as_fn_error $? "conditional \"MAKE_WINDOWS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in #(
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by ShapeFusion $as_me 0.5, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <http://sourceforge.net/bugs/?group_id=1997>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+ShapeFusion config.status 0.5
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "Physics/Makefile") CONFIG_FILES="$CONFIG_FILES Physics/Makefile" ;;
+    "Shapes/Makefile") CONFIG_FILES="$CONFIG_FILES Shapes/Makefile" ;;
+    "Sounds/Makefile") CONFIG_FILES="$CONFIG_FILES Sounds/Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=[    ]*/{
+h
+s///
+s/^/:/
+s/[     ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[  ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[    ]*#[    ]*define[       ][      ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = "\a"
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #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.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$_am_arg" : 'X\(//\)[^/]' \| \
+        X"$_am_arg" : 'X\(//\)$' \| \
+        X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$mf" : 'X\(//\)[^/]' \| \
+        X"$mf" : 'X\(//\)$' \| \
+        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$file" : 'X\(//\)[^/]' \| \
+        X"$file" : 'X\(//\)$' \| \
+        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+echo "Configuration done. Now type \"make\"."
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..a827f3b
--- /dev/null
@@ -0,0 +1,91 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl Written in 2000 by Christian Bauer <Christian.Bauer@uni-mainz.de>
+
+AC_INIT([ShapeFusion], [0.5], [http://sourceforge.net/bugs/?group_id=1997], [ShapeFusion])
+AC_PREREQ(2.52)
+
+dnl Detect the canonical host and target build environment.
+AC_CANONICAL_HOST
+AC_CANONICAL_TARGET
+
+dnl Init automake.
+AM_INIT_AUTOMAKE
+AM_CONFIG_HEADER(config.h)
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AC_PROG_INSTALL
+AC_PROG_RANLIB
+
+dnl some platform specific stuff
+case $target in
+*-*-mingw32*)
+       AC_CHECK_TOOL(WINDRES, windres, :)
+       ;;
+*-*-netbsd*)
+       CPPFLAGS="$CPPFLAGS -I/usr/pkg/include" 
+       ;;
+*)
+       ;;
+esac
+
+dnl wxWidgets
+AM_OPTIONS_WXCONFIG
+reqwx=2.8.0
+case $target in
+*-*-mingw32*)
+  AM_PATH_WXCONFIG($reqwx, wxWidgets=1, , , [--unicode=no])
+       ;;
+*)
+       AM_PATH_WXCONFIG($reqwx, wxWidgets=1)
+  ;;
+esac
+if test "$wxWidgets" != 1; then
+       AC_MSG_ERROR([
+               wxWidgets must be installed on your system.
+               Please check that wx-config is in path, the directory
+               where wxWidgets libraries are installed (returned by
+               'wx-config --libs' or 'wx-config --static --libs' command)
+               is in LD_LIBRARY_PATH or equivalent variable and
+               wxWidgets version is $reqwx or above.
+               ])
+fi
+CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS"
+CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY"
+CFLAGS="$CFLAGS $WX_CFLAGS_ONLY"
+LIBS="$LIBS $WX_LIBS"
+
+PKG_CHECK_MODULES([SNDFILE], [sndfile], [
+                 CPPFLAGS="$SNDFILE_CFLAGS $CPPFLAGS"
+                 LIBS="$SNDFILE_LIBS $LIBS"], AC_ERROR([ShapeFusion requires libsndfile]))
+
+dnl Check for libsndfile
+dnl AC_CHECK_HEADER(sndfile.h, , AC_ERROR([ShapeFusion requires libsndfile]))
+dnl AC_CHECK_LIB(sndfile, sf_open, [LIBS="-lvorbis -lvorbisenc -lvorbisfile -logg -lsndfile $LIBS"], AC_ERROR([ShapeFusion requires libsndfile]), [-lvorbis -lvorbisenc -lvorbisfile -logg -lFLAC -lsndfile])
+
+dnl add some windows goodies
+case $target in
+*-*-mingw32*)
+       make_windows=true
+       ;;
+*)
+       make_windows=false ;;
+esac
+AM_CONDITIONAL(MAKE_WINDOWS, test x$make_windows = xtrue)
+
+dnl Generate Makefiles.
+AC_CONFIG_FILES([
+Makefile
+Physics/Makefile
+Shapes/Makefile
+Sounds/Makefile
+])
+AC_OUTPUT
+
+dnl Print summary.
+echo "Configuration done. Now type \"make\"."
diff --git a/depcomp b/depcomp
new file mode 100644 (file)
index 0000000..bd0ac08
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,688 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2011-12-04.11; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
+# 2011 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+   # This is just like msvc7 but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvc7
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+      | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+              s/^ *//
+              s/ \\*$//
+              s/$/:/
+              p
+            }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test "$stat" = 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/      \1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/        /
+  G
+  p
+}' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+       set fnord "$@"
+       shift
+       shift
+       ;;
+    *)
+       set fnord "$@" "$arg"
+       shift
+       shift
+       ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
+  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/install-sh b/install-sh
new file mode 100644 (file)
index 0000000..a9244eb
--- /dev/null
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-01-19.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# 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.
+
+nl='
+'
+IFS=" ""       $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+       shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+       case $mode in
+         *' '* | *'    '* | *'
+'*       | *'*'* | *'?'* | *'['*)
+           echo "$0: invalid mode: $mode" >&2
+           exit 1;;
+       esac
+       shift;;
+
+    -o) chowncmd="$chownprog $2"
+       shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+       # Protect names problematic for `test' and other utilities.
+       case $dst_arg in
+         -* | [=\(\)!]) dst_arg=./$dst_arg;;
+       esac
+       shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)        shift
+       break;;
+
+    -*)        echo "$0: invalid option: $1" >&2
+       exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for `test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for `test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+       echo "$0: $dst_arg: Is a directory" >&2
+       exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+       (dirname "$dst") 2>/dev/null ||
+       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+            X"$dst" : 'X\(//\)[^/]' \| \
+            X"$dst" : 'X\(//\)$' \| \
+            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+       echo X"$dst" |
+           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)[^/].*/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\).*/{
+                  s//\1/
+                  q
+                }
+                s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+       # Create intermediate dirs using mode 755 as modified by the umask.
+       # This is like FreeBSD 'install' as of 1997-10-28.
+       umask=`umask`
+       case $stripcmd.$umask in
+         # Optimize common cases.
+         *[2367][2367]) mkdir_umask=$umask;;
+         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+         *[0-7])
+           mkdir_umask=`expr $umask + 22 \
+             - $umask % 100 % 40 + $umask % 20 \
+             - $umask % 10 % 4 + $umask % 2
+           `;;
+         *) mkdir_umask=$umask,go-w;;
+       esac
+
+       # With -d, create the new directory with the user-specified mode.
+       # Otherwise, rely on $mkdir_umask.
+       if test -n "$dir_arg"; then
+         mkdir_mode=-m$mode
+       else
+         mkdir_mode=
+       fi
+
+       posix_mkdir=false
+       case $umask in
+         *[123567][0-7][0-7])
+           # POSIX mkdir -p sets u+wx bits regardless of umask, which
+           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+           ;;
+         *)
+           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+           if (umask $mkdir_umask &&
+               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+           then
+             if test -z "$dir_arg" || {
+                  # Check for POSIX incompatibilities with -m.
+                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                  # other-writeable bit of parent directory when it shouldn't.
+                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
+                  case $ls_ld_tmpdir in
+                    d????-?r-*) different_mode=700;;
+                    d????-?--*) different_mode=755;;
+                    *) false;;
+                  esac &&
+                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                  }
+                }
+             then posix_mkdir=:
+             fi
+             rmdir "$tmpdir/d" "$tmpdir"
+           else
+             # Remove any dirs left behind by ancient mkdir implementations.
+             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+           fi
+           trap '' 0;;
+       esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+       umask $mkdir_umask &&
+       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+       /*) prefix='/';;
+       [-=\(\)!]*) prefix='./';;
+       *)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+       test X"$d" = X && continue
+
+       prefix=$prefix$d
+       if test -d "$prefix"; then
+         prefixes=
+       else
+         if $posix_mkdir; then
+           (umask=$mkdir_umask &&
+            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+           # Don't fail if two instances are running concurrently.
+           test -d "$prefix" || exit 1
+         else
+           case $prefix in
+             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+             *) qprefix=$prefix;;
+           esac
+           prefixes="$prefixes '$qprefix'"
+         fi
+       fi
+       prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+       # Don't fail if two instances are running concurrently.
+       (umask $mkdir_umask &&
+        eval "\$doit_exec \$mkdirprog $prefixes") ||
+         test -d "$dstdir" || exit 1
+       obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # 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 $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+       # Now remove or move aside any old file at destination location.
+       # We try this two ways since rm can't unlink itself on some
+       # systems and the destination file might be busy for other
+       # reasons.  In this case, the final cleanup might fail but the new
+       # file should still install successfully.
+       {
+         test ! -f "$dst" ||
+         $doit $rmcmd -f "$dst" 2>/dev/null ||
+         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+         } ||
+         { echo "$0: cannot unlink or rename $dst" >&2
+           (exit 1); exit 1
+         }
+       } &&
+
+       # Now rename the file to the real destination.
+       $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/missing b/missing
new file mode 100644 (file)
index 0000000..28055d2
--- /dev/null
+++ b/missing
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo "#! /bin/sh"
+       echo "# Created by GNU Automake missing as a replacement of"
+       echo "#  $ $@"
+       echo "exit 0"
+       chmod +x $file
+       exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+       case $LASTARG in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f y.tab.h; then
+       echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+       case $LASTARG in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f lex.yy.c; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+        you modified a dependency of a manual page.  You may need the
+        \`Help2man' package in order for those modifications to take
+        effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo ".ab help2man is required to generate this page"
+       exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+       /^@setfilename/{
+         s/.* \([^ ]*\) *$/\1/
+         p
+         q
+       }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+       case $firstarg in
+       *o*)
+           firstarg=`echo "$firstarg" | sed s/o//`
+           tar "$firstarg" "$@" && exit 0
+           ;;
+       esac
+       case $firstarg in
+       *h*)
+           firstarg=`echo "$firstarg" | sed s/h//`
+           tar "$firstarg" "$@" && exit 0
+           ;;
+       esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End: