From b3b0f005bcf1563519d1b9f42d5ad8801f8e0ded Mon Sep 17 00:00:00 2001 From: Christoph Egger Date: Thu, 4 Dec 2008 20:08:24 +0100 Subject: [PATCH] original 1.0.1 release --- AUTHORS | 11 + Changelog | 14 + INSTALL | 61 + LICENSE | 339 ++++ Makefile.in | 52 + README | 86 + README.keys | 32 + config.guess | 1371 +++++++++++++ config.status | 379 ++++ config.sub | 1362 +++++++++++++ configure | 3822 +++++++++++++++++++++++++++++++++++++ configure.in | 288 +++ data/board2.gif | Bin 0 -> 16367 bytes data/font2.gif | Bin 0 -> 50883 bytes data/polyomino.dat | 412 ++++ data/topnine.gif | Bin 0 -> 24830 bytes data/wellcuts.gif | Bin 0 -> 50646 bytes data/wellintro.gif | Bin 0 -> 101503 bytes data/welltris.scores | 54 + docs/srcdoc/sources | 4 + install-sh | 251 +++ makedist | 220 +++ src/Make.common.in | 63 + src/commonfuncs.cxx | 82 + src/geometry.cxx | 192 ++ src/image/accel.c | 101 + src/image/accel.h | 23 + src/image/convert.cxx | 902 +++++++++ src/image/image.cxx | 890 +++++++++ src/image/image.h | 55 + src/image/jpeg.c | 300 +++ src/image/makefile.in | 48 + src/image/picinfo.h | 130 ++ src/image/sublib/IMG_gif.c | 606 ++++++ src/image/sublib/SDL.h | 12 + src/image/sublib/SDL_error.c | 56 + src/image/sublib/SDL_error.h | 62 + src/image/sublib/SDL_image.h | 94 + src/image/sublib/SDL_mutex.h | 8 + src/image/sublib/SDL_rwops.c | 275 +++ src/image/sublib/SDL_rwops.h | 113 ++ src/image/sublib/SDL_surface.c | 331 ++++ src/image/sublib/SDL_to_picinfo.c | 64 + src/image/sublib/SDL_types.h | 92 + src/image/sublib/SDL_video.h | 891 +++++++++ src/image/sublib/begin_code.h | 100 + src/image/sublib/close_code.h | 41 + src/image/sublib/im_exp.h | 18 + src/image/sublib/makefile.in | 93 + src/include/bilist.h | 61 + src/include/commonfuncs.h | 11 + src/include/config.h | 145 ++ src/include/config.h.in | 144 ++ src/include/geometry.h | 23 + src/include/globals.h | 89 + src/include/globals.h.in | 89 + src/include/globdef.h | 20 + src/include/mydebug.h | 33 + src/include/sysheaders.h | 12 + src/include/types.h | 23 + src/include/version.h | 5 + src/include/wellclass.h | 162 ++ src/include/welldrawing.h | 62 + src/include/wellengine.h | 93 + src/include/wellimagefont.h | 37 + src/include/wellinput.h | 30 + src/include/wellintro.h | 66 + src/include/wellkey.h | 24 + src/include/wellobject.h | 74 + src/include/wellsimpledraw.h | 63 + src/include/wellswitch.h | 31 + src/include/welltopnine.h | 84 + src/include/welltris.h | 230 +++ src/include/xheaders.h | 9 + src/main.cxx | 67 + src/makefile.in | 117 ++ src/mydebug.c | 32 + src/rndgen.cxx | 46 + src/sdl/sdl_gfxprimitives.c | 3387 ++++++++++++++++++++++++++++++++ src/sdl/sdl_gfxprimitives.h | 155 ++ src/sdl/sdl_gfxprimitives_font.h | 3082 ++++++++++++++++++++++++++++++ src/sdl/sdlwelldrawing.cxx | 591 ++++++ src/sdl/sdlwelldrawing.h | 58 + src/sdl/sdlwellengine.cxx | 409 ++++ src/sdl/sdlwellengine.h | 56 + src/sdl/sdlwellimagefont.cxx | 97 + src/sdl/sdlwellimagefont.h | 25 + src/sdl/sdlwellinput.cxx | 137 ++ src/sdl/sdlwellinput.h | 25 + src/wellclass.cxx | 1569 +++++++++++++++ src/welldrawing.cxx | 220 +++ src/wellengine.cxx | 239 +++ src/wellimagefont.cxx | 141 ++ src/wellinput.cxx | 121 ++ src/wellintro.cxx | 472 +++++ src/wellkey.cxx | 145 ++ src/wellsimpledraw.cxx | 113 ++ src/wellswitch.cxx | 157 ++ src/welltopnine.cxx | 487 +++++ src/x11/xheaders.h | 9 + src/x11/xwelldrawing.cxx | 457 +++++ src/x11/xwelldrawing.h | 50 + src/x11/xwellengine.cxx | 598 ++++++ src/x11/xwellengine.h | 80 + src/x11/xwellimagefont.cxx | 74 + src/x11/xwellimagefont.h | 26 + src/x11/xwellinput.cxx | 101 + src/x11/xwellinput.h | 24 + 108 files changed, 29387 insertions(+) create mode 100644 AUTHORS create mode 100644 Changelog create mode 100644 INSTALL create mode 100644 LICENSE create mode 100644 Makefile.in create mode 100644 README create mode 100644 README.keys create mode 100755 config.guess create mode 100755 config.status create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100755 data/board2.gif create mode 100755 data/font2.gif create mode 100644 data/polyomino.dat create mode 100755 data/topnine.gif create mode 100755 data/wellcuts.gif create mode 100755 data/wellintro.gif create mode 100644 data/welltris.scores create mode 100644 docs/srcdoc/sources create mode 100755 install-sh create mode 100755 makedist create mode 100644 src/Make.common.in create mode 100644 src/commonfuncs.cxx create mode 100644 src/geometry.cxx create mode 100644 src/image/accel.c create mode 100644 src/image/accel.h create mode 100644 src/image/convert.cxx create mode 100644 src/image/image.cxx create mode 100644 src/image/image.h create mode 100644 src/image/jpeg.c create mode 100644 src/image/makefile.in create mode 100644 src/image/picinfo.h create mode 100644 src/image/sublib/IMG_gif.c create mode 100644 src/image/sublib/SDL.h create mode 100644 src/image/sublib/SDL_error.c create mode 100644 src/image/sublib/SDL_error.h create mode 100644 src/image/sublib/SDL_image.h create mode 100644 src/image/sublib/SDL_mutex.h create mode 100644 src/image/sublib/SDL_rwops.c create mode 100644 src/image/sublib/SDL_rwops.h create mode 100644 src/image/sublib/SDL_surface.c create mode 100644 src/image/sublib/SDL_to_picinfo.c create mode 100644 src/image/sublib/SDL_types.h create mode 100644 src/image/sublib/SDL_video.h create mode 100644 src/image/sublib/begin_code.h create mode 100644 src/image/sublib/close_code.h create mode 100644 src/image/sublib/im_exp.h create mode 100644 src/image/sublib/makefile.in create mode 100644 src/include/bilist.h create mode 100644 src/include/commonfuncs.h create mode 100644 src/include/config.h create mode 100644 src/include/config.h.in create mode 100644 src/include/geometry.h create mode 100644 src/include/globals.h create mode 100644 src/include/globals.h.in create mode 100644 src/include/globdef.h create mode 100644 src/include/mydebug.h create mode 100644 src/include/sysheaders.h create mode 100644 src/include/types.h create mode 100644 src/include/version.h create mode 100644 src/include/wellclass.h create mode 100644 src/include/welldrawing.h create mode 100644 src/include/wellengine.h create mode 100644 src/include/wellimagefont.h create mode 100644 src/include/wellinput.h create mode 100644 src/include/wellintro.h create mode 100644 src/include/wellkey.h create mode 100644 src/include/wellobject.h create mode 100644 src/include/wellsimpledraw.h create mode 100644 src/include/wellswitch.h create mode 100644 src/include/welltopnine.h create mode 100644 src/include/welltris.h create mode 100644 src/include/xheaders.h create mode 100644 src/main.cxx create mode 100644 src/makefile.in create mode 100644 src/mydebug.c create mode 100644 src/rndgen.cxx create mode 100644 src/sdl/sdl_gfxprimitives.c create mode 100644 src/sdl/sdl_gfxprimitives.h create mode 100644 src/sdl/sdl_gfxprimitives_font.h create mode 100644 src/sdl/sdlwelldrawing.cxx create mode 100644 src/sdl/sdlwelldrawing.h create mode 100644 src/sdl/sdlwellengine.cxx create mode 100644 src/sdl/sdlwellengine.h create mode 100644 src/sdl/sdlwellimagefont.cxx create mode 100644 src/sdl/sdlwellimagefont.h create mode 100644 src/sdl/sdlwellinput.cxx create mode 100644 src/sdl/sdlwellinput.h create mode 100644 src/wellclass.cxx create mode 100644 src/welldrawing.cxx create mode 100644 src/wellengine.cxx create mode 100644 src/wellimagefont.cxx create mode 100644 src/wellinput.cxx create mode 100644 src/wellintro.cxx create mode 100644 src/wellkey.cxx create mode 100644 src/wellsimpledraw.cxx create mode 100644 src/wellswitch.cxx create mode 100644 src/welltopnine.cxx create mode 100644 src/x11/xheaders.h create mode 100644 src/x11/xwelldrawing.cxx create mode 100644 src/x11/xwelldrawing.h create mode 100644 src/x11/xwellengine.cxx create mode 100644 src/x11/xwellengine.h create mode 100644 src/x11/xwellimagefont.cxx create mode 100644 src/x11/xwellimagefont.h create mode 100644 src/x11/xwellinput.cxx create mode 100644 src/x11/xwellinput.h diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..3bea4cf --- /dev/null +++ b/AUTHORS @@ -0,0 +1,11 @@ + X Welltris Project (tetris like game). + +Main programmer, maintainer and author: + Leonid V. Khramov + +Additional help from: + Irina V. Khramova + +Designer and Web-master: + Leonid V. Khramov + \ No newline at end of file diff --git a/Changelog b/Changelog new file mode 100644 index 0000000..d77f6f7 --- /dev/null +++ b/Changelog @@ -0,0 +1,14 @@ +============================================================================ + Changes for XWelltris project +============================================================================ + +Version is 1.0.0 (11-03-2002): + + -Initial public release + + + + 31-03-2002 Leo + + + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..58bfbe8 --- /dev/null +++ b/INSTALL @@ -0,0 +1,61 @@ +============================================================================== + XWelltris Project - tetris like game +============================================================================== + +1. Installation from source tarball (xwelltris-version.src.tar.gz): + +First of all you need to unpack tarball, use this command : + + gunzip -c xwelltris-version.src.tar.gz | tar xvf - + +After that you can see directory named 'xwelltris-version', change your +current dir to it: + + cd xwelltris-version + +Then you need to configure and make the game: + + ./configure + make + +The default installation path is in /usr/bin and /usr/share/xwelltris dirs. +If you want to install to another dirs, for example in your home subdirs, +you need to say about this in configure: + + ./configure --prefix=/home/user + make + +After make is done with no errors, then install the game: + + make install + +Be sure that your $prefix/bin directory is in your $PATH environment variable. + +That's all, now you can enjoy the game by typing: + + xwelltris + +P.S: XWelltris is the X Window game so it needs Xlibs and X headers to compile +Be shure that you have it installed. + +============================================================================== + +2. Installation from binaries tarball. + +You need to gain root account, then change you dir to '/': + + cd / + gunzip -c /dir_of_xwelltris_tarball/xwelltris-version.tar.gz | tar xvf - + +That's it! + +Now type 'xwelltris' under X Window for playing. + +============================================================================== + +P.S: If You like xwelltris, please, send me a letter with names of +country and city where you are playing the game. It's for my collection. + +Thank you. +Leo (31-03-2002) + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, 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 + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 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/Makefile.in b/Makefile.in new file mode 100644 index 0000000..9e1121a --- /dev/null +++ b/Makefile.in @@ -0,0 +1,52 @@ +# XWelltris - tetris like popular game +# +# Copyright (C) 2002 by Leo Khramov +# email: leo@xnc.dubna.su +# +# +# 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. +# + +@MCOMMON@ + + DATAFILES= \ + data/polyomino.dat \ + data/board2.gif \ + data/font2.gif \ + data/topnine.gif \ + data/wellcuts.gif \ + data/wellintro.gif + + SHARE_DATAFILES= \ + data/welltris.scores + + PROGRAM = xwelltris + +all:: $(PROGRAM) + +$(PROGRAM): FORCE + -(cd src && make) + +install: + $(INSD) $(INSTLIB) + $(INSTALL_DATA) $(DATAFILES) $(INSTLIB) + $(INSTALL_SHARE_DATA) $(SHARE_DATAFILES) $(INSTLIB) + $(INSTALL_PROGRAM) $(PROGRAM) $(INSTDIR) + +uninstall: + $(RM) -f $(INSTDIR)/$(PROGRAM) + $(RM) -rf $(INSTLIB) + +clean: + $(RM) -f $(PROGRAM) + -(cd src && make clean) + +FORCE: diff --git a/README b/README new file mode 100644 index 0000000..0ebd818 --- /dev/null +++ b/README @@ -0,0 +1,86 @@ + +============================================================================ + + XWelltris - tetris like game + +============================================================================ + +1. Introduction + + XWelltris is a tetris like popular game. The idea of this game was by + Pogitnov russian programmer. Imaging that you are looking into the glass + from the top. You see four walls and the bottom. The flat 2d figures falling + down from the walls one by one. You can move these figures from one wall to + another or rotate the figure. If the figure leave the wall it moves on the + bottom while another figure is pushed. You need to form full rows and/or + columns on the bottom. When you form such row it disappear and you receive + additional empty space on the bottom and scores :). The more rows disappear + at a time, the more scores you have. If you can't place the whole figure on + the bottom, then it stays on the wall and this wall became frozen (you can't + place figures on it) for a while. After n-th rows were successfuly cleared, + you will receive binus figure and goto to the next level - game speed will + be increased. You task is to play more longer and earn more scores. + +============================================================================ + +2. Installation of the game + + ./configure + make + make install + + More detail installation process described in 'INSTALL' file in this + directory. + +============================================================================ + +3. Playing + + Type 'xwelltris' from the X Window for playing the game. + First of all you see the options screen, where you can customize you game. + The options are: + + - Dutris, Tritris, Tetris, Pentris, Sixtris - game type that define a + number of piece the figure is. Dutris - figures from two pieces only. + Tritris from three pieces. Tetris from four and so on... + + - Mixed. Turn it on and you will play with mixed figures. For example if + you choose tetris type below, then you will play with figure from two, + three and four piece. If thhis option will be off then figures will be + only from four pieces. This option gives you easier game but less + scores. + + - Rotation. This option turn on inner rotation of the game board, one + by one on each level up. This is very funny and more harder to play. + And of couse if harder then more scores at a time :) + + - Next piece. This option turn on showing of next figure that will fall + down on the game board. It's allow you to know and have additional time + for thinking. Of couse if you turn it on you will have less scores. + + + Press 'New game' for playing, then type you name and enjoy playing. + 'Top nine' :) key shows high scores table of current game type (dutris,...) + + And 'Exit' will kill the game. + +============================================================================ + +4. Additional info + + XWelltris stores high scores table in the file named 'welltris.scores'. + First of all it search global welltris.scores in /usr/share/xwelltris. + If this file exists and writable then xwelltris uses it. Otherwise it + create your own welltris.scores in ~/.xwelltris directory + (in your home dir). If you want to clear scores table simple remove + welltris.scores file and xwelltris create it again. + +============================================================================ + +This game implementation is under GNU GPL2 license, so you can modify and +redistribute it with the rules described in 'LICENSE' file in this dir. + + + +(c) 2002 by Leonid V. Khramov aka Leo + diff --git a/README.keys b/README.keys new file mode 100644 index 0000000..f6bf16a --- /dev/null +++ b/README.keys @@ -0,0 +1,32 @@ +========================================================================= +Here are the keys in game XWelltris: + + Move figure right: + -Right Arrow + -Num pad '6' + -Main keyboard 'L' key + + Move figure left: + -Left Arrow + -Num pad '4' + -Main keyboard 'J' key + + Rotate figure: + -Up or Down Arrow + -Num pad '5' + -Main keyboard 'K' key + + Drop figure down: + -Space + -Num pad 'Insert' + + Pause/Unpause game: + -Main keyboard 'P' key + -Pause key + + Quit game: + -Main keyboard 'Q' key + -F10 key + -Escape key + +That's all. diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..ba66165 --- /dev/null +++ b/config.guess @@ -0,0 +1,1371 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. + +timestamp='2001-04-20' + +# 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., 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. + +# Written by Per Bothner . +# Please send patches to . +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 + + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c + for c in cc gcc c89 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break + fi + done + rm -f $dummy.c $dummy.o $dummy.rel + 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 + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +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. + # Determine the machine/vendor (is the vendor relevant). + case "${UNAME_MACHINE}" in + amiga) machine=m68k-unknown ;; + arm32) machine=arm-unknown ;; + atari*) machine=m68k-atari ;; + sun3*) machine=m68k-sun ;; + mac68k) machine=m68k-apple ;; + macppc) machine=powerpc-apple ;; + hp3[0-9][05]) machine=m68k-hp ;; + ibmrt|romp-ibm) machine=romp-ibm ;; + *) machine=${UNAME_MACHINE}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE}" in + i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # 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 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # 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. + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + 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 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + 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 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + 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 0 ;; + 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 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /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 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + # 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 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* 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 $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + 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 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????: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 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + 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 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + 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 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | 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 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 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]) + case "${HPUX_REV}" in + 11.[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" ;; + esac ;; + esac + fi ;; + esac + if [ "${HP_ARCH}" = "" ]; then + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + 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 $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >$dummy.c + #include + 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 $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + 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 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + 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 i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + cat >$dummy.c < /* for printf() prototype */ +int main (int argc, char *argv[]) { +#else +int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __MIPSEB__ + printf ("%s-unknown-linux-gnu\n", argv[1]); +#endif +#ifdef __MIPSEL__ + printf ("%sel-unknown-linux-gnu\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + ;; + ppc:Linux:*:*) + # Determine Lib Version + cat >$dummy.c < +#if defined(__GLIBC__) +extern char __libc_version[]; +extern char __libc_release[]; +#endif +main(argc, argv) + int argc; + char *argv[]; +{ +#if defined(__GLIBC__) + printf("%s %s\n", __libc_version, __libc_release); +#else + printf("unknown\n"); +#endif + return 0; +} +EOF + LIBC="" + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy | grep 1\.99 > /dev/null + if test "$?" = 0 ; then LIBC="libc1" ; fi + fi + rm -f $dummy.c $dummy + echo powerpc-unknown-linux-gnu${LIBC} + exit 0 ;; + alpha:Linux:*:*) + cat <$dummy.s + .data + \$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + .text + .globl main + .align 4 + .ent main + main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + LIBC="" + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) UNAME_MACHINE="alpha" ;; + 1-0) UNAME_MACHINE="alphaev5" ;; + 1-1) UNAME_MACHINE="alphaev56" ;; + 1-101) UNAME_MACHINE="alphapca56" ;; + 2-303) UNAME_MACHINE="alphaev6" ;; + 2-307) UNAME_MACHINE="alphaev67" ;; + esac + objdump --private-headers $dummy | \ + grep ld.so.1 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + 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 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + ld_supported_emulations=`cd /; ld --help 2>&1 \ + | sed -ne '/supported emulations:/!d + s/[ ][ ]*/ /g + s/.*supported emulations: *// + s/ .*// + p'` + case "$ld_supported_emulations" in + i*86linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 + ;; + elf_i*86) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + i*86coff) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 + ;; + esac + # Either a pre-BFD a.out linker (linux-gnuoldld) + # or one that does not give us useful --help. + # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. + # If ld does not provide *any* "supported emulations:" + # that means it is gnuoldld. + test -z "$ld_supported_emulations" && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + case "${UNAME_MACHINE}" in + i*86) + VENDOR=pc; + ;; + *) + VENDOR=unknown; + ;; + esac + # Determine whether the default compiler is a.out or elf + cat >$dummy.c < +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; +# 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. + i*86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + 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 0 ;; + 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 0 ;; + i*86:*:5:7*) + # Fixed at (any) Pentium or better + UNAME_MACHINE=i586 + if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then + echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + 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 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*: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 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *: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 0 ;; + PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + 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 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[KW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *: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 0 ;; + 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 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >$dummy.c < +# include +#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 + 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"); 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 +# 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 $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# 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 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < 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.status b/config.status new file mode 100755 index 0000000..a620633 --- /dev/null +++ b/config.status @@ -0,0 +1,379 @@ +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host condor.solvo.ru: +# +# ./configure --enable-debug --with-sdl +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: ./config.status [--recheck] [--version] [--help]" +for ac_option +do + case "$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running ${CONFIG_SHELL-/bin/sh} ./configure --enable-debug --with-sdl --no-create --no-recursion" + exec ${CONFIG_SHELL-/bin/sh} ./configure --enable-debug --with-sdl --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "./config.status generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "$ac_cs_usage"; exit 0 ;; + *) echo "$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=. +ac_given_INSTALL="/usr/bin/install -c" + +trap 'rm -fr src/Make.common src/makefile src/include/globals.h src/image/makefile Makefile src/include/config.h conftest*; exit 1' 1 2 15 + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\&%]/\\&/g; + s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF +/^[ ]*VPATH[ ]*=[^:]*$/d + +s%@SHELL@%/bin/sh%g +s%@CFLAGS@%-O%g +s%@CPPFLAGS@%%g +s%@CXXFLAGS@%-g -O2%g +s%@FFLAGS@%%g +s%@DEFS@%-DHAVE_CONFIG_H%g +s%@LDFLAGS@%-O%g +s%@LIBS@%-lm %g +s%@exec_prefix@%${prefix}%g +s%@prefix@%/usr%g +s%@program_transform_name@%s,x,x,%g +s%@bindir@%${exec_prefix}/bin%g +s%@sbindir@%${exec_prefix}/sbin%g +s%@libexecdir@%${exec_prefix}/libexec%g +s%@datadir@%${prefix}/share%g +s%@sysconfdir@%${prefix}/etc%g +s%@sharedstatedir@%${prefix}/com%g +s%@localstatedir@%${prefix}/var%g +s%@libdir@%${exec_prefix}/lib%g +s%@includedir@%${prefix}/include%g +s%@oldincludedir@%/usr/include%g +s%@infodir@%${prefix}/info%g +s%@mandir@%${prefix}/man%g +s%@host@%i686-pc-linux-gnu%g +s%@host_alias@%i686-pc-linux-gnu%g +s%@host_cpu@%i686%g +s%@host_vendor@%pc%g +s%@host_os@%linux-gnu%g +s%@CC@%gcc%g +s%@CPP@%gcc -E%g +s%@CXX@%c++%g +s%@INSTALL_PROGRAM@%${INSTALL}%g +s%@INSTALL_SCRIPT@%${INSTALL_PROGRAM}%g +s%@INSTALL_DATA@%${INSTALL} -m 644%g +s%@LN_S@%ln -s%g +s%@SET_MAKE@%%g +s%@RANLIB@%ranlib%g +s%@RM@%/bin/rm%g +s%@CP@%/bin/cp%g +s%@SHAREFLAGS@%%g +s%@LD_SHAREFLAGS@%%g +s%@PLUGINS@%%g +s%@DEB@%-g -DDEBUG_XNC%g +s%@IFACEOBJS@%$(SDLOBJS)%g +s%@IFACELIBS@%`sdl-config --libs` -lSDL_image%g +s%@IFACEINC@%`sdl-config --cflags` -I./sdl%g +s%@X_CFLAGS@%%g +s%@X_PRE_LIBS@%%g +s%@X_LIBS@%%g +s%@X_EXTRA_LIBS@%%g +s%@LIBOBJS@%%g +/@MCOMMON@/r ./src/Make.common +s%@MCOMMON@%%g + +CEOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi + +CONFIG_FILES=${CONFIG_FILES-" src/Make.common src/makefile src/include/globals.h src/image/makefile Makefile"} +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then + CONFIG_HEADERS="src/include/config.h" +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + + + +exit 0 diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..a06a480 --- /dev/null +++ b/config.sub @@ -0,0 +1,1362 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. + +timestamp='2001-04-20' + +# 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., 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. + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 0;; + + * ) + 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* | storm-chaos* | os2-emx*) + 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) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \ + | arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \ + | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 \ + | x86 | ppcbe | mipsbe | mipsle | shbe | shle \ + | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ + | hppa64 \ + | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ + | alphaev6[78] \ + | we32k | ns16k | clipper | i370 | sh | sh[34] \ + | powerpc | powerpcle \ + | 1750a | dsp16xx | pdp10 | pdp11 \ + | mips16 | mips64 | mipsel | mips64el \ + | mips64orion | mips64orionel | mipstx39 | mipstx39el \ + | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ + | mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \ + | sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \ + | v850 | c4x \ + | thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \ + | pj | pjl | h8500) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | w65) + ;; + + # 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. + # FIXME: clean up the formatting here. + vax-* | tahoe-* | i*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \ + | arm-* | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ + | xmp-* | ymp-* \ + | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ + | hppa2.0n-* | hppa64-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ + | alphaev6[78]-* \ + | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ + | clipper-* | orion-* \ + | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \ + | mips16-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ + | mipstx39-* | mipstx39el-* | mcore-* \ + | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \ + | [cjt]90-* \ + | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ + | thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \ + | bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*) + ;; + # 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 + ;; + 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 + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + 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 | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [cjt]90) + basic_machine=${basic_machine}-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=t3e-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + 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 + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + 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 + ;; + sh3 | sh4) + basic_machine=sh-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -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 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -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 + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# 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 100755 index 0000000..499651e --- /dev/null +++ b/configure @@ -0,0 +1,3822 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_default_prefix=/usr +ac_help="$ac_help + --enable-debug Turn on debugging output" +ac_help="$ac_help + --with-sdl Turn on SDL support instead of X11" +ac_help="$ac_help + --with-x use the X Window System" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=src/main.cxx + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +if test -z "${CFLAGS}"; then + if test -z "${CCOPTS}"; then + CCOPTS='-O' + fi + CFLAGS="$CCOPTS" +fi + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + +# Make sure we can run config.sub. +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:567: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + +ARCH=`echo $host | sed 's/\([^-]*\)-[^-]*-\([^-]*\)/\1-\2/'` + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:593: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:623: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:674: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:706: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 717 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:748: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:753: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:781: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + +echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 +echo "configure:813: checking for POSIXized ISC" >&5 +if test -d /etc/conf/kconfig.d && + grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 +then + echo "$ac_t""yes" 1>&6 + ISC=yes # If later tests want to check for ISC. + cat >> confdefs.h <<\EOF +#define _POSIX_SOURCE 1 +EOF + + if test "$GCC" = yes; then + CC="$CC -posix" + else + CC="$CC -Xp" + fi +else + echo "$ac_t""no" 1>&6 + ISC= +fi + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:834: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:855: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:872: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:889: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for AIX""... $ac_c" 1>&6 +echo "configure:914: checking for AIX" >&5 +cat > conftest.$ac_ext <&5 | + egrep "yes" >/dev/null 2>&1; then + rm -rf conftest* + echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF +#define _ALL_SOURCE 1 +EOF + +else + rm -rf conftest* + echo "$ac_t""no" 1>&6 +fi +rm -f conftest* + + +ac_safe=`echo "minix/config.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6 +echo "configure:939: checking for minix/config.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:949: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + MINIX=yes +else + echo "$ac_t""no" 1>&6 +MINIX= +fi + +if test "$MINIX" = yes; then + cat >> confdefs.h <<\EOF +#define _POSIX_SOURCE 1 +EOF + + cat >> confdefs.h <<\EOF +#define _POSIX_1_SOURCE 2 +EOF + + cat >> confdefs.h <<\EOF +#define _MINIX 1 +EOF + +fi + +for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:991: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CXX="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CXX="$ac_cv_prog_CXX" +if test -n "$CXX"; then + echo "$ac_t""$CXX" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$CXX" && break +done +test -n "$CXX" || CXX="gcc" + + +echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1023: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 + +ac_ext=C +# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cxx_cross + +cat > conftest.$ac_ext << EOF + +#line 1034 "configure" +#include "confdefs.h" + +int main(){return(0);} +EOF +if { (eval echo configure:1039: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cxx_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cxx_cross=no + else + ac_cv_prog_cxx_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cxx_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6 +if test $ac_cv_prog_cxx_works = no; then + { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:1065: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 +cross_compiling=$ac_cv_prog_cxx_cross + +echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 +echo "configure:1070: checking whether we are using GNU C++" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.C <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gxx=yes +else + ac_cv_prog_gxx=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gxx" 1>&6 + +if test $ac_cv_prog_gxx = yes; then + GXX=yes +else + GXX= +fi + +ac_test_CXXFLAGS="${CXXFLAGS+set}" +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS= +echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 +echo "configure:1098: checking whether ${CXX-g++} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.cc +if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then + ac_cv_prog_cxx_g=yes +else + ac_cv_prog_cxx_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS="$ac_save_CXXFLAGS" +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi + +for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat > conftest.$ac_ext < +$ac_declaration +int main() { +exit (42); +; return 0; } +EOF +if { (eval echo configure:1147: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + continue +fi +rm -f conftest* + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:1192: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 +echo "configure:1245: checking whether ln -s works" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + ac_cv_prog_LN_S=ln +fi +fi +LN_S="$ac_cv_prog_LN_S" +if test "$ac_cv_prog_LN_S" = "ln -s"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:1266: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1295: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Extract the first word of "rm", so it can be a program name with args. +set dummy rm; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1325: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_RM'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$RM" in + /*) + ac_cv_path_RM="$RM" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_RM="$RM" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_RM="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_RM" && ac_cv_path_RM="rm" + ;; +esac +fi +RM="$ac_cv_path_RM" +if test -n "$RM"; then + echo "$ac_t""$RM" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Extract the first word of "cp", so it can be a program name with args. +set dummy cp; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1361: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_CP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$CP" in + /*) + ac_cv_path_CP="$CP" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_CP="$CP" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_CP="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_CP" && ac_cv_path_CP="cp" + ;; +esac +fi +CP="$ac_cv_path_CP" +if test -n "$CP"; then + echo "$ac_t""$CP" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + + + + + + + + + +case "$ARCH" in + *sco*|*SCO*) + echo $ac_n "checking "SCO-Unix. See if we need -belf"""... $ac_c" 1>&6 +echo "configure:1407: checking "SCO-Unix. See if we need -belf"" >&5 + old_cflags="$CFLAGS" + CFLAGS="$CFLAGS -belf" + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + CMFLAGS="$CMFLAGS -belf" + echo "$ac_t""yes" 1>&6 +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "$ac_t""no" 1>&6 + CFLAGS="$old_cflags" +fi +rm -f conftest* + ;; +esac + + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 +echo "configure:1441: checking for $ac_hdr that defines DIR" >&5 +if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include <$ac_hdr> +int main() { +DIR *dirp = 0; +; return 0; } +EOF +if { (eval echo configure:1454: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then +echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 +echo "configure:1479: checking for opendir in -ldir" >&5 +ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldir $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -ldir" +else + echo "$ac_t""no" 1>&6 +fi + +else +echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 +echo "configure:1520: checking for opendir in -lx" >&5 +ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lx $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lx" +else + echo "$ac_t""no" 1>&6 +fi + +fi + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1562: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1575: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1642: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 +echo "configure:1666: checking for sys/wait.h that is POSIX.1 compatible" >&5 +if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifndef WEXITSTATUS +#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif +int main() { +int s; +wait (&s); +s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; +; return 0; } +EOF +if { (eval echo configure:1687: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_sys_wait_h=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_sys_wait_h=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6 +if test $ac_cv_header_sys_wait_h = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_SYS_WAIT_H 1 +EOF + +fi + +echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 +echo "configure:1708: checking whether time.h and sys/time.h may both be included" >&5 +if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +int main() { +struct tm *tp; +; return 0; } +EOF +if { (eval echo configure:1722: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_time=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_time=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_time" 1>&6 +if test $ac_cv_header_time = yes; then + cat >> confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + +for ac_hdr in fcntl.h \ + sys/select.h \ + sys/time.h \ + sys/sigevent.h \ + sys/types.h \ + sys/stat.h \ + sys/utsname.h \ + sys/param.h \ + sys/wait.h \ + limits.h \ + unistd.h \ + errno.h \ + strings.h \ + math.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1759: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1769: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + + +echo $ac_n "checking for pow in -lm""... $ac_c" 1>&6 +echo "configure:1798: checking for pow in -lm" >&5 +ac_lib_var=`echo m'_'pow | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lm $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +fi + +for ac_func in setlocale +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1847: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + + +# Check whether --enable-debug or --disable-debug was given. +if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + xncdebug=yes +else + xncdebug=no +fi + + +if test "$xncdebug" = "yes"; then + DEB="-g -DDEBUG_XNC" +else + DEB="" +fi + + +# Check whether --with-sdl or --without-sdl was given. +if test "${with_sdl+set}" = set; then + withval="$with_sdl" + sdl_support=yes +else + sdl_support=no +fi + + +if test "x$sdl_support" = "xyes"; then + echo "SDL is ENABLED *******************" + IFACEOBJS='$(SDLOBJS)' + IFACELIBS='`sdl-config --libs` -lSDL_image' + IFACEINC='`sdl-config --cflags` -I./sdl' +else + echo "X11 is ENABLED *******************" + # If we find X, set shell vars x_includes and x_libraries to the +# paths, otherwise set no_x=yes. +# Uses ac_ vars as temps to allow command line to override cache and checks. +# --without-x overrides everything else, but does not touch the cache. +echo $ac_n "checking for X""... $ac_c" 1>&6 +echo "configure:1938: checking for X" >&5 + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + : +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else +if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=NO ac_x_libraries=NO +rm -fr conftestdir +if mkdir conftestdir; then + cd conftestdir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat > Imakefile <<'EOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case "$ac_im_incroot" in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; + esac + case "$ac_im_usrlibdir" in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; + esac + fi + cd .. + rm -fr conftestdir +fi + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2005: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + # Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done +fi +rm -f conftest* +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ + /usr/X11/lib \ + /usr/X11R6/lib \ + /usr/X11R5/lib \ + /usr/X11R4/lib \ + \ + /usr/lib/X11 \ + /usr/lib/X11R6 \ + /usr/lib/X11R5 \ + /usr/lib/X11R4 \ + \ + /usr/local/X11/lib \ + /usr/local/X11R6/lib \ + /usr/local/X11R5/lib \ + /usr/local/X11R4/lib \ + \ + /usr/local/lib/X11 \ + /usr/local/lib/X11R6 \ + /usr/local/lib/X11R5 \ + /usr/local/lib/X11R4 \ + \ + /usr/X386/lib \ + /usr/x386/lib \ + /usr/XFree86/lib/X11 \ + \ + /usr/lib \ + /usr/local/lib \ + /usr/unsupported/lib \ + /usr/athena/lib \ + /usr/local/x11r5/lib \ + /usr/lpp/Xamples/lib \ + /lib/usr/lib/X11 \ + \ + /usr/openwin/lib \ + /usr/openwin/share/lib \ + ; \ +do + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest* +fi # $ac_x_libraries = NO + +if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$ac_t""$have_x" 1>&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 +fi + + if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + cat >> confdefs.h <<\EOF +#define X_DISPLAY_MISSING 1 +EOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case "`(uname -sr) 2>/dev/null`" in + "SunOS 5"*) + echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 +echo "configure:2187: checking whether -R must be followed by a space" >&5 + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_R_nospace=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_R_nospace=no +fi +rm -f conftest* + if test $ac_R_nospace = yes; then + echo "$ac_t""no" 1>&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_R_space=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_R_space=no +fi +rm -f conftest* + if test $ac_R_space = yes; then + echo "$ac_t""yes" 1>&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$ac_t""neither works" 1>&6 + fi + fi + LIBS="$ac_xsave_LIBS" + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And karl@cs.umb.edu says + # the Alpha needs dnet_stub (dnet does not exist). + echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 +echo "configure:2252: checking for dnet_ntoa in -ldnet" >&5 +ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldnet $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 +echo "configure:2293: checking for dnet_ntoa in -ldnet_stub" >&5 +ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldnet_stub $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to dickey@clark.net. + echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 +echo "configure:2341: checking for gethostbyname" >&5 +if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +gethostbyname(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_gethostbyname=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_gethostbyname=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_gethostbyname = no; then + echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 +echo "configure:2390: checking for gethostbyname in -lnsl" >&5 +ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lnsl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says simon@lia.di.epfl.ch: it contains + # gethostby* variants that don't use the nameserver (or something). + # -lsocket must be given before -lnsl if both are needed. + # We assume that if connect needs -lnsl, so does gethostbyname. + echo $ac_n "checking for connect""... $ac_c" 1>&6 +echo "configure:2439: checking for connect" >&5 +if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_connect) || defined (__stub___connect) +choke me +#else +connect(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2467: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_connect=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_connect=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_connect = no; then + echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 +echo "configure:2488: checking for connect in -lsocket" >&5 +ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. + echo $ac_n "checking for remove""... $ac_c" 1>&6 +echo "configure:2531: checking for remove" >&5 +if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_remove) || defined (__stub___remove) +choke me +#else +remove(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_remove=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_remove=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_remove = no; then + echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 +echo "configure:2580: checking for remove in -lposix" >&5 +ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lposix $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo $ac_n "checking for shmat""... $ac_c" 1>&6 +echo "configure:2623: checking for shmat" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shmat) || defined (__stub___shmat) +choke me +#else +shmat(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2651: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shmat=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shmat=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_shmat = no; then + echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 +echo "configure:2672: checking for shmat in -lipc" >&5 +ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lipc $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +else + echo "$ac_t""no" 1>&6 +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS="$LDFLAGS" + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. + echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 +echo "configure:2724: checking for IceConnectionNumber in -lICE" >&5 +ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +else + echo "$ac_t""no" 1>&6 +fi + + LDFLAGS="$ac_save_LDFLAGS" + +fi + + IFACEOBJS='$(X11OBJS) $(X11IMAGE)' + IFACELIBS='$(XLIBS)' + IFACEINC='$(XINC) -I./x11' +fi + + +out_lib=${LIBS} + + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:2777: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:2831: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 +echo "configure:2852: checking for uid_t in sys/types.h" >&5 +if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "uid_t" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_uid_t=yes +else + rm -rf conftest* + ac_cv_type_uid_t=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_type_uid_t" 1>&6 +if test $ac_cv_type_uid_t = no; then + cat >> confdefs.h <<\EOF +#define uid_t int +EOF + + cat >> confdefs.h <<\EOF +#define gid_t int +EOF + +fi + +echo $ac_n "checking for inline""... $ac_c" 1>&6 +echo "configure:2886: checking for inline" >&5 +if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_inline=$ac_kw; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done + +fi + +echo "$ac_t""$ac_cv_c_inline" 1>&6 +case "$ac_cv_c_inline" in + inline | yes) ;; + no) cat >> confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >> confdefs.h <&6 +echo "configure:2926: checking for mode_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_mode_t=yes +else + rm -rf conftest* + ac_cv_type_mode_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_mode_t" 1>&6 +if test $ac_cv_type_mode_t = no; then + cat >> confdefs.h <<\EOF +#define mode_t int +EOF + +fi + +echo $ac_n "checking for pid_t""... $ac_c" 1>&6 +echo "configure:2959: checking for pid_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_pid_t=yes +else + rm -rf conftest* + ac_cv_type_pid_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_pid_t" 1>&6 +if test $ac_cv_type_pid_t = no; then + cat >> confdefs.h <<\EOF +#define pid_t int +EOF + +fi + +echo $ac_n "checking for size_t""... $ac_c" 1>&6 +echo "configure:2992: checking for size_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_size_t=yes +else + rm -rf conftest* + ac_cv_type_size_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_size_t" 1>&6 +if test $ac_cv_type_size_t = no; then + cat >> confdefs.h <<\EOF +#define size_t unsigned +EOF + +fi + +echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 +echo "configure:3025: checking whether struct tm is in sys/time.h or time.h" >&5 +if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +int main() { +struct tm *tp; tp->tm_sec; +; return 0; } +EOF +if { (eval echo configure:3038: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_struct_tm=time.h +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_struct_tm=sys/time.h +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_struct_tm" 1>&6 +if test $ac_cv_struct_tm = sys/time.h; then + cat >> confdefs.h <<\EOF +#define TM_IN_SYS_TIME 1 +EOF + +fi + +echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 +echo "configure:3059: checking return type of signal handlers" >&5 +if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifdef signal +#undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int main() { +int i; +; return 0; } +EOF +if { (eval echo configure:3081: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_type_signal=void +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_type_signal=int +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_type_signal" 1>&6 +cat >> confdefs.h <&6 +echo "configure:3106: checking whether ${CC-cc} needs -traditional" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_pattern="Autoconf.*'x'" + cat > conftest.$ac_ext < +Autoconf TIOCGETP +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "$ac_pattern" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_prog_gcc_traditional=yes +else + rm -rf conftest* + ac_cv_prog_gcc_traditional=no +fi +rm -f conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat > conftest.$ac_ext < +Autoconf TCGETA +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "$ac_pattern" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_prog_gcc_traditional=yes +fi +rm -f conftest* + + fi +fi + +echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6 + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + +echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 +echo "configure:3152: checking for 8-bit clean memcmp" >&5 +if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_memcmp_clean=no +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_memcmp_clean=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_memcmp_clean=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6 +test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}" + +echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 +echo "configure:3188: checking return type of signal handlers" >&5 +if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifdef signal +#undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int main() { +int i; +; return 0; } +EOF +if { (eval echo configure:3210: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_type_signal=void +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_type_signal=int +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_type_signal" 1>&6 +cat >> confdefs.h <&6 +echo "configure:3240: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3268: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + + + +CFLAGS=${CFLAGS--O} +LDFLAGS=${LDFLAGS--O} +CPPFLAGS="$CPPFLAGS" + + + + +MCOMMON=./src/Make.common + + + + +case "$ARCH" in + *hppa*|*hpux*) + # do nothing + ;; + *solaris*) + if test "$GCC" = "yes"; then + echo $ac_n "checking "whether we need -fpermissive"""... $ac_c" 1>&6 +echo "configure:3314: checking "whether we need -fpermissive"" >&5 + old_cflags="$CFLAGS" + CFLAGS="-fpermissive $CFLAGS" + if test "$cross_compiling" = yes; then + echo "$ac_t""no" 1>&6 + CFLAGS="$old_cflags" +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + if grep 'option `-fpermissive'"'" config.log >/dev/null; then + echo "$ac_t""no" 1>&6 + CFLAGS="$old_cflags" + else + CFLAGS="$old_cflags -fpermissive" + echo "$ac_t""yes" 1>&6 + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + echo "$ac_t""no" 1>&6 + CFLAGS="$old_cflags" +fi +rm -fr conftest* +fi + + fi + ;; + *aix*) + # do nothing + ;; + *darwin*) + # do nothing + ;; + *) + # do nothing + ;; +esac + + + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "\ + src/Make.common \ + src/makefile \ + src/include/globals.h \ + src/image/makefile \ + Makefile src/include/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@CXX@%$CXX%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@LN_S@%$LN_S%g +s%@SET_MAKE@%$SET_MAKE%g +s%@RANLIB@%$RANLIB%g +s%@RM@%$RM%g +s%@CP@%$CP%g +s%@SHAREFLAGS@%$SHAREFLAGS%g +s%@LD_SHAREFLAGS@%$LD_SHAREFLAGS%g +s%@PLUGINS@%$PLUGINS%g +s%@DEB@%$DEB%g +s%@IFACEOBJS@%$IFACEOBJS%g +s%@IFACELIBS@%$IFACELIBS%g +s%@IFACEINC@%$IFACEINC%g +s%@X_CFLAGS@%$X_CFLAGS%g +s%@X_PRE_LIBS@%$X_PRE_LIBS%g +s%@X_LIBS@%$X_LIBS%g +s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g +s%@LIBOBJS@%$LIBOBJS%g +/@MCOMMON@/r $MCOMMON +s%@MCOMMON@%%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + + + echo "ZINC=" >>src/make.conf + echo "ZLIB=" >>src/make.conf + echo "ZDEP=" >>src/make.conf + echo "PNG=" >>src/make.conf + echo "OPNGS=" >>src/make.conf + echo "PNGINC=" >>src/make.conf + echo "PNGLIB=" >>src/make.conf + echo "PNGDEP=" >>src/make.conf + + + echo "PSEUDO=-DPSEUDOCOLOR" >>src/make.conf + echo "OPSEUDO=" >>src/make.conf + pse="PseudoColor; TrueColor;" + + + echo "XBM=" >>src/make.conf + echo "OXBM=" >>src/make.conf + xbm="" + + echo "BMP=" >>src/make.conf + echo "OBMP=" >>src/make.conf + bmp="" + + echo "XPM=" >>src/make.conf + echo "OXPM=" >>src/make.conf + xpm="" + + echo "PCX=" >>src/make.conf + echo "OPCX=" >>src/make.conf + pcx="" + + echo "TGA=" >>src/make.conf + echo "OTGA=" >>src/make.conf + targa="" + + echo "TIFF=" >>src/make.conf + echo "OTIFF=" >>src/make.conf + echo "TLIB=" >>src/make.conf + tiff="" + + echo "PCD=" >>src/make.conf + echo "OPCDS=" >>src/make.conf + pcd="" + +echo "--------------- X Welltris Project ----------------------" + +echo " +Configuration: + + Source code location: ${srcdir} + C Compiler: ${CC} + C Compiler flags: ${CFLAGS} + C++ Compiler: ${CXX} + Libraries: ${out_lib} + Install path: ${prefix}/bin + Man pages path: ${prefix}/man + X11 versions: ${X_LIBS} + X Visuals: ${pse} + Image library: GIF +" +echo "-----------------------------------------------------------" +echo "" +echo "Type 'make' for building XWelltris binaries, and after that" +echo "do 'make install' as 'root'." +echo "" +echo "Thank you..." + + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..6ca1df8 --- /dev/null +++ b/configure.in @@ -0,0 +1,288 @@ +dnl# -*- sh -*- +dnl# +dnl# $Id: configure.in,v 1.4 2003/02/27 08:27:51 leo Exp $ +dnl# +dnl# Process this file with autoconf to produce a configure script. +dnl# +AC_INIT(src/main.cxx) + +if test -z "${CFLAGS}"; then + if test -z "${CCOPTS}"; then + CCOPTS='-O' + fi + CFLAGS="$CCOPTS" +fi + +dnl# Checks for programs. +dnl AC_MAKE_SET + +AC_CANONICAL_HOST +changequote(,)dnl +ARCH=`echo $host | sed 's/\([^-]*\)-[^-]*-\([^-]*\)/\1-\2/'` +changequote([,])dnl + +dnl Checks for programs. +AC_PREFIX_DEFAULT(/usr) +AC_ISC_POSIX +AC_AIX +AC_MINIX +dnl AC_PROG_CC +AC_PROG_CXX +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_RANLIB +AC_PATH_PROG(RM, rm, rm) +AC_PATH_PROG(CP, cp, cp) + +AC_SUBST(SHAREFLAGS) +AC_SUBST(LD_SHAREFLAGS) +AC_SUBST(PLUGINS) +AC_SUBST(DEB) +AC_SUBST(IFACEOBJS) +AC_SUBST(IFACELIBS) +AC_SUBST(IFACEINC) + +dnl **************************************************************** +dnl On SCO Unix, there are ELF and COFF binaries. We want elf to +dnl provide for dlopen() and friends. With help from Tamas Laufer! +dnl **************************************************************** + +case "$ARCH" in + *sco*|*SCO*) + AC_MSG_CHECKING("SCO-Unix. See if we need -belf") + old_cflags="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_TRY_COMPILE( + [ + ], + [ + ], + CMFLAGS="$CMFLAGS -belf" + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + CFLAGS="$old_cflags") + ;; +esac + + +dnl Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_HEADER_TIME +AC_CHECK_HEADERS(fcntl.h \ + sys/select.h \ + sys/time.h \ + sys/sigevent.h \ + sys/types.h \ + sys/stat.h \ + sys/utsname.h \ + sys/param.h \ + sys/wait.h \ + limits.h \ + unistd.h \ + errno.h \ + strings.h \ + math.h) + + +AC_CHECK_LIB(m, pow) +AC_CHECK_FUNCS(setlocale) + +dnl -------------------------------------------------------------------------- +dnl Additional configure options added for xnc + +AC_ARG_ENABLE(debug, [ --enable-debug Turn on debugging output], + xncdebug=yes, + xncdebug=no) + +if test "$xncdebug" = "yes"; then + DEB="-g -DDEBUG_XNC" +else + DEB="" +fi + + +AC_ARG_WITH(sdl, [ --with-sdl Turn on SDL support instead of X11], + sdl_support=yes, + sdl_support=no) + +if test "x$sdl_support" = "xyes"; then + echo "SDL is ENABLED *******************" + IFACEOBJS='$(SDLOBJS)' + IFACELIBS='`sdl-config --libs` -lSDL_image' + IFACEINC='`sdl-config --cflags` -I./sdl' +else + echo "X11 is ENABLED *******************" + AC_PATH_X + AC_PATH_XTRA + IFACEOBJS='$(X11OBJS) $(X11IMAGE)' + IFACELIBS='$(XLIBS)' + IFACEINC='$(XINC) -I./x11' +fi + + +out_lib=${LIBS} + + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_UID_T +AC_C_INLINE +AC_TYPE_MODE_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_STRUCT_TM +AC_TYPE_SIGNAL + + + + +dnl ---------------------- Checks for library functions ----------------- + +AC_PROG_GCC_TRADITIONAL +AC_FUNC_MEMCMP +AC_TYPE_SIGNAL +AC_CHECK_FUNCS( getcwd \ + mkdir \ + putenv \ + select \ + socket \ + seteuid \ + unsetenv \ + setutent \ + atexit + ) + + + +CFLAGS=${CFLAGS--O} +LDFLAGS=${LDFLAGS--O} +CPPFLAGS="$CPPFLAGS" +AC_SUBST(CFLAGS) +AC_SUBST(CPPFLAGS) +AC_SUBST(LDFLAGS) +AC_SUBST(LIBS) +dnl# common parts of the Makefile +MCOMMON=./src/Make.common +AC_SUBST_FILE(MCOMMON) + + +dnl Some specific OS stuff + +case "$ARCH" in + *hppa*|*hpux*) + # do nothing + ;; + *solaris*) + if test "$GCC" = "yes"; then + AC_MSG_CHECKING("whether we need -fpermissive") + old_cflags="$CFLAGS" + CFLAGS="-fpermissive $CFLAGS" + AC_TRY_RUN( + main() + { exit(0); + }, + if grep 'option `-fpermissive'"'" config.log >/dev/null; then + AC_MSG_RESULT(no) + CFLAGS="$old_cflags" + else + CFLAGS="$old_cflags -fpermissive" + AC_MSG_RESULT(yes) + fi, + AC_MSG_RESULT(no) + CFLAGS="$old_cflags", + AC_MSG_RESULT(no) + CFLAGS="$old_cflags") + fi + ;; + *aix*) + # do nothing + ;; + *darwin*) + # do nothing + ;; + *) + # do nothing + ;; +esac + + + +AC_CONFIG_HEADER(src/include/config.h) +AC_OUTPUT( \ + src/Make.common \ + src/makefile \ + src/include/globals.h \ + src/image/makefile \ + Makefile) + + echo "ZINC=" >>src/make.conf + echo "ZLIB=" >>src/make.conf + echo "ZDEP=" >>src/make.conf + echo "PNG=" >>src/make.conf + echo "OPNGS=" >>src/make.conf + echo "PNGINC=" >>src/make.conf + echo "PNGLIB=" >>src/make.conf + echo "PNGDEP=" >>src/make.conf + + + echo "PSEUDO=-DPSEUDOCOLOR" >>src/make.conf + echo "OPSEUDO=" >>src/make.conf + pse="PseudoColor; TrueColor;" + + + echo "XBM=" >>src/make.conf + echo "OXBM=" >>src/make.conf + xbm="" + + echo "BMP=" >>src/make.conf + echo "OBMP=" >>src/make.conf + bmp="" + + echo "XPM=" >>src/make.conf + echo "OXPM=" >>src/make.conf + xpm="" + + echo "PCX=" >>src/make.conf + echo "OPCX=" >>src/make.conf + pcx="" + + echo "TGA=" >>src/make.conf + echo "OTGA=" >>src/make.conf + targa="" + + echo "TIFF=" >>src/make.conf + echo "OTIFF=" >>src/make.conf + echo "TLIB=" >>src/make.conf + tiff="" + + echo "PCD=" >>src/make.conf + echo "OPCDS=" >>src/make.conf + pcd="" + +echo "--------------- X Welltris Project ----------------------" + +echo " +Configuration: + + Source code location: ${srcdir} + C Compiler: ${CC} + C Compiler flags: ${CFLAGS} + C++ Compiler: ${CXX} + Libraries: ${out_lib} + Install path: ${prefix}/bin + Man pages path: ${prefix}/man + X11 versions: ${X_LIBS} + X Visuals: ${pse} + Image library: GIF +" +echo "-----------------------------------------------------------" +echo "" +echo "Type 'make' for building XWelltris binaries, and after that" +echo "do 'make install' as 'root'." +echo "" +echo "Thank you..." + + diff --git a/data/board2.gif b/data/board2.gif new file mode 100755 index 0000000000000000000000000000000000000000..54077fb3598c9684bf7b7a09b1ef01de6370966a GIT binary patch literal 16367 zcwWs{^;6Uj(Ei*}M+itMDb0}rA|1zZba%ti-68D(cStJICEeX!N~feCB_JVEk}8V# ze&6@6cz1SoXZDAk-JRKIo<~_#NnFB)8OH?t6Zk)a0KmiloC0{r|L`FQpa;akc)&wl zfE9Q^58;Mz0mN|t`vZUnV5A4*bAbRJ5>hr&0JsOZgaMLKKnNh?!G}Br0ipmP^6=qP zklI56C;V;m4A6W8=mCIm9iS>gp#}oX%dp?;Q*#U1s>Rs*pJwN7%+dp zr;MY*uf(qW1TcH@SnmN~2M}8jl33yZb|escFkt8oAjQdTNC9_1MFj_NV#}wcTLuGw zJ0*uXvAr~L0@ot~Pdva6pmZSu{K!O%pii8^j1G?hKXzF&T%rJ6AQY&^tL}cp_RyC| zPvbc#i~^*NSOo%(kVQ&J%C(*C<7OGqsSCbYJ-#mGWc8B zT0wb_wg|TPVi>409snf(Sswmd_*6UC90UMAV8FS3V6S3Pu@!J0Y&s_b{EPtZ z{F=M*0qjcv`zn3Wc%a*Bc@@&N?7lh~vA7-jbp?I;19H3_w|9*Bagg{IOL+S|`Timu zdzTCRzcH5Ixc`^={x|&ZPXG`s0D>^6G#0*(hEVcYj5ihyy&`8*%TsA89!Yro%ynbD zsbuU8vqC(dGpmg%nv1Mlq%);-A`@y;oi>qDK9wczbWkhNT=B607EQ#c)>=7VqLS+A zu9|!Vs{j{)lhu|T^=q`7l$Isa-Im{prN=X>x7U7dabB#pT>nus+abLZlcfHlezOL7 zF}ZA>dA?cejzi3((b>2&6f56-N*v^6H)?(*`;Y#!kHfenhjn=#tzg#QNA!Vrt^c@_Q@Kc!t3tO(RBW0Fq-(MdYJFU%$Ss&)pT~S@8M_(Tc!ZH z{`=3kP3lw}DCQTh*N7Lex2C0pBe4pg+8HuHx8uYoq4n%wL(G z1r8uR0)WF9S)30oLtfGXB$7}a?lh$Bdl+H-&qA27bdcf;SV#xs$M?0s!{8T!7yS0(*OA_&C?&v}?r* zP1dZ7hy#0cvCvb)gTG|iXSkFr{HE@-&T%L0%*(w8WpM)a%%CC{iS{N-+b~@5&e8ct#|?uEE9H6KL@FmuxTLv!#sG6%X|16oy<2?v zc1(4fVwx~H2SamU<=alvwcO71<`_$wgIk&?Xja;S7330xRA38FtY+#^jUa|`GsPeo z`_HV3_|rf4(bviEm@+G~Rp1~07$PSqKgk`}>vbRTv8okvBp^aR4J3==BQJarNQm#s zS?vCe`n$&hKah0&or(YPC}%YFzL8|rOs844Uj@#*tw&1IuagFtjBQq75_l@vmzx#M z46ikuT`L}g7-#49KYVd|vx3NGzFoD?^tk=(Tv2zs=H797yY4;4|8v6?XWO?0-E8jf z8A6OrQ+v%#u{7pZNn!Q0x~@OWJ{g|_MaWrv?HCCy9-lX-Ik5%XcAv%R6@5BxqW}G= z7{y(h1Ami6R-FcDE@z*9k-2uGQD^))uZ-@#{Z`TN?@s3J6WP%(V{-k!&gBXi z{`@*@!2V-nK(}nnAu`rNT zBM*oi1*&ucKstgVq>U&%hHVt?~Re8?!8SRtGzP&gr% zxct|~CcL7iK>}gsG4iZ!BBwtnyc}|{BX~t26vU6yfFd+~kQ4OMO0;j?kk}aZg0L%UW3FTi9@k2{U?8&ESS_=tZ z8SD`0W>Y-z6~Zxg-e<6L0ShgRrq@&DvRKBAvezR3d%go|;cXS2n3!};s3YHiGm2xY zA!VDSLY(6h40t>U<}Y+49%LS+4)kLdR z8;4S42j^(R{s})bD$V_2Qd2Kn#D#k0#ugPAreDHNcnJJ|d-Ai{hSqTkG6b z26g65*rof~Il`|<+{{BH4>81V@j0a7&0W@{YRPZKjpl7uixcjripGtq4H{Fo5>d@) zW`TYPY~g{JE$E_Y$ID5&-IQq|wv_eWc>ZJ)@JH>;pfz_7BYqy_+L~xjbEOBwLXrd2 zs8>R`h34m$UnerpqM@j7gh~?P8@11YZus3D?Np~2b;N6YQT0q;js`Bfe~k!a*b+T6 zLz+PX5-mvN-QPFHMXg;n;CLR&MpnXigfj;>6nU&&Ch%{|uS(Dhr6f6g#Dr6~A0E|T z`tonYCVhX4(aVsJR}E8VUZLscwTEi_#Q7@P(}gY9W3Z<+7qmG0zWf@qAY|%cpA*6J}_cg^b zU2EYr>lyXVPx+L4d}5ra=QsgJTDFLB#@eyO<~m{jB7ydkh1*@aWpVyJVnW~+S(h`dcM&5ot;gWWH-CV0ng zll8$r78JBJjfyWmIgVD2y^)>s5rZ!om!m&8)mR8t3a0bD==r9Mz0IN|8gArk)Opdk zX+U+I5YB$&{w#l)wb5qQtb?PO+iOZ{_Hr1w-%W!t%u({*E%H#6D0wicOMUO0=sjO@ z*Y}y1)PFfOy$oeMeWbq-iv8nYc7k0u^S*7N%iV~m6VQ&%Val&xsX%7=8wPiu%dt_9 z=OSx7&OdIIi5j}^zt@M|dNA%9fU+W5lZjN8BW@1$T@=k-@WM^o^h=G1)Ts^ZI3faY zA{bU9KiGy;tf(%$vTX?n{pbjg0s((SgTUn|91i67_E73iU^dpEkv(82Q;(SoA_jdz z`or{jX1D`F^Fl0?Y8mV(8f5mJ=b!s&=w6(qq0szYcL+69d{ zMwmN_E1gqe`X47=o4k=1N(9K299q$+<In11EJb| zyrJY68c+YnE|Le%XZUEr*kG#;4347fNl*e@MY(Fp_BJR5TJ@M&1-iJDL^JAi=15m} z4K;1Uv3+E2f-MVP?a-y;z-d_tyJ!pcs)RG|BWak^q&rO`Y+oV0eNW4DFa}O?hfYQ@ z;aZ}ut?jB`Dg$dWQmlTbKN3pBM=5up9R!b50$cUg_kGI2Nm6rfTbW&(o`;%EsKQ-% zoDuYOXulm!9Oq%RGbJ=#hhIUPR=%@(h*4CS6H>V{;B;A|$UX%rk)8ILhPO%^CF)r( z=xKgv=Ui&n@hh=)PPMippexf-_QFuMmTH9^-B^HX$D3D2 zPA=lfi4soyDhUc+;1-JfG0>EZe!X*uwALX66%jTybq4F|5W-kEi3mP*^7vq*UuS*amPl)>9qPs@CK+{#O6)?E=aA4 z^zc)6GJHt`NyyGHICb(U6SPpFj`zqS)qg6fdQWt}|Comuxx1gyu0f&eJW+fn^C~&eKQYWW=*`?j!1{)*n#ipmB%G-Wqqsb2_n{IBE6#_^BSiNb+&5MJqtzuuop!?Wkm ze=a5NYHz&7OmonM^krdubfq#9c}37no5#L8SvjZ6;OkbqMJF3IXaQPM-E>W>BQW9y zt4!FH?%!O6$qrDdV^2$U1tt5-dvsUbKwgmEzBn8cR3$+BS9pkw+bd^SmQA9YTJ^LJ zR4iI`|C-ofTwP4e+#NfRY$I=IvUDj%;OX7yv~QmEpS7|l!}D@#-v@c6wwZAm5wUS9 z587MPC=ovIbO?qj@diYARce^G7a-epjgc-sRiS(Fe)P{RhFfb^4ocqns<2}Gj?-T) zT}LBc_>amkzr0_uKK8^&(WpT zsj1G@8E;wnn@Cqb#x{A) zX}KK}5~M9^u2dhXh|k{QC>4@vP}Q+&mxIv;1A$A`?vgPDS?zv>ap=@aQ%tE3?s8~z zNWGDhi)@T@eTAtdd)tbstD`ttGPWl9SGK_CH)oFOF26%^4d8;I?K$g#KDVaLuS{)I z;g=5qDRRxw<>aF_GyZL&69hV8B@s5>f$N~$`qo^UgW#@%Fzu^ByHwkqa!fIKR#j%5 zWg1A&%@^m;F38c^VpWYBQ~kYCwFhHPGNcRH>+IHd^@#R=aQbHT8S+?WSK(4C6ihfAtP-MCfg7DtLO~b z*UxY7pec7YPKNUi!-F<(UCPyi84wY9aJki-PNl9_=E&2k=uYf$m`escOuCD%0>!AL zQp^cy-X{8!K}6`HECqyY{v0Xfv$D}pqHXNdM5#;(naX{$p(#}OX5YIwtoCB5M*@{{W(W8a6fS(U!dh{p#g#E}EYowG8 zk)aW8IMSU+Tpb?|^Mz`1kHmDdXEHZU$^18``QDg@Z3_|25q8npirM_UzJMSd z&N+ezM3@w&r{_kIn@Yn)w7Zm;?Qyq3tN$3>AfUylO_7=4<-Wii9)9{`tNq^jq~*S- z;xR$i*()}MGJARVys@A>xD8q-=#wJpAe7u5C`z~L!J62AZgo44i4w4-GeLCII)sY2 z>s+t^>0uLTxDpeLsNT-5yOH35@`@&4(T>X>QFhLe1yunmR-c95{`*YH^R3(f6)G zFU%?fR)15$&1RJTQEGRyBV?%%+;s>Y8vsae>(s~1zF~=?(h+VXBrFd;BE+v6baCJI zWaan5Y_6rC-!%56fI-Tvdt7md^?nP6R0kd@lwot>M2r8}JG?a$%*4HvI@ZV#Lj9)T zWNo$&)^so5%>U`GR-5p1$U4a?zaSj6yuOHSU$Umx3AdDNN}K=scjH?fY(A-Wsc$Rs zqM`0H?!e|u{h(k~AH0x1z3#VZFQ;SkpwkoP+1htoxDl`?VcU@WZ6aAw6r-WZO(G$F zxyy*LQToK6jtF<};!hz47Sp15|91X--P&HrCl@$`oFgI&pdS=QNfnc2K~kY-c5ExVyp8FO`-ltWcA(lFuui2XGFf9zE7jg-}X z8P}%C?3SD?!V4Zvwu`*bv*R!d*a#G_^n#S z*&SgZBIr`>10xt?&L!w1My1OgV__;#v+Q3?~dv*+-rhJl{X8 zJK6SpGX3wwck5(qL1$OfH5{35kJ+%wvA-Y2FVE0hezv_6aemdbeb;~fS5^!`Z3y%p z`XUY8nITEc1io_wxk&eVpxC#t$IShMNAx+B9K+YGZ?ms2z!&gXSCg`gpYP1zTP4y?pYh;kb)*?*?0Ob(-d3? zdY!3w2@NqGt)~}@#<5j35~j(jhb?=QvF#T+og)Tr*6pr^tfk>n(n_ZgF!{76Fz(Cm`16}Py4%8!Plhz3HNDsV+*?cTO_dHP-wi(JXmzpoqCy=qjOh8Ksw+$QrADasO-JpF699J1#kZn?r6g$1ERBKq+9qI=7<``;bGc)MS2FF_HGU=ici4 zSLI|D#nz_{7Ur9|xz2j}?HLMSw z*eaV^skiD41^vXBul}$Zj-!6+D6LojCC`R!9i|3*j)eVwf#P|epWNAxe8~l|AIV=i$4_2 zUE>}*$y;X+nc{D=h@E=chq!F#ni9FvIJO@qoJOyTjL$@EQ>kbH-&*yj#V!){KT0?t zuC!q|{QQ$rEh4Q`3PT#$R!!Ms_f{Q59F@PG8gDqS%o%*nUtde==2~AzfjYoIPyP9g zfq~}8wWPXvz>Q%UB;Z@LshdaaCvy)6$cklvW$cP|xF*Cz$qRjBVxRgz^;3+n_xNYW zf^<gs946VT8?j`w`IgELssfKHbc8^ z{465=7`AVOeSHvQ6-qq1vi*WUKxGRuai|M+_3~D_^ZM3eTMIDs!>xEtO zMt?lpF9OZolz+1Q@frk)th0b1V!cHl9?Inv4bxhO6^*jIlr9>tu?lG)e74ftcP)9( z98JRKJs62gA-L@i(lZVZ_+0gOHiU``lH~t$m z_BPWZc#=!3^78QAQ^?)Xjgf)vZp%u94s9GhGw^EAOC>C3+kdQME`K5F&R`2G1% z=F70-_ndyAf3LLp)XsN)zWjFy`Vj`!cmi5+8oX6)(2iKN#$kM1e8%!4oFehbJ>TO& zVp73qyp3&8b|#h!UsearmZ*)(uh@rY`v%QxZ=?Hbg@@`^6T@F>^FaRc1EnYtm*}1i z+4Eus$zU=~q0&Xt@E`y?~Qlg6l!rJ_RW_12ho?}n6CRm0IU#k8jM-XcR)2ke<@?zTs-5UjS7L;=91Q`wwi z)lB+p{c@{!sWmGU1u`ZQkQ(W!gN_kn1LkxRom+M1kc)8LYKeqQ9Hj>02Ti&c0>s{V7CfwB6(kHAM zUV30lg*6V4{D1Nj!t3mzUr($R%0EYG7_}Bsk2^mcHJY|GYWo3Nbs-ECTy5rS2m5&p zx$=_dfS5bFMzY}6U1r-#DoO{^^SZHhQ#GEF<2!8g#dq%ORbOE(%uP{HWI-H%YS_6-)xNGs%3z@$`a8vTP)Ey zQ6@J2HB4LHn1c9gdls&q&OPe=%6!^}x@5IPAjanny@Ks?JkwEl232f$n0+S@Jg$xv z5Pq9l%EqqzSy0VWIJF?p3VJ0zrFS4~UK!@VZ5pg$HtL&=U3Cyq*q^f7YR+EKI1p6l zneh`S%G&vRAUZ}n9aQdDkjaXK5tz+IbNUy3{OW}0nVWDAyed9F`6kU}w!pd5l27Y# zq`WTiQ7PZQ!V7YwjaHTgp%g|UT1=smD zv}da;gKW@R*c+HDhKLl6a1w!k@LJdqV9OP`>0WtnL&J6&J;nL0KGeT{l1I}Fg>Yyv zW%G_l(VT&Qdm&^m^)sbegrSP^xU%HBy$nEZP!}Nu`43rp^Vz;GiCHQBC!!EbX5aA+ z82F4RH+yhj-0wFG&>{|6|FZxJ4C&Zk42UL|*#tv6`BFT=#dh3h5B^E!x@z4v7xc&? zv}1Xl=VK)Uq_=72BvQ3U%-e-SK^qfKmaI^_g`rxzH$DL~lF!D^C zt&6vgA$wK)+l5Yt$Hju6K~rlYGgJ{->$jl*1WUpR70b3%r`8iXEDMfrg0cvyXkP^v zwj6aXg`3fV;?)Cr&p)!@d#qgbg=NcK|4sSPNJUE+^3C6Pf~{R3w(HA%AK}XyG=+mw{!ohBkz}FP0gVAj`ZbmbYoBZvqc!GedirS zoNhy`x+Qy`eqh{Ng6FMx575b4*_*W9{%v*eF`~IeL2lJ9I`7xOpxwYYIbi%vo=-PU z&l~fh2@oA0gh;_t^eF=#q7qApX|u$!C1`%C*w1d#?xE6HoNM^kP&u9=+-vnAUMPmf zU11?wURi|v&YNu5?%OKWbDpcJR0bf?Tlhd!{ZT(tW@vN zEFAQYmZC6#fRgdJETm`rR3G|F)UK!GV z70n5al}*Nzn44_fo~%!+YCum_OG#6UfCgG58U57?P5Mh)x~tt)Q&LpB5yU;cQ*WXq zt8h?_e6f}4lC((JP${8qkXmEsU>mMXt443Kf5NE0MvSCvtog=_XPOb%BKeEy?FBt7|Kk!W4Io0mCu02kOS!QghzR*q|(o^URe;GJgm zT@RDyiGXxhXO4dioB%rK-guwfWX!VEDIwytS$#Ntq-vEi^6WDTx!SL4$yyhu#;az@ zRWKhC#W@)u2kgX0H~{UqSQJEjwM7#(^Z{*8^1D>W<+6V~uMZ7$?%OG>R>ywg!+f9CO-E?~-gunS^W*F)V(gkimi%NS;t7;^YyPTC zma+mu69p~A65e>k$#_96i;3>&|I2H;y(u~Zc`SiW~LoQhBR zS2~1l{76+g6xTzt>DC*d(2Y4!diw0s`}h>4LWNn4kC>fLPK-qJQ-mNCrC>Ob(a0wa z3d9z1D=bYV2u~~^Tm!>y6q;_}o3|1MA9oExovG52se{?){C6fvcxEOPW(6awVb9mp8P{?R*XHfl zN&?LC>dY$B*U~i2lEc^P?oDfDI7&Iz-Y~8=c$n33tT)blZpK^B@-Xk9?r6g^r|nYF zoEZ1p8E>88sZd$zY%5ABea{P<(9}`Q(CEk%`TTlhw%>4}AW@@;eKPjhWS+`ok=WpR{bJMJ``Bmd4*O=!h8DBboFCIQL<73YEwq`aH5QjG)HE%Z>&TvH zY6=`JOnp(^XS6)!fCN5((;f!-AHH@ zC-CK08B)VckHTYt>mB8qpLRjCI1e?zduo>W&Wb{bUD$FkTxt>Xt&>Zp8-Cg;HZlky z<@2xGQTe|317`{2Ey2jXlu+`%All%eqXt_HyT+-N=Dxw&)e=|CE^p`bCWEaS-!4zP z4YA<|lXuHl3XHfpKg1$kYlt`MBjs1sciY0G?DqVag&PUtlMYSDN(;X!UB8|9f{|yP zZaTSz8nE{*yzLjeJ^(33${k@%*ls^CVy{hVuO(Zo!Q`M!>cGUh55rg1 zKVvcQ+%vG+7jfPH>|knA&SDy4-D)^y=2&FjZ)WVdY8g>zm0@GsKZZPTP}6dBpxL&g zDYBW}H}-UV65^;S;3%KrD1WzSo$p{ddVpW-=-qDQHCy2Q`e2&T$>x)zr>Il3;-P__ zlSTc(Vt~^<_o2sYr~a}-_b4Z8tHZLz!&6hoNTzRRfV1MRliRF)G^sN><{)%-5tC6G zli`Go&)ACPWD31?O6qs^)f!_R9FUNhtol!qJ8vKQyw=ps6tYQ)Syvy(%IyjgJsHYxEA1a|@axcY*b0B9Bc>Zy68&L7suzE&8{4Wb zM~zRpg0S|&Llydct)@D?V1uA2aX}DC&W(9~E00g43{DpFCxwy_YMoV_H=o_m_ZS^r z)Eq899&X=jy&qqW2Rr`uk`|HZWV^2vx~&)h(Wl$ilv#aif4UiwI)4I3zqflTma66c zn4Zv@3nK<)9}Ju(bw-xJHtu>lm^@xndamhvr`fvBr$>%j8LhHQe_{|H;05FNo$8VP zXyR_a6afjHba*@%xOK?mpYS*Dr&4@W9Ni&Hj?Pp0{-IX> zpj~stL%XQlnF>o!tv&EJdN=%;e4UAORm;o+N1SOlZz3m6;xTE46EU6uODs?b1FfPB z1dnexCOI;tW_f!%@(-bp=&7G-&~RzwzSZaBO36vAfcZ@ijvB$_Q+8i z$V-p|BGc33b2^d965ETud0k*pa#VJ|Uj=vjU_QyP!TW~P%;|c$f}vi-o6c$hyiI&h zp^w`%22-rwctjhg{P;5TSe>~V$<3h;9M)2K?v0cLH(A`G!w87V{x*e&clWql+WK^1 z2?c+Je6B?I{yz)i!xRQS`Rvx-e~Ba=dr033%o6R?keyt0jITY}jk-l(q;nM6=@hEw zYVxs90k0NPOn1^y9h8g{L}|%yuNkO2W&Km`)AL(BW%%+Ew>?6R@sq6b! z^8T+D-tv&wzdXPED>)*Oxj@BpoB#~A{R>W?hMDulHH}Uo1FDeI8O7b(E7z{S;fpuO7W=%^bLWeb z%J7fRPo7a^PVc%)gLG6Ul5spSk1}CyX_Ihoyq6nb2nf)y;O4*qKA<@%gb|&MMex{% z9D23R7p$X+bYi|I-!9n3lUbEh_*^d8C)0S0o86BV_7&oUSZ3W#Qf+3)DIJV@yHXuL z7E*;vl7#FNX+}!FBC@=@sqLD`zf&18}jq=)NP)3yGw4TKYcwz(00g&0Lv>d{mW;5D1uAB-u<`m!E}x; zeg;X`$?kZOycCUPj{ok*cghW0CwI?JR-2s`&v;h-T{n{aO14hTZ%(%cWsaGw{)k`h zO=dn@SahGgYo z=4_z07&f&R$T;qZPSyneZWYs5uF+V=II6X*ouuBrPPR8Pca;l?>s7IAZ=cg}m&6s^ zce1ByO1iM8sgTlgB>oN%9U_dd4EjU6yWiQ&5)Y(9K=( zt{z=g!5U1>Q&pBDd054gl*3a~$3#?J^SF+Vx30~Tu%@nLznix~dUuUCXOKv$HhKUo z#oIK&v(EWqg0+XQbv|m9uj!*&D1Uo>TV|cYvCkj=&UD)Knzo&s&@-d2mu3Rpr``1F z-962J1p01VtBYE0zxSN$UmQq29RLxN95w@FVL#sgTXPls@Zh}0yN*Ok`l5$?kw<8R zHn)erzi3 zh&8`|ti_iRS;(b%_kCVfO6F*xLiAo_Im9=wZp_e4vvqdQ^FCnG@*|1p=W->Fz|StP zLISJwYwmAfyZb#5+tf+m_u34m=lQu7@+XPwOMdsg*v>uP*3mYG_w|?MRmVQ@Jzl0+ zm)*DK{Tq8~*8RT|vYpH%4vWSPy2=U@BDx(*ja?Q`8(8r+{^CuLk+oqM$}KSrx(Bfc+vNp-41~I*&|-KJ^^hy!9-aE zBfpt%=g@r{ypY$?q{u`50wj~dxJE0(u67M7PLl9W+C7{PLI`WkC%R1Uk}t0gQ#H@~dRly?-EmfwS!jBl z-1C)Tzfw__XyFZO9t$gF)wtr?STZH<9`hA+LQHGnEf?CJfv{>q4SylUl5dYmf>u>6 zMNc`OftgdmbW$r`IJH8W9jebgWwLgTO{Xp0=QNg3lm5PtQ910uYdA4w)4Y&Ln&%)8 z*EMBJF`0F(;3)W?QsR=l%1-R%6m6**cb(PFne^Wm(Vv+48JwDZV8JOFDz1eGewKIo zw_H%Wb@n>_*}IF@3h_hL{*Wlj{J*8;vfRJ4xJ^-f06CyXVH-&WZ+@g?k~5G03+QG@q#M81ACdy-=m(^@QAI*o#` z2xIf`gOPFaK9M5Q)zmzms+E%l@I^u4QSs!avBfN9$P<_ek%`RR^U$?cGW!M?6YU(F zYTuUk0IMuOFvT4xxg4dj(NU%_`ZZ~<)!iV}iYM4geS{8lHZR6c@ zH%mF0t;zo7j|PSnl^8K+{U_HoakCB8pl$t9m=TqyqF1RCd`H$>gj3c~xc=GtLXB3? zOn9GD<6ErQ33z>_@u01dkZH}OBtm>(Ua7iPzQxM#S@37lo$tBS?hr%J({e+!Y%lUp4QdK*U<8lPuMn=Q# z*CwXl*f9F*%Un6l19RgSzYcP*3(4+}ls@h+H2k}+BzyOLfH8Dzfa#WLK<3QvW&YaG zzpFZI-$}r9sMMY8uYudY7q14oK8yAL9w#fmd^+~`Fqi3a$-7A(NLA%c7*&5T=}gzF2zGeUm0*p9I;#E*JFAR9{%vHb~+Yyy}G z%O8jeO*}6vBqA-$EG#6B+V;SO5km@aCbvm4klrUKJaH5V7xwJF;MXZLS%wPu1O|Bw zqkM=hB&B0nriumWyd(c)4VGo0lGJpA*iet6@qTQQjUXR7?koaIKp4w%*^b>?3=VlF z^}+Vz6q^Nd3`m^j3x5&7K1k4tVxW3YP?(o{GjE?*$Z(mcJ)Ood4m)HSMo>r2fCdSu zB5?q!hj42aSC$Ye5Pc(Pl*NMb`V(pEAn7>haTf5TIkJ>bmDp;RK@<&~usBbrv7Nyl zUKin@QS3x0HoaZyQ5If0TZP9cM;Tm!9DtH3jZvwX5Eod!U}Z4deM+RM$?(;9oAvpD z4RP3iO6;8g6Po!Bk45S0BoHH@Rje>)%UxbXMk9|e{uS4@NPLt88EXr-htW-9LHrBF zgd!zUw#?F_U&U_`51na%Io9Q-NVt@T9(&4o7Lh>qDa0OIdD;^?7%?sktYZhaFRd@!6R9elZhS?8k|$1k zMKUh`BycyF+##fqneC`l`gWLrd{2I!l^(DGG|E6>gX|G@*60#FNfP8^l*BILiQcBD zYo^j2o3baz2<|8=DH>11Aowkw5of$YvBOXnGTNELk~Gm$7-Dtc@SiA&x-PSpB_T1g z)gpBq15hjY2>LLoxDC!zF3%Y9WRwX z8>CKF1jJGDQSYs?Q*4TzLINvHaRC83cKX&59a?*Sy04mBhaLMB5tj&Rxs zya#ry85Pny>=CS$&bPSHR_UN|6vY;jiD<`PZ!`4ud@vI<#<3D1$i_c8D8vbqa?K=Z z1zrhL1+G;DS~@nldm0>IGh$?~vZM)$4K4zfpQb=Xn* zJP2?WfXcVemb89X?1I4sG*et&7dscyk$HLUxpBI_=c_gqtu8r8a5r*H(W*W*sD3lY zT~7C)RCLcT@cRI>(}sOjr5?{+z-(DQ&s-Q!N(@iU>%^LT=Gsx$8rSbW_0@I759;sY z>(9P#lvXEr^EB$s)^6=L(D3du@LF@$G`ngwj3%|nx*fqLNyRtPjmoR^j_-BG4f1WE zXD?-&su)KEcu~R>9ua$N@RaH@bW%fZ$MR_bq zYgJw~SwEQX53>r;YCjU;u%kIN5BUHABaOkeA zp54Um$OKUx9wA=BBxc5g&0>w$g{gKiLq~s(b!+Dx+3c~v=B zFUApFovJWqhq?B%Gn69zmK~kI-WID{-L3$n4sV1A7!@c!T*LcDb>!x>A~13MTZw9n-96M4;6hAwUiG< zZWYOrlZol@m*8PLMht9&h8AZ~kx^0ST^gMmuB8W>wxLV~Ed-wv8qN@8I=m>c&*+dx zP_7CA$PX%f29WDWEhJchRyg0rfRY)bjDfKkqXCg9a}2D)28|~Ihm6CXq@tPChq*d% z=@S`V$O`@P5Ndo5M&E)sb-?m5!iZiAun3rw-GFoDQt`2=Ep7JOcT@_$ni1nDsJH`^ z7@$YOpFl^bk#M%XDrPP~kC}?Df|~WphgTl~5o}4}&MA%q^UEzmzY5cJ2y=4{3k@*B zp=+>DLY#ZtJ~_e7f3>Y6KZHX@m{z==q0T`7#a0Q3=Q40NeaK@%7lXn+?}+7^fZE4VbekpIJ=Q;cAGp7%y#}VwCKXh6vd!( zY07&eE=TYG&!0yBLerBLp60J$f?_rpp0bG|5ln;WM8O(C1}y;!P{yac*ZOt{QA&FU zOL=(aO5#x(5Ig-mS>l#e!QW^sT~PtiJ92HE+OAb0>Kfg?5bj$M=LbiMxM(+P%`K@6 zJmVR=;y!OfhJ$mn}KTI7P1zpNw$P$C6fy3EA@XF`> zi(-nc!p~NO!nr=AmQ`B)Y>di1q;?bZk_(C=R*ODvr1{e>Z5`C85rn5KZf)Ed<5kV{ Nsxx*<83q7S{{yC?mz@9r literal 0 HcwPel00001 diff --git a/data/font2.gif b/data/font2.gif new file mode 100755 index 0000000000000000000000000000000000000000..77a0854c10206fcc2d0aca079a714f6ecfcccfd1 GIT binary patch literal 50883 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

3C_^rBLw)c~;$(GkZk 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

R;7{uu$1Tm3^PDDga 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 consider an n^2 square */ +/* '#' polyomino group (follows a '*') */ +/* 1st number = number of squares in a polyomino */ +/* 2nd number = number of polyominoes (incl rot & refl) in a n^2 square */ +/* 3rd number = if it is there, number of polyominoes (incl rot & refl) */ +/* in a n^2 square with diagonal mode */ +/* The polyomino (follows a '#') */ +/* 1st number = numbered polyomino (there for your benefit) */ +/* 2nd number = rotation pointer (usually the next polyomino) */ +/* 3rd number = reflection pointer */ +/* 4th number = number of rows down to start */ +/* 5th number = start number (0, 1, or 2) */ +/* 0=> starter for no turns permitted (no reflections or rotations) */ +/* 1=> starter for allow rotations and no turns permitted */ +/* 2=> starter for reflections, rotations, and no turns permitted */ +/* Next number (if diagonal mode) = start number for diagonal mode */ +/* The proceeding 2 or 3 numbers are repeated for gradual appearance */ +/* Pieces either JUMPIN or appear GRADUALly */ +/* The last group of n^2 numbers is the actual polyomino */ +/* 0=> empty square */ +/* 1..16=> used square */ +/* '~' debug (preceeds a '#') */ +/* 1st number = number of polyominoes to skip */ + +/* PRELUDE */ +/* + Polyomino States(None Rot Refl) Style Diagonal [States(N R R) Style] */ +/* + 1 1 1 1 0 1 1 1 1 0 */ ++ 2 2 1 1 0 1 4 2 2 0 ++ 3 6 2 2 0 1 20 6 5 1 ++ 4 19 7 5 1 0 ++ 5 63 18 12 2 0 ++ 6 216 60 35 2 0 + +/* MAIN */ +/* * X (polyomino fills X^2 square) */ +/* # Polyomino Number_of_Polyominoes_Normal [Number_of_Polyominoes_Diagonal] */ +/* Ref_Num Ptr_Rot Ptr_Refl (Start_Location Start_N [Start_D])J&G Shape_Array */ +/* * 1 */ +/* # 1 1 */ +/* 0 0 0 0 2 2 1 2 2 16 */ +* 2 +# 2 2 4 +0 1 0 1 2 2 1 0 0 0 0 4 1 +1 0 1 0 0 0 1 2 2 0 2 0 8 + +2 3 3 0 0 2 1 0 2 0 16 16 0 +3 2 2 0 0 0 1 0 0 16 0 0 16 +# 3 4 4 +0 1 3 0 2 2 1 2 2 6 1 8 0 +1 2 2 0 0 0 1 0 0 2 0 12 1 +2 3 1 0 0 0 1 0 0 0 2 4 9 +3 0 0 0 0 0 1 0 0 4 3 0 8 +# 4 1 +0 0 0 0 2 1 2 6 3 12 9 +* 3 +# 3 2 16 +0 1 0 1 2 2 1 0 0 0 0 0 4 5 1 0 0 0 +1 0 1 0 0 0 2 2 2 0 2 0 0 10 0 0 8 0 + +2 3 3 0 0 2 2 0 2 16 0 0 0 16 0 0 0 16 +3 2 2 0 0 0 2 0 0 0 0 16 0 16 0 16 0 0 +4 5 8 1 0 2 2 0 0 0 0 0 0 4 1 16 0 0 +5 6 11 0 0 0 2 0 2 0 2 0 0 8 0 0 0 16 +6 7 10 1 0 0 2 0 0 0 0 0 0 0 16 4 1 0 +7 4 9 0 0 0 2 0 0 0 16 0 0 0 2 0 0 8 +8 9 4 1 0 1 2 0 0 0 0 0 4 1 0 0 0 16 +9 10 7 0 0 0 2 0 0 0 0 16 0 2 0 0 8 0 +10 11 6 1 0 0 2 0 0 0 0 0 16 0 0 0 4 1 +11 8 5 0 0 0 2 0 1 0 0 2 0 0 8 0 16 0 +12 13 12 1 0 2 2 0 0 0 0 0 16 0 16 0 16 0 +13 14 15 0 0 0 2 0 2 0 16 0 0 0 16 0 16 0 +14 15 14 1 0 0 2 0 0 0 0 0 0 16 0 16 0 16 +15 12 13 0 0 0 2 0 0 0 0 16 0 16 0 0 0 16 +# 4 16 +0 1 4 1 2 2 0 0 0 0 6 5 1 8 0 0 +1 2 7 0 0 2 0 0 2 0 0 10 0 0 12 1 +2 3 6 1 0 2 0 0 0 0 0 0 2 4 5 9 +3 0 5 0 0 2 2 0 4 3 0 0 10 0 0 8 +4 5 0 1 1 2 0 0 0 0 4 5 3 0 0 8 +5 6 3 0 0 2 1 0 6 1 0 10 0 0 8 0 +6 7 2 1 0 2 0 0 0 0 2 0 0 12 5 1 +7 4 1 0 0 2 0 0 0 2 0 0 10 0 4 9 +8 9 8 1 2 2 0 0 0 0 4 7 1 0 8 0 +9 10 11 0 0 2 2 0 2 0 0 14 1 0 8 0 +10 11 10 1 0 2 0 0 0 0 0 2 0 4 13 1 +11 8 9 0 0 2 0 0 0 2 0 4 11 0 0 8 +12 13 14 1 2 2 0 0 0 0 4 3 0 0 12 1 +13 12 15 0 0 2 2 0 0 2 0 6 9 0 8 0 +14 15 12 1 1 2 0 0 0 0 0 6 1 4 9 0 +15 14 13 0 0 2 1 0 2 0 0 12 3 0 0 8 +# 5 37 +0 1 0 1 2 2 0 0 0 0 6 5 3 8 0 8 +1 2 3 0 0 2 2 0 6 1 0 10 0 0 12 1 +2 3 2 1 0 2 0 0 0 0 2 0 2 12 5 9 +3 0 1 0 0 2 0 0 4 3 0 0 10 0 4 9 +4 5 8 1 2 2 0 0 0 0 6 7 1 12 9 0 +5 6 11 0 0 2 0 0 2 0 0 14 3 0 12 9 +6 7 10 1 0 2 0 0 0 0 0 6 3 4 13 9 +7 4 9 0 0 2 2 0 6 3 0 12 11 0 0 8 +8 9 4 1 1 2 0 0 0 0 4 7 3 0 12 9 +9 10 7 0 0 2 1 0 6 3 0 14 9 0 8 0 +10 11 6 1 0 2 0 0 0 0 6 3 0 12 13 1 +11 8 5 0 0 2 0 0 0 2 0 6 11 0 12 9 +12 13 12 0 2 2 2 4 7 1 0 10 0 0 8 0 +13 14 15 0 0 2 0 2 0 0 14 5 1 8 0 0 +14 15 14 0 0 2 0 0 2 0 0 10 0 4 13 1 +15 12 13 0 0 2 0 0 0 2 4 5 11 0 0 8 +16 17 19 0 2 2 2 6 5 1 10 0 0 8 0 0 +17 18 18 0 0 2 0 2 0 0 10 0 0 12 5 1 +18 19 17 0 0 2 0 0 0 2 0 0 10 4 5 9 +19 16 16 0 0 2 0 4 5 3 0 0 10 0 0 8 +20 21 22 0 2 2 0 2 0 0 12 5 3 0 0 8 +21 20 23 0 0 2 2 0 6 1 0 10 0 4 9 0 +22 23 20 0 1 2 0 0 0 2 6 5 9 8 0 0 +23 22 21 0 0 2 1 4 3 0 0 10 0 0 12 1 +24 25 25 0 2 2 2 4 3 0 0 12 3 0 0 8 +25 26 24 0 0 2 0 0 6 1 6 9 0 8 0 0 +26 27 27 0 0 2 0 2 0 0 12 3 0 0 12 1 +27 24 26 0 0 2 0 0 0 2 0 6 9 4 9 0 +28 29 32 0 2 2 0 0 2 0 6 13 1 8 0 0 +29 30 35 0 0 2 0 0 2 0 4 11 0 0 12 1 +30 31 34 0 0 2 0 0 0 2 4 7 9 0 8 0 +31 28 33 0 0 2 2 4 3 0 0 14 1 0 8 0 +32 33 28 0 1 2 0 0 2 0 4 13 3 0 0 8 +33 34 31 0 0 2 1 0 6 1 4 11 0 0 8 0 +34 35 30 0 0 2 0 2 0 0 12 7 1 0 8 0 +35 32 29 0 0 2 0 0 2 0 0 14 1 4 9 0 +36 36 36 0 2 2 2 0 2 0 4 15 1 0 8 0 +# 6 46 +0 1 4 0 2 2 0 6 5 3 10 0 8 8 0 0 +1 2 7 0 0 2 0 6 1 0 10 0 0 12 5 1 +2 3 6 0 0 2 0 0 0 2 2 0 10 12 5 9 +3 0 5 0 0 2 2 4 5 3 0 0 10 0 4 9 +4 5 0 0 1 2 0 6 5 3 8 0 10 0 0 8 +5 6 3 0 0 2 1 6 5 1 10 0 0 12 1 0 +6 7 2 0 0 2 0 2 0 0 10 0 2 12 5 9 +7 4 1 0 0 2 0 0 4 3 0 0 10 4 5 9 +8 9 12 0 2 2 2 6 7 1 12 11 0 0 8 0 +9 10 15 0 0 2 0 2 0 0 14 7 1 12 9 0 +10 11 14 0 0 2 0 0 2 0 0 14 3 4 13 9 +11 8 13 0 0 2 0 0 6 3 4 13 11 0 0 8 +12 13 8 0 1 2 1 4 7 3 0 14 9 0 8 0 +13 14 11 0 0 2 0 6 3 0 14 13 1 8 0 0 +14 15 10 0 0 2 0 0 2 0 6 11 0 12 13 1 +15 12 9 0 0 2 0 0 0 2 4 7 11 0 12 9 +16 17 20 0 2 2 0 6 3 0 12 13 3 0 0 8 +17 18 23 0 0 2 0 0 6 1 6 11 0 12 9 0 +18 19 22 0 0 2 0 2 0 0 12 7 3 0 12 9 +19 16 21 0 0 2 2 0 6 3 0 14 9 4 9 0 +20 21 16 0 1 2 0 0 6 3 6 13 9 8 0 0 +21 22 19 0 0 2 1 6 3 0 12 11 0 0 12 1 +22 23 18 0 0 2 0 0 0 2 6 7 9 12 9 0 +23 20 17 0 0 2 0 4 3 0 0 14 3 0 12 9 +24 25 28 0 2 2 2 4 7 1 0 10 0 4 9 0 +25 26 31 0 0 2 0 2 0 0 14 5 3 8 0 8 +26 27 30 0 0 2 0 0 6 1 0 10 0 4 13 1 +27 24 29 0 0 2 0 2 0 2 12 5 11 0 0 8 +28 29 24 0 1 2 1 4 7 1 0 10 0 0 12 1 +29 30 27 0 0 2 0 2 0 2 14 5 9 8 0 0 +30 31 26 0 0 2 0 4 3 0 0 10 0 4 13 1 +31 28 25 0 0 2 0 0 0 2 6 5 11 8 0 8 +32 33 32 0 2 2 0 2 0 2 12 7 9 0 8 0 +33 34 35 0 0 2 2 4 3 0 0 14 1 4 9 0 +34 35 34 0 0 2 0 0 2 0 6 13 3 8 0 8 +35 32 33 0 0 2 0 0 6 1 4 11 0 0 12 1 +36 37 39 0 2 2 2 6 7 1 14 9 0 8 0 0 +37 38 38 0 0 2 0 2 0 0 14 3 0 12 13 1 +38 39 37 0 0 2 0 0 0 2 0 6 11 4 13 9 +39 36 36 0 0 2 0 4 7 3 0 12 11 0 0 8 +40 41 43 0 2 2 2 6 3 0 12 15 1 0 8 0 +41 42 42 0 0 2 0 0 2 0 6 15 1 12 9 0 +42 43 41 0 0 2 0 0 2 0 4 15 3 0 12 9 +43 40 40 0 0 2 0 0 6 3 4 15 9 0 8 0 +44 45 44 1 2 2 0 0 0 0 6 7 3 12 13 9 +45 44 45 0 0 2 2 0 6 3 0 14 11 0 12 9 +* 4 +# 4 2 +0 1 0 2 2 2 0 0 0 0 0 0 0 0 0 4 5 5 1 0 0 0 0 +1 0 1 0 0 3 2 0 0 2 0 0 0 10 0 0 0 10 0 0 0 8 0 +# 5 24 +0 1 4 1 2 2 0 0 0 0 0 6 5 5 1 8 0 0 0 0 0 0 0 +1 2 7 0 0 3 0 0 2 0 0 0 10 0 0 0 10 0 0 0 12 1 0 +2 3 6 1 0 2 0 0 0 0 0 0 0 0 2 4 5 5 9 0 0 0 0 +3 0 5 0 0 3 2 0 4 3 0 0 0 10 0 0 0 10 0 0 0 8 0 +4 5 0 1 1 2 0 0 0 0 0 4 5 5 3 0 0 0 8 0 0 0 0 +5 6 3 0 0 3 1 0 6 1 0 0 10 0 0 0 10 0 0 0 8 0 0 +6 7 2 1 0 2 0 0 0 0 0 2 0 0 0 12 5 5 1 0 0 0 0 +7 4 1 0 0 3 0 0 0 2 0 0 0 10 0 0 0 10 0 0 4 9 0 +8 9 12 1 2 2 0 0 0 0 0 4 7 5 1 0 8 0 0 0 0 0 0 +9 10 15 0 0 3 0 0 2 0 0 0 10 0 0 0 14 1 0 0 8 0 0 +10 11 14 1 0 2 0 0 0 0 0 0 0 2 0 4 5 13 1 0 0 0 0 +11 8 13 0 0 3 2 0 0 2 0 0 4 11 0 0 0 10 0 0 0 8 0 +12 13 8 1 1 2 0 0 0 0 0 4 5 7 1 0 0 8 0 0 0 0 0 +13 14 11 0 0 3 1 0 2 0 0 0 14 1 0 0 10 0 0 0 8 0 0 +14 15 10 1 0 2 0 0 0 0 0 0 2 0 0 4 13 5 1 0 0 0 0 +15 12 9 0 0 3 0 0 0 2 0 0 0 10 0 0 4 11 0 0 0 8 0 +16 17 20 1 2 2 0 0 0 0 0 4 5 3 0 0 0 12 1 0 0 0 0 +17 18 23 0 0 3 2 0 0 2 0 0 6 9 0 0 10 0 0 0 8 0 0 +18 19 22 1 0 2 0 0 0 0 0 4 3 0 0 0 12 5 1 0 0 0 0 +19 16 21 0 0 3 0 0 0 2 0 0 0 10 0 0 6 9 0 0 8 0 0 +20 21 16 1 1 2 0 0 0 0 0 0 6 5 1 4 9 0 0 0 0 0 0 +21 22 19 0 0 3 0 0 2 0 0 0 10 0 0 0 12 3 0 0 0 8 0 +22 23 18 1 0 2 0 0 0 0 0 0 0 6 1 4 5 9 0 0 0 0 0 +23 20 17 0 0 3 1 0 2 0 0 0 12 3 0 0 0 10 0 0 0 8 0 +# 6 136 +0 1 4 1 2 3 0 0 0 0 0 6 5 5 1 10 0 0 0 8 0 0 0 +1 2 7 0 0 3 0 0 2 0 0 0 10 0 0 0 10 0 0 0 12 5 1 +2 3 6 1 0 3 0 0 0 0 0 0 0 0 2 0 0 0 10 4 5 5 9 +3 0 5 0 0 3 2 0 4 5 3 0 0 0 10 0 0 0 10 0 0 0 8 +4 5 0 1 1 3 0 0 0 0 0 4 5 5 3 0 0 0 10 0 0 0 8 +5 6 3 0 0 3 1 0 6 5 1 0 10 0 0 0 10 0 0 0 8 0 0 +6 7 2 1 0 3 0 0 0 0 0 2 0 0 0 10 0 0 0 12 5 5 1 +7 4 1 0 0 3 0 0 0 0 2 0 0 0 10 0 0 0 10 0 4 5 9 +8 9 12 1 2 2 0 0 0 0 0 6 7 5 1 12 9 0 0 0 0 0 0 +9 10 15 0 0 3 0 0 2 0 0 0 10 0 0 0 14 3 0 0 12 9 0 +10 11 14 1 0 2 0 0 0 0 0 0 0 6 3 4 5 13 9 0 0 0 0 +11 8 13 0 0 3 2 0 6 3 0 0 12 11 0 0 0 10 0 0 0 8 0 +12 13 8 1 1 2 0 0 0 0 0 4 5 7 3 0 0 12 9 0 0 0 0 +13 14 11 0 0 3 1 0 6 3 0 0 14 9 0 0 10 0 0 0 8 0 0 +14 15 10 1 0 2 0 0 0 0 0 6 3 0 0 12 13 5 1 0 0 0 0 +15 12 9 0 0 3 0 0 0 2 0 0 0 10 0 0 6 11 0 0 12 9 0 +16 17 20 1 2 2 0 0 0 0 0 6 5 7 1 8 0 8 0 0 0 0 0 +17 18 23 0 0 3 0 0 2 0 0 0 14 1 0 0 10 0 0 0 12 1 0 +18 19 22 1 0 2 0 0 0 0 0 0 2 0 2 4 13 5 9 0 0 0 0 +19 16 21 0 0 3 2 0 4 3 0 0 0 10 0 0 4 11 0 0 0 8 0 +20 21 16 1 1 2 0 0 0 0 0 4 7 5 3 0 8 0 8 0 0 0 0 +21 22 19 0 0 3 1 0 6 1 0 0 10 0 0 0 14 1 0 0 8 0 0 +22 23 18 1 0 2 0 0 0 0 0 2 0 2 0 12 5 13 1 0 0 0 0 +23 20 17 0 0 3 0 0 0 2 0 0 4 11 0 0 0 10 0 0 4 9 0 +24 25 28 1 2 3 0 0 0 0 0 4 7 5 1 0 10 0 0 0 8 0 0 +25 26 31 0 0 3 0 0 2 0 0 0 10 0 0 0 14 5 1 0 8 0 0 +26 27 30 1 0 3 0 0 0 0 0 0 0 2 0 0 0 10 0 4 5 13 1 +27 24 29 0 0 3 2 0 0 0 2 0 4 5 11 0 0 0 10 0 0 0 8 +28 29 24 1 1 3 0 0 0 0 0 4 5 7 1 0 0 10 0 0 0 8 0 +29 30 27 0 0 3 1 0 2 0 0 0 14 5 1 0 10 0 0 0 8 0 0 +30 31 26 1 0 3 0 0 0 0 0 0 2 0 0 0 10 0 0 4 13 5 1 +31 28 25 0 0 3 0 0 0 0 2 0 0 0 10 0 4 5 11 0 0 0 8 +32 33 36 1 2 3 0 0 0 0 0 0 2 0 0 6 13 5 1 8 0 0 0 +33 34 39 0 0 3 0 0 0 2 0 0 0 10 0 0 4 11 0 0 0 12 1 +34 35 38 1 0 3 0 0 0 0 0 0 0 0 2 4 5 7 9 0 0 8 0 +35 32 37 0 0 3 2 0 4 3 0 0 0 14 1 0 0 10 0 0 0 8 0 +36 37 32 1 1 3 0 0 0 0 0 0 0 2 0 4 5 13 3 0 0 0 8 +37 38 35 0 0 3 1 0 0 6 1 0 4 11 0 0 0 10 0 0 0 8 0 +38 39 34 1 0 3 0 0 0 0 0 2 0 0 0 12 7 5 1 0 8 0 0 +39 36 33 0 0 3 0 0 0 2 0 0 0 10 0 0 0 14 1 0 4 9 0 +40 41 44 1 2 3 0 0 0 0 0 0 0 2 0 6 5 13 1 8 0 0 0 +41 42 47 0 0 3 0 0 0 2 0 0 4 11 0 0 0 10 0 0 0 12 1 +42 43 46 1 0 3 0 0 0 0 0 0 0 0 2 4 7 5 9 0 8 0 0 +43 40 45 0 0 3 2 0 4 3 0 0 0 10 0 0 0 14 1 0 0 8 0 +44 45 40 1 1 3 0 0 0 0 0 0 2 0 0 4 13 5 3 0 0 0 8 +45 46 43 0 0 3 1 0 0 6 1 0 0 10 0 0 4 11 0 0 0 8 0 +46 47 42 1 0 3 0 0 0 0 0 2 0 0 0 12 5 7 1 0 0 8 0 +47 44 41 0 0 3 0 0 0 2 0 0 0 14 1 0 0 10 0 0 4 9 0 +48 49 52 1 2 2 0 0 0 0 0 6 5 3 0 8 0 12 1 0 0 0 0 +49 50 55 0 0 3 0 0 0 2 0 0 6 9 0 0 10 0 0 0 12 1 0 +50 51 54 1 0 2 0 0 0 0 0 4 3 0 2 0 12 5 9 0 0 0 0 +51 48 53 0 0 3 2 0 4 3 0 0 0 10 0 0 6 9 0 0 8 0 0 +52 53 48 1 1 2 0 0 0 0 0 0 6 5 3 4 9 0 8 0 0 0 0 +53 54 51 0 0 3 1 0 6 1 0 0 10 0 0 0 12 3 0 0 0 8 0 +54 55 50 1 0 2 0 0 0 0 0 2 0 6 1 12 5 9 0 0 0 0 0 +55 52 49 0 0 3 0 0 2 0 0 0 12 3 0 0 0 10 0 0 4 9 0 +56 57 60 1 2 3 0 0 0 0 0 4 5 3 0 0 0 10 0 0 0 12 1 +57 58 63 0 0 3 2 0 0 0 2 0 6 5 9 0 10 0 0 0 8 0 0 +58 59 62 1 0 3 0 0 0 0 0 4 3 0 0 0 10 0 0 0 12 5 1 +59 56 61 0 0 3 0 0 0 0 2 0 0 0 10 0 6 5 9 0 8 0 0 +60 61 56 1 1 3 0 0 0 0 0 0 6 5 1 0 10 0 0 4 9 0 0 +61 62 59 0 0 3 0 0 2 0 0 0 10 0 0 0 12 5 3 0 0 0 8 +62 63 58 1 0 3 0 0 0 0 0 0 0 6 1 0 0 10 0 4 5 9 0 +63 60 57 0 0 3 1 0 2 0 0 0 12 5 3 0 0 0 10 0 0 0 8 +64 65 68 1 2 3 0 0 0 0 0 4 5 3 0 0 0 14 1 0 0 8 0 +65 66 71 0 0 3 2 0 0 2 0 0 6 13 1 0 10 0 0 0 8 0 0 +66 67 70 1 0 3 0 0 0 0 0 0 2 0 0 4 11 0 0 0 12 5 1 +67 64 69 0 0 3 0 0 0 0 2 0 0 0 10 0 4 7 9 0 0 8 0 +68 69 64 1 1 3 0 0 0 0 0 0 6 5 1 4 11 0 0 0 8 0 0 +69 70 67 0 0 3 0 0 2 0 0 0 10 0 0 0 12 7 1 0 0 8 0 +70 71 66 1 0 3 0 0 0 0 0 0 0 2 0 0 0 14 1 4 5 9 0 +71 68 65 0 0 3 1 0 0 2 0 0 4 13 3 0 0 0 10 0 0 0 8 +72 73 76 1 2 3 0 0 0 0 0 4 5 3 0 0 0 12 3 0 0 0 8 +73 74 79 0 0 3 2 0 0 6 1 0 6 9 0 0 10 0 0 0 8 0 0 +74 75 78 1 0 3 0 0 0 0 0 2 0 0 0 12 3 0 0 0 12 5 1 +75 72 77 0 0 3 0 0 0 0 2 0 0 0 10 0 0 6 9 0 4 9 0 +76 77 72 1 1 3 0 0 0 0 0 0 6 5 1 6 9 0 0 8 0 0 0 +77 78 75 0 0 3 0 0 2 0 0 0 10 0 0 0 12 3 0 0 0 12 1 +78 79 74 1 0 3 0 0 0 0 0 0 0 0 2 0 0 6 9 4 5 9 0 +79 76 73 0 0 3 1 0 4 3 0 0 0 12 3 0 0 0 10 0 0 0 8 +80 81 84 1 2 3 0 0 0 0 0 4 3 0 0 0 14 5 1 0 8 0 0 +81 82 87 0 0 3 0 0 0 2 0 0 0 10 0 0 6 13 1 0 8 0 0 +82 83 86 1 0 3 0 0 0 0 0 0 0 2 0 4 5 11 0 0 0 12 1 +83 80 85 0 0 3 2 0 0 0 2 0 4 7 9 0 0 10 0 0 0 8 0 +84 85 80 1 1 3 0 0 0 0 0 0 0 6 1 4 5 11 0 0 0 8 0 +85 86 83 0 0 3 1 0 2 0 0 0 12 7 1 0 0 10 0 0 0 8 0 +86 87 82 1 0 3 0 0 0 0 0 0 2 0 0 0 14 5 1 4 9 0 0 +87 84 81 0 0 3 0 0 0 2 0 0 0 10 0 0 4 13 3 0 0 0 8 +88 89 92 1 2 3 0 0 0 0 0 4 3 0 0 0 12 7 1 0 0 8 0 +89 90 95 0 0 3 0 0 0 2 0 0 0 14 1 0 6 9 0 0 8 0 0 +90 91 94 1 0 3 0 0 0 0 0 0 2 0 0 4 13 3 0 0 0 12 1 +91 88 93 0 0 3 2 0 0 0 2 0 0 6 9 0 4 11 0 0 0 8 0 +92 93 88 1 1 3 0 0 0 0 0 0 0 6 1 4 7 9 0 0 8 0 0 +93 94 91 0 0 3 1 0 2 0 0 0 12 3 0 0 0 14 1 0 0 8 0 +94 95 90 1 0 3 0 0 0 0 0 0 0 2 0 0 6 13 1 4 9 0 0 +95 92 89 0 0 3 0 0 0 2 0 0 4 11 0 0 0 12 3 0 0 0 8 +96 97 100 1 2 3 0 0 0 0 0 4 3 0 0 0 12 5 3 0 0 0 8 +97 98 103 0 0 3 2 0 0 6 1 0 0 10 0 0 6 9 0 0 8 0 0 +98 99 102 1 0 3 0 0 0 0 0 2 0 0 0 12 5 3 0 0 0 12 1 +99 96 101 0 0 3 0 0 0 0 2 0 0 6 9 0 0 10 0 0 4 9 0 +100 101 96 1 1 3 0 0 0 0 0 0 0 6 1 6 5 9 0 8 0 0 0 +101 102 99 0 0 3 0 0 2 0 0 0 12 3 0 0 0 10 0 0 0 12 1 +102 103 98 1 0 3 0 0 0 0 0 0 0 0 2 0 6 5 9 4 9 0 0 +103 100 97 0 0 3 1 0 4 3 0 0 0 10 0 0 0 12 3 0 0 0 8 +104 105 104 1 2 2 0 0 0 0 0 4 7 7 1 0 12 9 0 0 0 0 0 +105 106 107 0 0 3 2 0 2 0 0 0 14 3 0 0 14 9 0 0 8 0 0 +106 107 106 1 0 2 0 0 0 0 0 0 6 3 0 4 13 13 1 0 0 0 0 +107 104 105 0 0 3 0 0 0 2 0 0 6 11 0 0 12 11 0 0 0 8 0 +108 109 108 1 2 2 0 0 0 0 0 6 5 5 3 8 0 0 8 0 0 0 0 +109 110 111 0 0 3 2 0 6 1 0 0 10 0 0 0 10 0 0 0 12 1 0 +110 111 110 1 0 2 0 0 0 0 0 2 0 0 2 12 5 5 9 0 0 0 0 +111 108 109 0 0 3 0 0 4 3 0 0 0 10 0 0 0 10 0 0 4 9 0 +112 113 114 1 2 2 0 0 0 0 0 4 7 3 0 0 12 13 1 0 0 0 0 +113 112 115 0 0 3 2 0 0 2 0 0 6 11 0 0 14 9 0 0 8 0 0 +114 115 112 1 1 2 0 0 0 0 0 0 6 7 1 4 13 9 0 0 0 0 0 +115 114 113 0 0 3 1 0 2 0 0 0 14 3 0 0 12 11 0 0 0 8 0 +116 117 118 1 2 3 0 0 0 0 0 4 3 0 0 0 12 3 0 0 0 12 1 +117 116 119 0 0 3 2 0 0 0 2 0 0 6 9 0 6 9 0 0 8 0 0 +118 119 116 1 1 3 0 0 0 0 0 0 0 6 1 0 6 9 0 4 9 0 0 +119 118 117 0 0 3 1 0 2 0 0 0 12 3 0 0 0 12 3 0 0 0 8 +120 121 122 1 2 3 0 0 0 0 0 2 0 0 0 14 5 5 1 8 0 0 0 +121 122 121 0 0 3 0 0 0 2 0 0 0 10 0 0 0 10 0 0 4 13 1 +122 123 120 1 0 3 0 0 0 0 0 0 0 0 2 4 5 5 11 0 0 0 8 +123 120 123 0 0 3 2 0 4 7 1 0 0 10 0 0 0 10 0 0 0 8 0 +124 125 126 1 2 3 0 0 0 0 0 0 2 0 0 4 15 5 1 0 8 0 0 +125 126 125 0 0 3 0 0 0 2 0 0 0 10 0 0 4 15 1 0 0 8 0 +126 127 124 1 0 3 0 0 0 0 0 0 0 2 0 4 5 15 1 0 0 8 0 +127 124 127 0 0 3 2 0 0 2 0 0 4 15 1 0 0 10 0 0 0 8 0 +128 129 130 1 2 3 0 0 0 0 0 0 2 0 0 4 13 7 1 0 0 8 0 +129 128 131 0 0 3 2 0 0 2 0 0 0 14 1 0 4 11 0 0 0 8 0 +130 131 128 1 1 3 0 0 0 0 0 0 0 2 0 4 7 13 1 0 8 0 0 +131 128 129 0 0 3 1 0 0 2 0 0 4 11 0 0 0 14 1 0 0 8 0 +132 133 134 1 2 3 0 0 0 0 0 2 0 0 0 12 5 5 3 0 0 0 8 +133 132 135 0 0 3 2 0 0 6 1 0 0 10 0 0 0 10 0 0 4 9 0 +134 135 132 1 1 3 0 0 0 0 0 0 0 0 2 6 5 5 9 8 0 0 0 +135 134 133 0 0 3 1 0 4 3 0 0 0 10 0 0 0 10 0 0 0 12 1 +* 5 +# 5 2 +0 1 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 4 5 5 5 1 0 0 0 0 0 0 0 0 0 0 +1 0 1 0 0 4 2 0 0 2 0 0 0 0 10 0 0 0 0 10 0 0 0 0 10 0 0 0 0 8 0 0 +# 6 32 +0 1 4 2 2 3 0 0 0 0 0 0 0 0 0 0 0 6 5 5 5 1 8 0 0 0 0 0 0 0 0 0 +1 2 7 0 0 4 0 0 0 2 0 0 0 0 10 0 0 0 0 10 0 0 0 0 10 0 0 0 0 12 1 0 +2 3 6 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 5 5 5 9 0 0 0 0 0 +3 0 5 0 0 4 2 0 0 4 3 0 0 0 0 10 0 0 0 0 10 0 0 0 0 10 0 0 0 0 8 0 +4 5 0 2 1 3 0 0 0 0 0 0 0 0 0 0 0 4 5 5 5 3 0 0 0 0 8 0 0 0 0 0 +5 6 3 0 0 4 1 0 0 6 1 0 0 0 10 0 0 0 0 10 0 0 0 0 10 0 0 0 0 8 0 0 +6 7 2 2 0 3 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 12 5 5 5 1 0 0 0 0 0 +7 4 1 0 0 4 0 0 0 0 2 0 0 0 0 10 0 0 0 0 10 0 0 0 0 10 0 0 0 4 9 0 +8 9 12 2 2 3 0 0 0 0 0 0 0 0 0 0 0 4 7 5 5 1 0 8 0 0 0 0 0 0 0 0 +9 10 15 0 0 4 0 0 0 2 0 0 0 0 10 0 0 0 0 10 0 0 0 0 14 1 0 0 0 8 0 0 +10 11 14 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 4 5 5 13 1 0 0 0 0 0 +11 8 13 0 0 4 2 0 0 0 2 0 0 0 4 11 0 0 0 0 10 0 0 0 0 10 0 0 0 0 8 0 +12 13 8 2 1 3 0 0 0 0 0 0 0 0 0 0 0 4 5 5 7 1 0 0 0 8 0 0 0 0 0 0 +13 14 11 0 0 4 1 0 0 2 0 0 0 0 14 1 0 0 0 10 0 0 0 0 10 0 0 0 0 8 0 0 +14 15 10 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 4 13 5 5 1 0 0 0 0 0 +15 12 9 0 0 4 0 0 0 0 2 0 0 0 0 10 0 0 0 0 10 0 0 0 4 11 0 0 0 0 8 0 +16 17 20 2 2 3 0 0 0 0 0 0 0 0 0 0 0 4 5 5 3 0 0 0 0 12 1 0 0 0 0 0 +17 18 23 0 0 4 2 0 0 0 2 0 0 0 6 9 0 0 0 10 0 0 0 0 10 0 0 0 0 8 0 0 +18 19 22 2 0 3 0 0 0 0 0 0 0 0 0 0 0 4 3 0 0 0 0 12 5 5 1 0 0 0 0 0 +19 16 21 0 0 4 0 0 0 0 2 0 0 0 0 10 0 0 0 0 10 0 0 0 6 9 0 0 0 8 0 0 +20 21 16 2 1 3 0 0 0 0 0 0 0 0 0 0 0 0 6 5 5 1 4 9 0 0 0 0 0 0 0 0 +21 22 19 0 0 4 0 0 0 2 0 0 0 0 10 0 0 0 0 10 0 0 0 0 12 3 0 0 0 0 8 0 +22 23 18 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 1 4 5 5 9 0 0 0 0 0 0 +23 20 17 0 0 4 1 0 0 2 0 0 0 0 12 3 0 0 0 0 10 0 0 0 0 10 0 0 0 0 8 0 +24 25 24 2 2 3 0 0 0 0 0 0 0 0 0 0 0 4 5 7 5 1 0 0 8 0 0 0 0 0 0 0 +25 26 27 0 0 4 2 0 0 2 0 0 0 0 10 0 0 0 0 14 1 0 0 0 10 0 0 0 0 8 0 0 +26 27 26 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 4 5 13 5 1 0 0 0 0 0 +27 24 25 0 0 4 0 0 0 0 2 0 0 0 0 10 0 0 0 4 11 0 0 0 0 10 0 0 0 0 8 0 +28 29 30 2 2 3 0 0 0 0 0 0 0 0 0 0 0 4 5 3 0 0 0 0 12 5 1 0 0 0 0 0 +29 28 31 0 0 4 2 0 0 0 2 0 0 0 0 10 0 0 0 6 9 0 0 0 10 0 0 0 0 8 0 0 +30 31 28 2 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 1 4 5 9 0 0 0 0 0 0 0 +31 30 29 0 0 4 1 0 0 2 0 0 0 0 10 0 0 0 0 12 3 0 0 0 0 10 0 0 0 0 8 0 +* 6 +# 6 2 +0 1 0 3 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 4 5 5 5 5 1 0 0 0 0 0 0 0 0 0 0 0 0 +1 0 1 0 0 5 2 0 0 0 2 0 0 0 0 0 10 0 0 0 0 0 10 0 0 + 0 0 0 10 0 0 0 0 0 10 0 0 0 0 0 8 0 0 diff --git a/data/topnine.gif b/data/topnine.gif new file mode 100755 index 0000000000000000000000000000000000000000..0248b06853a8d030a3f9cc113a689e699dc5199f GIT binary patch literal 24830 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 X`OlC3^s9gU>~FvO-w*%41_S^*{6a)c literal 0 HcwPel00001 diff --git a/data/wellcuts.gif b/data/wellcuts.gif new file mode 100755 index 0000000000000000000000000000000000000000..955d09f1f8fd5b6e3c81b36f35bf1544f6c49329 GIT binary patch literal 50646 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 N=1_+_WMDu506Tzn0VDtb literal 0 HcwPel00001 diff --git a/data/wellintro.gif b/data/wellintro.gif new file mode 100755 index 0000000000000000000000000000000000000000..088aff7f38320c8990c97c54e80e38bd3b125a31 GIT binary patch literal 101503 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

    j-l|Cp5Ei!KGlCZYT?s=Lm#<2I**b% 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 V_@#0#XMU86b3P|@8bCk*06T9KwV(h1 literal 0 HcwPel00001 diff --git a/data/welltris.scores b/data/welltris.scores new file mode 100644 index 0000000..b1e8bcb --- /dev/null +++ b/data/welltris.scores @@ -0,0 +1,54 @@ +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +1; ;2002-03-07; 0; 0; 0;0;0;0;0 +2;Leo ;2002-03-18; 50; 2; 7;1;1;136;0 +2; ;2002-03-16; 0; 0; 3;1;1;356;0 +2; ;2002-03-14; 0; 0; 6;1;0;55;0 +2; ;2002-03-14; 0; 0; 2;1;1;126;1 +2; ;2002-03-07; 0; 0; 0;0;0;0;0 +2; ;2002-03-07; 0; 0; 0;0;0;0;0 +2; ;2002-03-07; 0; 0; 0;0;0;0;0 +2; ;2002-03-07; 0; 0; 0;0;0;0;0 +2; ;2002-03-07; 0; 0; 0;0;0;0;0 +3;Leo ;2002-03-30; 71; 3; 8;1;1;939;0 +3; ;2002-03-30; 0; 0; 8;1;1;223;0 +3; ;2002-03-30; 0; 0; 9;1;1;121;0 +3; ;2002-03-07; 0; 0; 0;0;0;0;0 +3; ;2002-03-07; 0; 0; 0;0;0;0;0 +3; ;2002-03-07; 0; 0; 0;0;0;0;0 +3; ;2002-03-07; 0; 0; 0;0;0;0;0 +3; ;2002-03-07; 0; 0; 0;0;0;0;0 +3; ;2002-03-07; 0; 0; 0;0;0;0;0 +4;Irina ;2002-03-30; 10; 1;11;1;1;2301;0 +4; ;2002-03-29; 0; 0; 0;1;1;2130;0 +4; ;2002-03-22; 0; 0; 0;1;1;2114;0 +4; ;2002-03-29; 0; 0; 0;1;1;1771;0 +4; ;2002-03-29; 0; 0; 0;1;1;1623;0 +4; ;2002-03-22; 0; 0; 0;1;1;2103;0 +4; ;2002-03-16; 0; 0; 0;1;1;2223;0 +4; ;2002-03-16; 0; 0; 0;1;1;1972;0 +4; ;2002-03-14; 0; 0; 0;1;1;2468;1 +5;Leo ;2002-03-14; 10; 10; 6;1;1;120;1 +5; ;2002-03-14; 0; 0; 5;0;0;36;0 +5; ;2002-03-14; 0; 0; 2;1;1;147;1 +5; ;2002-03-14; 0; 0; 3;0;1;26;1 +5; ;2002-03-14; 0; 0; 3;1;1;29;1 +5; ;2002-03-14; 0; 0; 1;0;1;65;1 +5; ;2002-03-07; 0; 0; 0;0;0;0;0 +5; ;2002-03-07; 0; 0; 0;0;0;0;0 +5; ;2002-03-07; 0; 0; 0;0;0;0;0 +6;leo ;2003-02-20; 10405; 3; 7;0;0;28;1 +6;leo ;2003-02-20; 6787; 2; 6;0;0;37;1 +6;leo ;2003-02-20; 6118; 4; 7;0;1;46;1 +6;leo ;2003-02-27; 4482; 3; 7;0;1;56;1 +6;leo ;2003-02-20; 3149; 2; 7;0;1;26;1 +6;leo ;2003-02-20; 1810; 1; 7;0;1;27;1 +6;leo ;2003-02-20; 1778; 1; 6;0;1;17;1 +6;leo ;2003-02-20; 1565; 1; 7;0;0;19;1 +6;leo ;2003-02-20; 1037; 0;10;0;0;20;1 diff --git a/docs/srcdoc/sources b/docs/srcdoc/sources new file mode 100644 index 0000000..6a7a6ba --- /dev/null +++ b/docs/srcdoc/sources @@ -0,0 +1,4 @@ +../../src/*.cxx +../../src/include/*.h +../../src/x11/*.cxx +../../src/x11/*.h diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..e9de238 --- /dev/null +++ b/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/makedist b/makedist new file mode 100755 index 0000000..5e62c27 --- /dev/null +++ b/makedist @@ -0,0 +1,220 @@ +#! /bin/sh +#Making distribution for XWELLTRIS + +#Using this dir as temporary for package creation +tmpdir="/tmp" +ourname=$0 +instdir=usr + +create_binaries () +{ +#Binary package creation + vers="$1" + mkdir $tmpdir/xwelltris-$vers + echo -n "Copying binaries to "$tmpdir/xwelltris-$vers" directory....." + curdir=`pwd` + cdr=$curdir + cd $tmpdir/xwelltris-$vers + mkdir -p $instdir/bin + mkdir -p $instdir/doc/xwelltris-$vers + mkdir -p $instdir/share/xwelltris + cp -f $cdr/xwelltris $instdir/bin/ + cp -f $cdr/data/polyomino.dat \ + $cdr/data/board2.gif \ + $cdr/data/font2.gif \ + $cdr/data/topnine.gif \ + $cdr/data/wellcuts.gif \ + $cdr/data/wellintro.gif \ + $instdir/share/xwelltris + + cp -f $cdr/README \ + $cdr/README.keys \ + $cdr/AUTHORS \ + $cdr/LICENSE \ + $cdr/Changelog $instdir/doc/xwelltris-$vers + + echo "...OK" + echo -n "Creating TAR Gzipped $2 package...." + tar -cf $curdir/xwelltris-$vers.$2.tar . + echo -n "......." + gzip $curdir/xwelltris-$vers.$2.tar + cd .. + echo "....OK" + cd $curdir + echo -n "Cleaning tmp directory...." + rm -rf $tmpdir/xwelltris-$vers + echo "OK" + echo "Package was created succesfully." + echo "" + echo "Package name: "$curdir/xwelltris-$vers.$2.tar.gz +} + +create_prompted_binaries () +{ + echo -n "Enter platform: " + read platform + create_binaries $1 "$platform" +} + +create_binaries_for_rpm () +{ + vers="$1" + mkdir $tmpdir/xwelltris-$vers + echo -n "Copying all files to "$tmpdir/xwelltris-$vers" directory....." + cp -rf * $tmpdir/xwelltris-$vers + cp -rf ./.xlaunch $tmpdir/xwelltris-$vers + echo "OK" + curdir=`pwd` + cd $tmpdir/xwelltris-$vers + echo -n "Cleaning directories...." + ./makebinclean-rpm + echo "OK" + cd $tmpdir + echo -n "Creating TAR Gzipped package for RPM...." + tar cf $curdir/xwelltris-$vers.elf.tar xwelltris-$vers + echo -n "....." + gzip $curdir/xwelltris-$vers.elf.tar + echo "....OK" + cd $curdir + echo -n "Cleaning tmp directory...." + rm -rf $tmpdir/xwelltris-$vers + echo "OK" + echo "Package was created succesfully." + echo "Package name: "$curdir/xwelltris-$vers.elf.tar.gz +} + +extract_rpm () +{ + vers="$1" + echo "Extracting rpm spec file to 'xwelltris-$vers.spec' from $ourname" + a=`grep -n 'RPM Spec File' $ourname | grep -v grep | tr ':' ' ' \ + | awk '{print $1}'` + b=`wc -l $ourname | awk '{print $1}'` + tail -n `expr $b - $a + 1` $ourname | sed \ + -e "s/^Version:[^\n]*/Version: $vers/" >xwelltris-$vers.spec +} + +echo "-----------------------------------------------------------------" +echo "XWelltris distribution package creator." +echo "Welcome to creation script v2.2.4" +echo "-----------------------------------------------------------------" +echo -n "Enter XWelltris version: " +read vers + +while : +do +echo "" +echo "Choose one of the following:" +echo "" +echo " 1. Create Linux x86 binaries package.......(Linux.x86.tar.gz)." +echo " 2. Create Linux Alpha binaries package.....(Linux.alpha.tar.gz)." +echo " 3. Create Linux PPC binaries package.......(Linux.PPC.tar.gz)." +echo " 4. Create FreeBSD binaries package.........(FreeBSD.tar.gz)." +echo " 5. Create NetBSD x86 binaries package......(NetBSD.x86.tar.gz)." +echo " 6. Create OpenBSD x86 binaries package.....(OpenBSD.x86.tar.gz)." +echo " 7. Create Solaris x86 binaries package.....(Solaris.x86.tar.gz)." +echo " 8. Create Solaris SPARC binaries package...(Solaris.SPARC.tar.gz)." +echo " 9. Create AIX binaries package.............(AIX.tar.gz)." +echo " 10. Create HP-UX binaries package...........(HP-UX.tar.gz)." +echo " 11. Create DUNIX (OSF1) binaries package....(DUnix.tar.gz)." +echo " 12. Create IRIX binaries package............(IRIX.tar.gz)." +echo " 13. Create QNX binaries package.............(QNX.tar.gz)." +echo " 14. Create prompted binaries package." +echo "" +echo " 19. Extract RPM spec file...................(xwelltris-$vers.spec)." +echo "" +echo " 0. Exit" +echo "" +echo -n "Your choice: " +read choice + +case "$choice" in + 1) create_binaries "$vers" "Linux.x86";; + 2) create_binaries "$vers" "Linux.alpha";; + 3) create_binaries "$vers" "Linux.PPC";; + 4) create_binaries "$vers" "FreeBSD";; + 5) create_binaries "$vers" "NetBSD.x86";; + 6) create_binaries "$vers" "OpenBSD.x86";; + 7) create_binaries "$vers" "Solaris.x86";; + 8) create_binaries "$vers" "Solaris.SPARC";; + 9) create_binaries "$vers" "AIX";; + 10) create_binaries "$vers" "HP-UX";; + 11) create_binaries "$vers" "DUnix";; + 12) create_binaries "$vers" "IRIX";; + 13) create_binaries "$vers" "QNX";; + 14) create_prompted_binaries "$vers";; + 19) extract_rpm "$vers";; + 0) exit 0;; +esac +done +echo "-----------------------------------------------------------------" +exit +#----------------------Cut from this line------------------------------- +#---------------RPM Spec File for XWelltris-------------------- + +%define prefix /usr + +Summary: XWelltris - a tetris like popular game for X Window +Name: xwelltris +Version: +Release: 1 +Copyright: GPL +Packager: Leonid Khramov +Group: X11/Applications +Source0: %{name}-%{version}.src.tar.gz +#Icon: +BuildRoot: /tmp/%{name}-%{version}-root + +%description +This is a small tetris like game for X Window. +Imaging that you are looking into the glass from the top. +You see four walls and the bottom. The flat 2d figures falling +down from the walls one by one. You can move these figures from one wall to +another or rotate them... + +%prep +%setup + +%build +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS=-s ./configure \ + --prefix=%{prefix} --with-x +make + +%install +rm -rf $RPM_BUILD_ROOT + +install -d "$RPM_BUILD_ROOT"/%{prefix}/{bin,share/xwelltris} + +install xwelltris "$RPM_BUILD_ROOT"/%{prefix}/bin + +mkdir -p "$RPM_BUILD_ROOT"/etc/X11/wmconfig +cat > "$RPM_BUILD_ROOT"/etc/X11/wmconfig/xwelltris < $RPM_BUILD_DIR/file.list-%{name}-%{version} +echo "%attr(-,root,root) %doc README README.keys AUTHORS LICENSE Changelog" \ + >> $RPM_BUILD_DIR/file.list-%{name}-%{version} + +%clean +rm -rf $RPM_BUILD_ROOT +rm -f ../file.list-%{name}-%{version} + +%files -f ../file.list-%{name}-%{version} + + + + diff --git a/src/Make.common.in b/src/Make.common.in new file mode 100644 index 0000000..fff6c5c --- /dev/null +++ b/src/Make.common.in @@ -0,0 +1,63 @@ +# ./Make.common.in -*- Makefile -*- +# Makefile common definisions for XNC Project +# + +srcdir = @srcdir@ +VPATH = @srcdir@ + +SHELL = /bin/sh + +# Installation target directories & other installation stuff +prefix = @prefix@ +exec_prefix = @exec_prefix@ +binprefix = +manprefix = +bindir = @bindir@ +mandir = @mandir@/man1 +manext = 1 + +# Tools & program stuff +CC = @CC@ +CXX = @CXX@ +CPP = @CPP@ +RM = @RM@ +RMF = @RM@ -f +CP = @CP@ +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL@ -s -m 755 +INSTALL_DATA = @INSTALL@ -m 644 +INSTALL_SHARE_DATA = @INSTALL@ -m 666 +INS=@INSTALL@ -m 755 +INSM=@INSTALL@ -m 644 +INSD=@INSTALL@ -d -m 755 +INSOWN=@INSTALL@ +INSTDIR=@prefix@/bin +INSTLIB=@prefix@/share/xwelltris +INSTMAN=@prefix@/man +DEB=@DEB@ +STRIPPING= +XINC=@X_CFLAGS@ +XLIBS=@X_PRE_LIBS@ @X_LIBS@ @X_EXTRA_LIBS@ -lX11 -lXext + +CFLAGS = @CFLAGS@ $(PLUGINFLAGS) +CPPFLAGS = @CPPFLAGS@ #-DHAVE_LIBXPM +LDFLAGS = @LDFLAGS@ +SHAREFLAGS = @SHAREFLAGS@ +LD_SHAREFLAGS= @LD_SHAREFLAGS@ +PLUGINS = @PLUGINS@ +DEFS = @DEFS@ +LIBS = @LIBS@ +INCLUDES=-DHAVE_CONFIG_H -I. -I./.. -I./image -I./include -I../include + +# extra libraries needed by X on some systems, X library location +XLIB = @X_LIBS@ @X_PRE_LIBS@ -lX11 @X_EXTRA_LIBS@ #-L/usr/local/lib -lXpm + + +.SUFFIXES: .cxx .c + +.cxx.o: + $(CXX) -c $(CXXINCLUDES) $(INCLUDES) $(CXXOPT) $< -o $@ + +# End of Make.common + + diff --git a/src/commonfuncs.cxx b/src/commonfuncs.cxx new file mode 100644 index 0000000..3cfd66b --- /dev/null +++ b/src/commonfuncs.cxx @@ -0,0 +1,82 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: commonfuncs.cxx,v 1.3 2003/02/27 08:27:51 leo Exp $ + +#include "commonfuncs.h" + + +//=========================================================================== +/// global find_full_path_for_file(char* fname, char* ret_full_pathname, FMode mode) +/// find file in global and local dirs and return full pathname +/// tags common_funcs +bool find_full_path_for_file(char* name, char* ret_full_pathname, FMode mode) +{ +#ifndef WIN32 + int fd; + char *home=getenv("HOME"); + mode_t fmode=O_RDONLY; + + switch(mode) + { + case ReadOnly: + fmode=O_RDONLY; + break; + case ReadWrite: + fmode=O_RDWR; + break; + } + + do + { + sprintf(ret_full_pathname,"%s/%s",GLOBAL_SEARCH,name); //First check in GLOBAL_SEARCH dir + fd=open(ret_full_pathname,fmode); + if(fd>0) + break; + + sprintf(ret_full_pathname,"%s/%s/%s",home,LOCAL_SEARCH,name); //Then in LOCAL one + fd=open(ret_full_pathname,fmode); + if(fd>0) + break; + + sprintf(ret_full_pathname,"./%s",name); //Then in current dir + fd=open(ret_full_pathname,fmode); + if(fd>0) + break; + + sprintf(ret_full_pathname,"./data/%s",name); //And finally in ./data + fd=open(ret_full_pathname,fmode); + if(fd>0) + break; + + fprintf(stderr,"ERROR: Can't find file %s in:\n\t./\n\t./data\n\t%s/%s\n\t%s\n", + name,home,LOCAL_SEARCH,GLOBAL_SEARCH); + return false; + } while(0); + + close(fd); + return true; +#else + FILE *fp; + sprintf(ret_full_pathname,"data\\%s",name); //And finally in ./data + fp=fopen(ret_full_pathname, "r"); + if(fp) + { + fclose(fp); + return true; + } + return false; +#endif +} diff --git a/src/geometry.cxx b/src/geometry.cxx new file mode 100644 index 0000000..8f1f124 --- /dev/null +++ b/src/geometry.cxx @@ -0,0 +1,192 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: geometry.cxx,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ + +#include "globals.h" +#include "geometry.h" + + +//imNone means simple clear this area with background image :) + +Geo top_key_exit[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 734, 550, 57, 40 }, //Normal view + { imCuts, 0, 365, 734, 550, 57, 39 }, //Highlighted + { imNone, 0, 0, 734, 550, 57, 40 }, //Pressed +}; + +Geo intro_key_exit[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 734, 550, 57, 40 }, //Normal view + { imCuts, 0, 365, 734, 550, 57, 40 }, //Highlighted + { imNone, 0, 0, 734, 550, 57, 40 }, //Pressed +}; + +Geo intro_key_new_game[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 332, 500, 130, 40 }, //Normal view + { imCuts, 0, 215, 332, 500, 130, 40 }, //Highlighted + { imNone, 0, 0, 332, 500, 130, 40 }, //Pressed +}; + +Geo intro_key_top_nine[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 333, 544, 123, 41 }, //Normal view + { imCuts, 0, 255, 333, 544, 123, 41 }, //Highlighted + { imNone, 0, 0, 333, 544, 123, 41 }, //Pressed +}; + +Geo intro_key_plus[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 720, 400, 25, 25 }, //Normal view + { imNone, 0, 0, 720, 400, 25, 25 }, //Highlighted + { imNone, 0, 0, 720, 400, 25, 25 }, //Pressed +}; + +Geo intro_key_minus[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 640, 405, 25, 17 }, //Normal view + { imNone, 0, 0, 640, 405, 25, 17 }, //Highlighted + { imNone, 0, 0, 640, 405, 25, 17 }, //Pressed +}; + +Geo game_elements[]= { + // image srcx srcy dstx dsty len hei + { imCuts, 160, 0, 130, 120, 296, 215 }, //Pause image + { imCuts, 120, 0, 603, 469, 30, 26 }, //Rotation image + { imCuts, 120, 38, 608, 509, 26, 16 }, //Next piece image + { imCuts, 120, 76, 610, 539, 22, 24 }, //Mixed image +}; + +Geo top_nine_elements[]= { + // image srcx srcy dstx dsty len hei + { imCuts, 90, 365, 704, 119, 25, 26 }, //Rotation image + { imCuts, 115, 365, 729, 119, 33, 26 }, //Next piece image + { imCuts, 148, 365, 762, 119, 18, 26 }, //Mixed image +}; + +Geo intro_sw_rotation[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 640, 225, 93, 34 }, //Normal view + { imCuts, 0, 298, 640, 225, 93, 34 }, //Highlighted + { imCuts, 120, 296, 739, 228, 25, 25 }, //Pressed +}; + +Geo intro_sw_next_piece[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 616, 268, 116, 35 }, //Normal view + { imCuts, 0, 330, 616, 268, 116, 35 }, //Highlighted + { imCuts, 120, 330, 739, 270, 25, 25 }, //Pressed +}; + +Geo intro_sw_mixed[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 65, 379, 71, 35 }, //Normal view + { imCuts, 0, 180, 65, 379, 71, 35 }, //Highlighted + { imCuts, 90, 180, 35, 385, 25, 25 }, //Pressed +}; + +Geo intro_sw_square0[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 65, 115, 75, 38 }, //Normal view + { imCuts, 0, 0, 65, 115, 75, 38 }, //Highlighted + { imCuts, 90, 0, 35, 122, 25, 25 }, //Pressed +}; + +Geo intro_sw_square1[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 65, 158, 77, 38 }, //Normal view + { imCuts, 0, 38, 65, 158, 77, 38 }, //Highlighted + { imCuts, 90, 38, 35, 167, 25, 25 }, //Pressed +}; + +Geo intro_sw_square2[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 65, 205, 70, 34 }, //Normal view + { imCuts, 0, 76, 65, 205, 70, 34 }, //Highlighted + { imCuts, 90, 76, 35, 209, 25, 25 }, //Pressed +}; + +Geo intro_sw_square3[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 65, 248, 89, 35 }, //Normal view + { imCuts, 0, 109, 65, 248, 89, 35 }, //Highlighted + { imCuts, 90, 109, 35, 254, 25, 25 }, //Pressed +}; + +Geo intro_sw_square4[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 65, 292, 78, 35 }, //Normal view + { imCuts, 0, 145, 65, 292, 78, 35 }, //Highlighted + { imCuts, 90, 145, 35, 296, 25, 25 }, //Pressed +}; + +Geo intro_sw_square5[]= { + // image srcx srcy dstx dsty len hei + { imNone, 0, 0, 65, 392, 78, 35 }, //Normal view + { imCuts, 0, 145, 65, 392, 78, 35 }, //Highlighted + { imCuts, 90, 145, 35, 396, 25, 25 }, //Pressed +}; + +Geo intro_inp_player_name[]= { + // image srcx srcy dstx dsty len hei + { imCuts, 170, 215, 211, 205, 357, 154 }, //full view + { imCuts, 0, 0, 240, 297, 299, 30 }, //input area + { imCuts, 90, 145, 35, 296, 25, 25 }, //Pressed +}; + + + +// Array of all objects geometry +GeoObject all_objects[]= { + { "top_key_exit" , top_key_exit }, + { "intro_key_exit" , intro_key_exit }, + { "intro_key_new_game", intro_key_new_game }, + { "intro_key_top_nine", intro_key_top_nine }, + { "intro_key_minus" , intro_key_minus }, + { "intro_key_plus" , intro_key_plus }, + { "the_game" , game_elements }, + { "top_nine_elements" , top_nine_elements }, + { "intro_sw_rotation" , intro_sw_rotation }, + { "intro_sw_next" , intro_sw_next_piece }, + { "intro_sw_mixed" , intro_sw_mixed }, + { "intro_sw_square0" , intro_sw_square0 }, + { "intro_sw_square1" , intro_sw_square1 }, + { "intro_sw_square2" , intro_sw_square2 }, + { "intro_sw_square3" , intro_sw_square3 }, + { "intro_sw_square4" , intro_sw_square4 }, + { "intro_sw_square5" , intro_sw_square5 }, + { "intro_inp_player" , intro_inp_player_name }, + { "empty", 0} +}; + + + +//=========================================================================== +/// global get_geo_by_name(char* fname) +/// find geometry structures for object by given name +/// tags geometry +Geo* get_geo_by_name(char* name) +{ + int i=0; + while(all_objects[i].geo) + { + if(!strcmp(all_objects[i].name,name)) + return all_objects[i].geo; + i++; + } + return 0; +} diff --git a/src/image/accel.c b/src/image/accel.c new file mode 100644 index 0000000..77b0224 --- /dev/null +++ b/src/image/accel.c @@ -0,0 +1,101 @@ +/**************************************************************************** +* Copyright (C) 1996 by Leo Khramov +* email: old@sunct2.jinr.dubna.su +* +* 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. + ****************************************************************************/ +#include "accel.h" +#include + +char *imd; +void (*im_coding)(unsigned int,unsigned int,unsigned int,char**); +void im_truetruecoding(unsigned int ir,unsigned int ig,unsigned int ib,char **imdata) +{ + int j; + imd=*imdata; + ir>>=red_rsh; + ir<<=red_lsh; + ig>>=green_rsh; + ig<<=green_lsh; + ib>>=blue_rsh; + ib<<=blue_lsh; + ir=ir | ig | ib; + imd+=bdep; + for(j=0;j>=8; + } + + (*imdata)+=bdep; +} + +void im_truenocoding(unsigned int ir,unsigned int ig,unsigned int ib,char **imdata) +{ + *((*imdata)++)=ir&0xff; + *((*imdata)++)=ig&0xff; + *((*imdata)++)=ib&0xff; +} + +char *im_alloc_true(int l,int h) +{ + if (bdep == 1) { + l *= 3; + } else { + l *= bdep; + if (l % b_pad) + l += b_pad - l % b_pad; + } + return (char*) malloc(l*h); +} + +void im_setzero(char* s,int len) +{ + for ( ; len>0; len--) + *s++ = 0; +} + +void im_memcopy(char *src, char* dest, int len) +{ + + if (src==dest || len<=0) + return; /* nothin' to do */ + + if (srcdest) + { /* do backward copy */ + src = src + len - 1; + dest = dest + len - 1; + for ( ; len>0; len--, src--, dest--) + *dest = *src; + } + + else + { + for ( ; len>0; len--, src++, dest++) + *dest = *src; + } +} + + +extern int vclass; + +unsigned int im_get_linew_true(unsigned int w) +{ + unsigned line_w; + if(vclass==TrueColor) + { + line_w = w * bdep; + if (line_w % b_pad) + line_w += b_pad - line_w % b_pad; + } else + line_w=w*3; //24 bit non-converted images in PseudoColor before convertion. + return line_w; +} diff --git a/src/image/accel.h b/src/image/accel.h new file mode 100644 index 0000000..c21c75c --- /dev/null +++ b/src/image/accel.h @@ -0,0 +1,23 @@ +#ifndef ACCEL_H +#define ACCEL_H +#include +extern int depth,bdep,b_pad,translation; +extern unsigned int rmask,gmask,bmask,rsh,bsh,gsh; +extern unsigned int red_rsh,green_rsh,blue_rsh,red_lsh,green_lsh,blue_lsh; +#ifdef __cplusplus +extern "C" char *im_alloc_true(int l,int h); +extern "C" void im_memcopy(char*,char*,int); +extern "C" void im_setzero(char*,int); +extern "C" unsigned int im_get_linew_true(unsigned int w); +#else +extern char *im_alloc_true(int l,int h); +extern void im_memcopy(char*,char*,int); +extern void im_setzero(char*,int); +#endif +extern void (*im_coding)(unsigned int,unsigned int,unsigned int,char**); +extern void im_truetruecoding(unsigned int ir,unsigned int ig,unsigned int ib,char **imdata); +extern void im_truenocoding(unsigned int ir,unsigned int ig,unsigned int ib,char **imdata); + +#endif +/* ------------ End of file -------------- */ + diff --git a/src/image/convert.cxx b/src/image/convert.cxx new file mode 100644 index 0000000..96f7201 --- /dev/null +++ b/src/image/convert.cxx @@ -0,0 +1,902 @@ + +#define JPEG_IMAGES +#include "picinfo.h" +#include "accel.h" + + +static int im_check_for_small_amount_of_colors(PICINFO& pic, int max_colors, + byte* pic8_buf) +{ + unsigned long colors[256],color; + int i, num_color, j; + byte *p, *pix; + + if (max_colors>256) + max_colors = 256; + + num_color = 0; + + for (i=pic.w*pic.h,p=pic.pic; i>0; i--) + { + //construct RGB 24 bit color + color = (((u_long) *p++) << 16); + color += (((u_long) *p++) << 8); + color += *p++; + + for(j=0;j goto next pixel + continue; + + if (num_color >= max_colors) + return 0; + + colors[num_color++]=color; + } + + + //Now convert pixmap with our pallete + for (i=pic.w*pic.h,p=pic.pic,pix=pic8_buf; i>0; i--,pix++) + { + color = (((u_long) *p++) << 16); + color += (((u_long) *p++) << 8); + color += *p++; + + for(j=0;j>16; + pic.pal[i*3+1] = (colors[i]>>8) & 0xff; + pic.pal[i*3+2] = colors[i] & 0xff; + } + + pic.pic=pic8_buf; + + return 1; +} + +static int slow_quant(byte* pic24, int w, int h, byte* pic8, + byte* rm,byte *gm,byte *bm, int max_colors); + +static int im_do_convertion_to_num_colors(PICINFO& pic, int max_colors, + byte* pic8_buf) +{ + byte *redmap,*greenmap,*bluemap; + int i; + + redmap= new byte[256]; + greenmap= new byte[256]; + bluemap= new byte[256]; + + slow_quant(pic.pic,pic.w,pic.h,pic8_buf, + redmap, greenmap, bluemap, max_colors); + + for(i=0;i 0) + { + /* get pixel value and index into the histogram */ + histp = & histogram[pic24[0] >> C0_SHIFT] + [pic24[1] >> C1_SHIFT] + [pic24[2] >> C2_SHIFT]; + /* increment, check for overflow and undo increment if so. */ + if (++(*histp) <= 0) + (*histp)--; + pic24 += 3; + } +} + + +static boxptr find_biggest_color_pop (boxptr boxlist, int numboxes) +{ + register boxptr boxp; + register int i; + register long maxc = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->colorcount > maxc && boxp->volume > 0) { + which = boxp; + maxc = boxp->colorcount; + } + } + return which; +} + + +static boxptr find_biggest_volume (boxptr boxlist, int numboxes) +{ + register boxptr boxp; + register int i; + register INT32 maxv = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->volume > maxv) { + which = boxp; + maxv = boxp->volume; + } + } + return which; +} + + +static void update_box (boxptr boxp) +{ + hist2d * histogram = sl_histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + INT32 dist0,dist1,dist2; + long ccount; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + if (c0max > c0min) + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0min = c0min = c0; + goto have_c0min; + } + } + have_c0min: + if (c0max > c0min) + for (c0 = c0max; c0 >= c0min; c0--) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0max = c0max = c0; + goto have_c0max; + } + } + have_c0max: + if (c1max > c1min) + for (c1 = c1min; c1 <= c1max; c1++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1min = c1min = c1; + goto have_c1min; + } + } + have_c1min: + if (c1max > c1min) + for (c1 = c1max; c1 >= c1min; c1--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1max = c1max = c1; + goto have_c1max; + } + } + have_c1max: + if (c2max > c2min) + for (c2 = c2min; c2 <= c2max; c2++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2min = c2min = c2; + goto have_c2min; + } + } + have_c2min: + if (c2max > c2min) + for (c2 = c2max; c2 >= c2min; c2--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2max = c2max = c2; + goto have_c2max; + } + } + have_c2max: + + dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE; + dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; + dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; + boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; + + ccount = 0; + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++, histp++) + if (*histp != 0) { + ccount++; + } + } + boxp->colorcount = ccount; +} + + +static int median_cut (boxptr boxlist, int numboxes, int desired_colors) +{ + int n,lb; + int c0,c1,c2,cmax; + register boxptr b1,b2; + + while (numboxes < desired_colors) { + /* Select box to split. + * Current algorithm: by population for first half, then by volume. + */ + if (numboxes*2 <= desired_colors) { + b1 = find_biggest_color_pop(boxlist, numboxes); + } else { + b1 = find_biggest_volume(boxlist, numboxes); + } + if (b1 == NULL) /* no splittable boxes left! */ + break; + b2 = &boxlist[numboxes]; /* where new box will go */ + /* Copy the color bounds to the new box. */ + b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max; + b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min; + /* Choose which axis to split the box on. + */ + c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE; + c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE; + c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE; + cmax = c1; n = 1; + if (c0 > cmax) { cmax = c0; n = 0; } + if (c2 > cmax) { n = 2; } + switch (n) { + case 0: + lb = (b1->c0max + b1->c0min) / 2; + b1->c0max = lb; + b2->c0min = lb+1; + break; + case 1: + lb = (b1->c1max + b1->c1min) / 2; + b1->c1max = lb; + b2->c1min = lb+1; + break; + case 2: + lb = (b1->c2max + b1->c2min) / 2; + b1->c2max = lb; + b2->c2min = lb+1; + break; + } + /* Update stats for boxes */ + update_box(b1); + update_box(b2); + numboxes++; + } + return numboxes; +} + + +static void compute_color (boxptr boxp,int icolor) +{ + /* Current algorithm: mean weighted by pixels (not colors) */ + /* Note it is important to get the rounding correct! */ + hist2d * histogram = sl_histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + long count; + long total = 0; + long c0total = 0; + long c1total = 0; + long c2total = 0; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) { + if ((count = *histp++) != 0) { + total += count; + c0total += ((c0 << C0_SHIFT) + ((1<>1)) * count; + c1total += ((c1 << C1_SHIFT) + ((1<>1)) * count; + c2total += ((c2 << C2_SHIFT) + ((1<>1)) * count; + } + } + } + + sl_colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); + sl_colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); + sl_colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); +} + + +static void slow_select_colors (int descolors) +/* Master routine for color selection */ +{ + box boxlist[MAXNUMCOLORS]; + int numboxes; + int i; + + /* Initialize one box containing whole space */ + numboxes = 1; + boxlist[0].c0min = 0; + boxlist[0].c0max = 255 >> C0_SHIFT; + boxlist[0].c1min = 0; + boxlist[0].c1max = 255 >> C1_SHIFT; + boxlist[0].c2min = 0; + boxlist[0].c2max = 255 >> C2_SHIFT; + /* Shrink it to actually-used volume and set its statistics */ + update_box(& boxlist[0]); + /* Perform median-cut to produce final box list */ + numboxes = median_cut(boxlist, numboxes, descolors); + /* Compute the representative color for each box, fill colormap */ + for (i = 0; i < numboxes; i++) + compute_color(& boxlist[i], i); + sl_num_colors = numboxes; +} + + +/* log2(histogram cells in update box) for each axis; this can be adjusted */ +#define BOX_C0_LOG (HIST_C0_BITS-3) +#define BOX_C1_LOG (HIST_C1_BITS-3) +#define BOX_C2_LOG (HIST_C2_BITS-3) + +#define BOX_C0_ELEMS (1<> 1; + maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); + centerc1 = (minc1 + maxc1) >> 1; + maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); + centerc2 = (minc2 + maxc2) >> 1; + + minmaxdist = 0x7FFFFFFFL; + + for (i = 0; i < numcolors; i++) { + /* We compute the squared-c0-distance term, then add in the other two. */ + x = sl_colormap[0][i]; + if (x < minc0) { + tdist = (x - minc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else if (x > maxc0) { + tdist = (x - maxc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + min_dist = 0; + if (x <= centerc0) { + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } + } + + x = sl_colormap[1][i]; + if (x < minc1) { + tdist = (x - minc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc1) { + tdist = (x - maxc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc1) { + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } + } + + x = sl_colormap[2][i]; + if (x < minc2) { + tdist = (x - minc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc2) { + tdist = (x - maxc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc2) { + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } + } + + mindist[i] = min_dist; /* save away the results */ + if (max_dist < minmaxdist) + minmaxdist = max_dist; + } + + ncolors = 0; + for (i = 0; i < numcolors; i++) { + if (mindist[i] <= minmaxdist) + colorlist[ncolors++] = (JSAMPLE) i; + } + return ncolors; +} + + +static void find_best_colors (int minc0,int minc1,int minc2,int numcolors, + JSAMPLE colorlist[], JSAMPLE bestcolor[]) +{ + int ic0, ic1, ic2; + int i, icolor; + register INT32 * bptr; /* pointer into bestdist[] array */ + JSAMPLE * cptr; /* pointer into bestcolor[] array */ + INT32 dist0, dist1; /* initial distance values */ + register INT32 dist2; /* current distance in inner loop */ + INT32 xx0, xx1; /* distance increments */ + register INT32 xx2; + INT32 inc0, inc1, inc2; /* initial values for increments */ + /* This array holds the distance to the nearest-so-far color for each cell */ + INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Initialize best-distance for each cell of the update box */ + bptr = bestdist; + for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) + *bptr++ = 0x7FFFFFFFL; + + /* Nominal steps between cell centers ("x" in Thomas article) */ +#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) +#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) +#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) + + for (i = 0; i < numcolors; i++) { + icolor = colorlist[i]; + /* Compute (square of) distance from minc0/c1/c2 to this color */ + inc0 = (minc0 - (int) sl_colormap[0][icolor]) * C0_SCALE; + dist0 = inc0*inc0; + inc1 = (minc1 - (int) sl_colormap[1][icolor]) * C1_SCALE; + dist0 += inc1*inc1; + inc2 = (minc2 - (int) sl_colormap[2][icolor]) * C2_SCALE; + dist0 += inc2*inc2; + /* Form the initial difference increments */ + inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; + inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; + inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; + /* Now loop over all cells in box, updating distance per Thomas method */ + bptr = bestdist; + cptr = bestcolor; + xx0 = inc0; + for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) { + dist1 = dist0; + xx1 = inc1; + for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) { + dist2 = dist1; + xx2 = inc2; + for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) { + if (dist2 < *bptr) { + *bptr = dist2; + *cptr = (JSAMPLE) icolor; + } + dist2 += xx2; + xx2 += 2 * STEP_C2 * STEP_C2; + bptr++; + cptr++; + } + dist1 += xx1; + xx1 += 2 * STEP_C1 * STEP_C1; + } + dist0 += xx0; + xx0 += 2 * STEP_C0 * STEP_C0; + } + } +} + + +static void fill_inverse_cmap (int c0, int c1, int c2) +{ + hist2d * histogram = sl_histogram; + int minc0, minc1, minc2; /* lower left corner of update box */ + int ic0, ic1, ic2; + register JSAMPLE * cptr; /* pointer into bestcolor[] array */ + register histptr cachep; /* pointer into main cache array */ + /* This array lists the candidate colormap indexes. */ + JSAMPLE colorlist[MAXNUMCOLORS]; + int numcolors; /* number of candidate colors */ + /* This array holds the actually closest colormap index for each cell. */ + JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Convert cell coordinates to update box ID */ + c0 >>= BOX_C0_LOG; + c1 >>= BOX_C1_LOG; + c2 >>= BOX_C2_LOG; + + minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); + minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); + minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); + + numcolors = find_nearby_colors(minc0, minc1, minc2, colorlist); + + /* Determine the actually nearest colors. */ + find_best_colors(minc0, minc1, minc2, numcolors, colorlist, bestcolor); + + /* Save the best color numbers (plus 1) in the main cache array */ + c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ + c1 <<= BOX_C1_LOG; + c2 <<= BOX_C2_LOG; + cptr = bestcolor; + for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) { + for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { + cachep = & histogram[c0+ic0][c1+ic1][c2]; + for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { + *cachep++ = (histcell) (*cptr++ + 1); + } + } + } +} + +static void slow_map_pixels (byte *pic24,int width,int height, byte* pic8) +{ + register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */ + LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */ + LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */ + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + JSAMPROW inptr; /* => current input pixel */ + JSAMPROW outptr; /* => current output pixel */ + histptr cachep; + int dir; /* +1 or -1 depending on direction */ + int dir3; /* 3*dir, for advancing inptr & errorptr */ + int row, col; + int *error_limit = sl_error_limiter; + JSAMPROW colormap0 = sl_colormap[0]; + JSAMPROW colormap1 = sl_colormap[1]; + JSAMPROW colormap2 = sl_colormap[2]; + hist2d * histogram = sl_histogram; + + for (row = 0; row < height; row++) { + +/* if ((row&0x3f) == 0) WaitCursor(); + ProgressMeter(0, height-1, row, "Dither");*/ + + inptr = & pic24[row * width * 3]; + outptr = & pic8[row * width]; + if (sl_on_odd_row) { + /* work right to left in this row */ + inptr += (width-1) * 3; /* so point to rightmost pixel */ + outptr += width-1; + dir = -1; + dir3 = -3; + errorptr = sl_fserrors + (width+1)*3; /* => entry after last column */ + sl_on_odd_row = FALSE; /* flip for next time */ + } else { + /* work left to right in this row */ + dir = 1; + dir3 = 3; + errorptr = sl_fserrors; /* => entry before first real column */ + sl_on_odd_row = TRUE; /* flip for next time */ + } + /* Preset error values: no error propagated to first pixel from left */ + cur0 = cur1 = cur2 = 0; + /* and no error propagated to row below yet */ + belowerr0 = belowerr1 = belowerr2 = 0; + bpreverr0 = bpreverr1 = bpreverr2 = 0; + + for (col = width; col > 0; col--) + { + cur0 = (cur0 + errorptr[dir3+0] + 8) >> 4; + cur1 = (cur1 + errorptr[dir3+1] + 8) >> 4; + cur2 = (cur2 + errorptr[dir3+2] + 8) >> 4; + cur0 = error_limit[cur0]; + cur1 = error_limit[cur1]; + cur2 = error_limit[cur2]; + cur0 += inptr[0]; + cur1 += inptr[1]; + cur2 += inptr[2]; + RANGE(cur0, 0, 255); + RANGE(cur1, 0, 255); + RANGE(cur2, 0, 255); + /* Index into the cache with adjusted pixel value */ + cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT]; + /* If we have not seen this color before, find nearest colormap */ + /* entry and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cur0>>C0_SHIFT, cur1>>C1_SHIFT, cur2>>C2_SHIFT); + /* Now emit the colormap index for this cell */ + { register int pixcode = *cachep - 1; + *outptr = (JSAMPLE) pixcode; + /* Compute representation error for this pixel */ + cur0 -= (int) colormap0[pixcode]; + cur1 -= (int) colormap1[pixcode]; + cur2 -= (int) colormap2[pixcode]; + } + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + { register LOCFSERROR bnexterr, delta; + + bnexterr = cur0; /* Process component 0 */ + delta = cur0 * 2; + cur0 += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr0 + cur0); + cur0 += delta; /* form error * 5 */ + bpreverr0 = belowerr0 + cur0; + belowerr0 = bnexterr; + cur0 += delta; /* form error * 7 */ + bnexterr = cur1; /* Process component 1 */ + delta = cur1 * 2; + cur1 += delta; /* form error * 3 */ + errorptr[1] = (FSERROR) (bpreverr1 + cur1); + cur1 += delta; /* form error * 5 */ + bpreverr1 = belowerr1 + cur1; + belowerr1 = bnexterr; + cur1 += delta; /* form error * 7 */ + bnexterr = cur2; /* Process component 2 */ + delta = cur2 * 2; + cur2 += delta; /* form error * 3 */ + errorptr[2] = (FSERROR) (bpreverr2 + cur2); + cur2 += delta; /* form error * 5 */ + bpreverr2 = belowerr2 + cur2; + belowerr2 = bnexterr; + cur2 += delta; /* form error * 7 */ + } + /* At this point curN contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + inptr += dir3; /* Advance pixel pointers to next column */ + outptr += dir; + errorptr += dir3; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error values into the + * final fserrors[] entry. Note we need not unload belowerrN because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */ + errorptr[1] = (FSERROR) bpreverr1; + errorptr[2] = (FSERROR) bpreverr2; + } +} + + +static void init_error_limit () +/* Allocate and fill in the error_limiter table */ +/* Note this should be done only once. */ +{ + int * table; + int in, out; + + table = (int *) malloc((size_t) ((255*2+1) * sizeof(int))); + if (! table) return; + + table += 255; /* so can index -255 .. +255 */ + sl_error_limiter = table; + +#define STEPSIZE ((255+1)/16) + /* Map errors 1:1 up to +- 255/16 */ + out = 0; + for (in = 0; in < STEPSIZE; in++, out++) { + table[in] = out; table[-in] = -out; + } + /* Map errors 1:2 up to +- 3*255/16 */ + for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) { + table[in] = out; table[-in] = -out; + } + /* Clamp the rest to final out value (which is (255+1)/8) */ + for (; in <= 255; in++) { + table[in] = out; table[-in] = -out; + } +#undef STEPSIZE +} diff --git a/src/image/image.cxx b/src/image/image.cxx new file mode 100644 index 0000000..13647c1 --- /dev/null +++ b/src/image/image.cxx @@ -0,0 +1,890 @@ +/**************************************************************************** +* Copyright (C) 1996-98 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +#include "image.h" +#include "im_exp.h" + +#define ACCEL_H +#define ABS(x) ((x) > 0 ? (x) : (-(x))) +extern "C" void (*im_coding)(unsigned int,unsigned int,unsigned int,char**); +extern "C" void im_truetruecoding(unsigned int ir,unsigned int ig,unsigned int ib,char **imdata); +extern "C" void im_truenocoding(unsigned int ir,unsigned int ig,unsigned int ib,char **imdata); +XColor col; +int vclass; +Visual *vis; +int pcd_resolution=3; +int depth,bdep,translation,b_pad=1; +int fromMem=0; +Colormap defc; +PICINFO im; +char *trans; +uint rmask,gmask,bmask,rsh,bsh,gsh; +uint red_rsh,green_rsh,blue_rsh,red_lsh,green_lsh,blue_lsh; +XColor *XColorTable; +Colormap lcmp; +int ptnum,cmptype; +char check[256]; +int conv24; + +void (*im_coding256)(char **,int); +void im_256truecoding(char**,int); +void im_256nocoding(char**,int); +void im_256256coding(char**,int); + +unsigned long *global_pal=NULL; + +#ifdef PSEUDOCOLOR +unsigned long XPixelTable[256]; +unsigned long Xfreepix[256]; +byte rpart[256]; +byte gpart[256]; +byte bpart[256]; +#endif +int im_getpixels(unsigned long* pt) +{ +#ifdef PSEUDOCOLOR + if(vclass==PseudoColor) + for(int i=0;ibyte_order=MSBFirst; + return xim; +} +#endif + +char *getpicinfo() +{ + char *tmp=new char[strlen(im.fullInfo)+1]; + strcpy(tmp,im.fullInfo); + return tmp; +} + +void do_masks(uint mask,uint &lsh,uint &rsh) +{ + lsh=rsh=0; + while((mask & 1)==0) {lsh++;mask>>=1;}; + while(mask & 1) {rsh++;mask>>=1;}; + rsh=8-rsh; +} + +void im_reset_coding() +{ + im_coding256=im_256nocoding; + translation=0; +} + +void im_set_coding() +{ + im_coding256=im_256truecoding; + translation=1; +} + +long cmap_distance[256]; +int XCmapNumColors; +XColor *XCmapColorTable=NULL; +Colormap XCmapCmap; + +long im_calc_weight(unsigned short red, + unsigned short green, + unsigned short blue) +{ + double r=(double)red; + double g=(double)green; + double b=(double)blue; + return (long)sqrt(r*r+g*g+b*b); +} + +void im_init_cmap(Colormap XColorMap) +{ + + int i, XNumOfColors; + int screen=DefaultScreen(disp); + + depth=DefaultDepth(disp,screen); + vis=DefaultVisual(disp,screen); + defc=DefaultColormap(disp,screen); + vclass=vis->c_class; + XNumOfColors = DisplayCells(disp,DefaultScreen(disp)); + if(XCmapColorTable == NULL) + XCmapColorTable = (XColor *) malloc(sizeof(XColor) * XNumOfColors); + for (i = 0; i < XNumOfColors; i++) + XCmapColorTable[i].pixel = i; + XQueryColors(disp, XColorMap, XCmapColorTable, XNumOfColors); + + for(i=0;i< XNumOfColors;i++) + { + cmap_distance[i]=im_calc_weight(XCmapColorTable[i].red, + XCmapColorTable[i].green, + XCmapColorTable[i].blue); + } + XCmapNumColors=XNumOfColors; + XCmapCmap=XColorMap; +} + +int im_find_closest_color(XColor* orig, XColor* tocol) +{ + unsigned long weight,distance, Red, Green, Blue, D; + int idx=0,i; + if(vclass==TrueColor) + { + *tocol=*orig; + return 0; + } + Red=orig->red; + Green=orig->green; + Blue=orig->blue; + distance=0xffffffff; + for(i=0;iflags = DoGreen | DoRed | DoBlue; + return 1; +} + +int im_find_closest_color2(XColor* orig, XColor* tocol) +{ + long weight,distance; + int idx=0,i; + if(vclass==TrueColor) + { + *tocol=*orig; + return 0; + } + weight=im_calc_weight(orig->red, orig->green, orig->blue); + distance=ABS(cmap_distance[idx]-weight); + for(i=1;iABS(cmap_distance[i]-weight)) + { + idx=i; + distance=ABS(cmap_distance[i]-weight); + } + *tocol=XCmapColorTable[idx]; + tocol->flags = DoGreen | DoRed | DoBlue; + return 1; +} + +Status im_AllocColor(Display* d, Colormap cmap, XColor *cl) +{ + XColor cl2; + Status st; + if((st=XAllocColor(disp, cmap, cl))!=0) + return st; + if(cmap!=XCmapCmap || XCmapColorTable==NULL) + im_init_cmap(cmap); + im_find_closest_color2(cl, &cl2); + *cl=cl2; + return XAllocColor(disp, cmap, cl); +} + +Status (*pim_AllocColor)(Display*, Colormap, XColor*)=im_AllocColor; + +void init_imagengine() +{ + XImage* xim; + XPixmapFormatValues *pixformat; + int i, count; + int screen=DefaultScreen(disp); + + depth=DefaultDepth(disp,screen); + vis=DefaultVisual(disp,screen); + defc=DefaultColormap(disp,screen); + vclass=vis->c_class; + fprintf(stderr, "**********Image Engine**********\n"); + fprintf(stderr,"* *\n"); + switch(vclass) + { + + case TrueColor: + pixformat = XListPixmapFormats(disp, &count); + for (i=0; ired_mask; + gmask=xim->green_mask; + bmask=xim->blue_mask; +#ifdef PCD_SUPPORT + x11_create_lut(rmask,gmask,bmask); +#endif + do_masks(rmask,red_lsh,red_rsh); + do_masks(gmask,green_lsh,green_rsh); + do_masks(bmask,blue_lsh,blue_rsh); + im_coding=im_truetruecoding; + im_coding256=im_256truecoding; + fprintf(stderr,"*Visual: TrueColor *\n"); + fprintf(stderr,"*Depth: %-3d (%d bytes/pixel) *\n",depth,bdep); + fprintf(stderr,"*RGB: %d:%d:%d *\n",8-red_rsh,8-green_rsh,8-blue_rsh); + fprintf(stderr,"*Colors: %-9d *\n",1<=0;j--) + { + trans[i2-j-1]=(char)((col.pixel>>(j<<3))& 0xff); + } + } + } +} + + +XImage *LoadXImage(char *file,int cmptype,int type) +{ + int i,j,l,lw,x,y; + ulong mask; + char *imdata,*imdat; + int ind; + XImage *xim; + ::cmptype=cmptype; + if(vclass==DirectColor) return NULL; +#ifndef PSEUDOCOLOR + if(vclass==PseudoColor) return NULL; +#endif + if(type==F_AUTO) type=autodetect(file); + switch(type) + { + case F_GIF: + translation=0; + im_clear_pic(); + im_load_gif(file,&im,fromMem); + break; + + case F_JPEG: +#ifdef JPEGSUPPORT + im_clear_pic(); + if(vclass==PseudoColor) + translation= 0; + else + translation= 1; + if(LoadJFIF(file,&im)) + break; + else + { + fprintf(stderr,"Image Engine: LoadJpeg\n"); + return NULL; + }; +#else + return NULL; +#endif + case F_TIFF: +#ifdef TIFFSUPPORT + im_clear_pic(); + translation= 0; + if(LoadTIFF(file,&im)) break;else {fprintf(stderr,"Image Engine: LoadTiff\n");return NULL;}; +#else + return NULL; +#endif + case F_PNG: +#ifdef PNG_SUPPORT + im_clear_pic(); + translation= 0; + if(LoadPNG(file,&im)) break;else {fprintf(stderr,"Image Engine: LoadPNG\n");return NULL;}; +#else + return NULL; +#endif + case F_PCX: +#ifdef PCXSUPPORT + im_clear_pic(); + translation= 0; + if(LoadPCX(file,&im)) break;else {fprintf(stderr,"Image Engine: LoadPcx\n");return NULL;}; +#else + return NULL; +#endif + case F_PCD: +#ifdef PCD_SUPPORT + im_clear_pic(); + if(vclass==PseudoColor) translation=0; + else translation= 1; + if(LoadPCD(file,&im)) break;else {fprintf(stderr,"Image Engine: LoadPcd\n");return NULL;}; +#else + return NULL; +#endif + case F_XBM: +#ifdef XBMSUPPORT + im_clear_pic(); + translation=0; + if(LoadXBM(file,&im)) break;else {fprintf(stderr,"Image Engine: LoadXBM\n");return NULL;}; +#else + return NULL; +#endif + case F_XPM: +#ifdef XPMSUPPORT + im_clear_pic(); + translation=0; + if(LoadXPM(file,&im)) break;else {fprintf(stderr,"Image Engine: LoadXPM\n");return NULL;}; +#else + return NULL; +#endif + case F_BMP: +#ifdef BMPSUPPORT + im_clear_pic(); + translation= 1; + if(LoadBMP(file,&im)) break;else {fprintf(stderr,"Image Engine: LoadBmp\n");return NULL;}; +#else + return NULL; +#endif + case F_TARGA: +#ifdef TGASUPPORT + im_clear_pic(); + translation=0; + if(LoadTarga(file,&im)) break;else {fprintf(stderr,"Image Engine: LoadTGA\n");return NULL;}; +#else + return NULL; +#endif + default: return NULL; + }; +#ifdef PSEUDOCOLOR + if(vclass==PseudoColor) + { + if(im.type==PIC8) + return im_process_pseudo_256(im_get_checked()); + else { + im_convert_true_to_pseudo(im,256); + translation=0; + return im_process_pseudo_256(conv24!=CONV24_FAST ? 230:256); + } + } +#endif + if(im.type==PIC8 && vclass==TrueColor) + { + if(translation==0) + { + translation=1; + im_init_translation(); + translation=0; + lw = im.w * bdep; + if (lw % b_pad) + lw += b_pad - lw % b_pad; + l=im.h*im.w; + imdata=new char[lw*im.h]; + i = 0; + for (y=0; ybyte_order=MSBFirst; + return xim; + } else if(im.type==PIC24 && vclass==TrueColor) + { + if(translation==0) + { + lw = im.w * bdep; + if (lw % b_pad) + lw += b_pad - lw % b_pad; + imdata = new char[lw*im.h]; + mask = 0xff; + i = 0; + for (y=0; y < im.h; y++) { + imdat = imdata + y * lw; + for (x=0; x < im.w; x++, i+=3) + im_truetruecoding(im.pic[i],im.pic[i+1],im.pic[i+2],&imdat); + } + free(im.pic); + } + else + imdata=(char*)im.pic; + if((xim=XCreateImage(disp,vis,depth,ZPixmap,0,imdata,im.w,im.h,b_pad*8,0))==NULL) + { + fprintf(stderr,"Image Engine Error: XCreateImage\n"); + delete imdata; + return NULL; + } + xim->byte_order=MSBFirst; + return xim; + } + return NULL; +} + +XImage* encoding256(PICINFO& im,int ncol) +{ + int i,j,l,k,lw; + ulong mask; + char *trans; + char *imdata; + int ind,delta; + XImage *xim; + trans=new char[256*bdep]; + col.flags=DoRed | DoGreen | DoBlue; + ptnum=0; + for(i=0;i=0;j--) + { + trans[mask-j-1]=(char)((col.pixel>>(j<<3))& 0xff); + } + } + l=im.h*im.w; + lw = im.w * bdep; + if (lw % b_pad) { + lw += b_pad - lw % b_pad; + } + imdata=new char[im.h*lw]; + for (i=0; ibyte_order=MSBFirst; + return xim; +} + +void im_256truecoding(char **data,int ind) +{ + char *ltrans=trans+ind*bdep; + for(int i=0;iwidth,iim->height,depth); + gcw=XCreateGC(disp,im,0,NULL); + l=iim->width;h=iim->height; + XPutImage(disp,im,gcw,iim,0,0,0,0,l,h); + XFreeGC(disp,gcw); + delete iim->data;iim->data=NULL;XDestroyImage(iim); + return im; + } + return 0; +} + +Pixmap LoadPixmapFromMem(char *fname,int type,int& l,int& h, + int cmptype,int siz) +{ + XImage *iim; + Pixmap im; + GC gcw; + fromMem=siz; + iim=LoadXImage(fname,cmptype,type); + fromMem=0; + if(iim) + { + im=XCreatePixmap(disp,DefaultRootWindow(disp), + iim->width,iim->height,depth); + gcw=XCreateGC(disp,im,0,NULL); + l=iim->width;h=iim->height; + XPutImage(disp,im,gcw,iim,0,0,0,0,l,h); + XFreeGC(disp,gcw); + delete iim->data;iim->data=NULL;XDestroyImage(iim); + return im; + } + return 0; +} + +void im_populate_pallete(unsigned long* pal) +{ + global_pal=pal; +} + +void im_clear_global_pal() +{ + global_pal=NULL; +} + diff --git a/src/image/image.h b/src/image/image.h new file mode 100644 index 0000000..6a3d4ab --- /dev/null +++ b/src/image/image.h @@ -0,0 +1,55 @@ +#ifndef IMAGE_H +#define IMAGE_H +#ifdef HAVE_CONFIG_H +#include +#endif +#include "globals.h" +#include +#include +#include "picinfo.h" +#include + +extern Display* disp; +extern Colormap defcmp; +extern int conv24; +extern int vclass; +void init_imagengine(); +int im_convert_true_to_pseudo(PICINFO& pic,int max_colors); +int im_getpixels(unsigned long* pt); +Colormap im_get_colormap(); +void im_freecmp(Colormap XColorMap,unsigned long *pt,int iptnum); +void im_populate_pallete(unsigned long* pal); +void im_clear_global_pal(); +char *getpicinfo(); +Pixmap LoadPixmap(char *fname,int type,int& l,int& h,int cmptype=CMP_AUTO); +Pixmap LoadPixmapFromMem(char *fname,int type,int& l,int& h,int cmptype=CMP_AUTO,int siz=0); +XImage *LoadXImage(char *file,int cmptype,int type); +XImage* encoding256(PICINFO& im,int ncol); +int LoadGIF(char* fname,PICINFO* pinfo); +int deGIF(char* fbu,PICINFO* pinfo,int fsiz); +extern "C" int LoadPCD(char* fname,PICINFO* pinfo); +extern "C" int LoadPNG(char *fname,PICINFO* pinfo); +int LoadXBM(char* fname,PICINFO* pinfo); +int LoadXPM(char* fname,PICINFO* pinfo); +int LoadTarga(char* fname,PICINFO* pinfo); +extern "C" int LoadTIFF(char* ,PICINFO*); +int autodetect(char*); +void im_reset_coding(); +void im_set_coding(); +extern int im_find_closest_color(XColor* orig, XColor* tocol); +extern Status im_AllocColor(Display* d, Colormap cmap, XColor *cl); +extern void (*im_coding256)(char **,int); +extern void im_256truecoding(char**,int); +extern void im_init_translation(); +extern "C" int LoadJFIF(char *fname, PICINFO *pinfo); +extern "C" int LoadPCX(char *fname, PICINFO *pinfo); +extern int LoadBMP(char *fname, PICINFO *pinfo); +extern "C" void x11_create_lut(unsigned long, unsigned long, unsigned long); +extern "C" void set_method(int method); + + +#endif +//////////////////////////////////////////End of file/////////////////////////////////////////// + +/* ------------ End of file -------------- */ + diff --git a/src/image/jpeg.c b/src/image/jpeg.c new file mode 100644 index 0000000..d17988e --- /dev/null +++ b/src/image/jpeg.c @@ -0,0 +1,300 @@ +/* + * example.c + * + * This file illustrates how to use the IJG code as a subroutine library + * to read or write JPEG image files. You should look at this code in + * conjunction with the documentation file libjpeg.doc. + * + * This code will not do anything useful as-is, but it may be helpful as a + * skeleton for constructing routines that call the JPEG library. + * + * We present these routines in the same coding style used in the JPEG code + * (ANSI function definitions, etc); but you are of course free to code your + * routines in a different style if you prefer. + */ + +#include +#define JPEG_IMAGES +#include "picinfo.h" +#include "accel.h" +int myfp; +/* + * Include file for users of JPEG library. + * You will need to have included system headers that define at least + * the typedefs FILE and size_t before you can include jpeglib.h. + * (stdio.h is sufficient on ANSI-conforming systems.) + * You may also wish to include "jerror.h". + */ + +#include +/* + * is used for the optional error recovery mechanism shown in + * the second part of the example. + */ + +#include + + + +/******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/ + +/* This half of the example shows how to read data from the JPEG decompressor. + * It's a bit more refined than the above, in that we show: + * (a) how to modify the JPEG library's standard error-reporting behavior; + * (b) how to allocate workspace using the library's memory manager. + * + * Just to make this example a little different from the first one, we'll + * assume that we do not intend to put the whole image into an in-memory + * buffer, but to send it line-by-line someplace else. We need a one- + * scanline-high JSAMPLE array as a work buffer, and we will let the JPEG + * memory manager allocate it for us. This approach is actually quite useful + * because we don't need to remember to deallocate the buffer separately: it + * will go away automatically when the JPEG object is cleaned up. + */ + + +/* + * ERROR HANDLING: + * + * The JPEG library's standard error handler (jerror.c) is divided into + * several "methods" which you can override individually. This lets you + * adjust the behavior without duplicating a lot of code, which you might + * have to update with each future release. + * + * Our example here shows how to override the "error_exit" method so that + * control is returned to the library's caller when a fatal error occurs, + * rather than calling exit() as the standard error_exit method does. + * + * We use C's setjmp/longjmp facility to return control. This means that the + * routine which calls the JPEG library must first execute a setjmp() call to + * establish the return point. We want the replacement error_exit to do a + * longjmp(). But we need to make the setjmp buffer accessible to the + * error_exit routine. To do this, we make a private extension of the + * standard JPEG error handler object. (If we were using C++, we'd say we + * were making a subclass of the regular error handler.) + * + * Here's the extended error handler struct: + */ + +struct my_error_mgr { + struct jpeg_error_mgr pub; /* "public" fields */ + + jmp_buf setjmp_buffer; /* for return to caller */ +}; + +typedef struct my_error_mgr * my_error_ptr; + +/* + * Here's the routine that will replace the standard error_exit method: + */ +static void +my_error_exit (j_common_ptr cinfo) +{ + /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ + my_error_ptr myerr = (my_error_ptr) cinfo->err; + + /* Always display the message. */ + /* We could postpone this until after returning, if we chose. */ + (*cinfo->err->output_message) (cinfo); + + /* Return control to the setjmp point */ + longjmp(myerr->setjmp_buffer, 1); +} + + +/* + * Sample routine for JPEG decompression. We assume that the source file name + * is passed in. We want to return 1 on success, 0 on error. + */ + +int jy=0; +char *mybuf; +int jgray=0; +static int line_w; + +void put_jpegdata(unsigned char* b,int l) +{ + int i; + char *buf; + buf = mybuf; + + if(jgray) + for(i=0;iw=cinfo.image_width; + pc->h=cinfo.image_height; + pc->pic=(byte*) im_alloc_true(pc->w,pc->h); + pc->type=PIC24; + mybuf=(char*) pc->pic; + line_w = im_get_linew_true(pc->w); + if(jgray) + sprintf(pc->fullInfo,"%d x %d JPEG image (Grayscale format)",pc->w,pc->h); + else + sprintf(pc->fullInfo,"%d x %d JPEG image (RGB format)",pc->w,pc->h); + + /* Step 4: set parameters for decompression */ + + /* In this example, we don't need to change any of the defaults set by + * jpeg_read_header(), so we do nothing here. + */ + + /* Step 5: Start decompressor */ + + (void) jpeg_start_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* We may need to do some setup of our own at this point before reading + * the data. After jpeg_start_decompress() we have the correct scaled + * output image dimensions available, as well as the output colormap + * if we asked for color quantization. + * In this example, we need to make an output work buffer of the right size. + */ + /* JSAMPLEs per row in output buffer */ + row_stride = cinfo.output_width * cinfo.output_components; + /* Make a one-row-high sample array that will go away when done with image */ + buffer = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + + /* Step 6: while (scan lines remain to be read) */ + /* jpeg_read_scanlines(...); */ + + /* Here we use the library's state variable cinfo.output_scanline as the + * loop counter, so that we don't have to keep track ourselves. + */ + while (cinfo.output_scanline < cinfo.output_height) { + /* jpeg_read_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could ask for + * more than one scanline at a time if that's more convenient. + */ + (void) jpeg_read_scanlines(&cinfo, buffer, 1); + /* Assume put_scanline_someplace wants a pointer and sample count. */ + put_jpegdata((unsigned char*) buffer[0], row_stride); + } + + /* Step 7: Finish decompression */ + + (void) jpeg_finish_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* Step 8: Release JPEG decompression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_decompress(&cinfo); + + /* After finish_decompress, we can close the input file. + * Here we postpone it until after no more JPEG errors are possible, + * so as to simplify the setjmp error logic above. (Actually, I don't + * think that jpeg_destroy can do an error exit, but why assume anything...) + */ + fclose(infile); + + /* At this point you may want to check to see whether any corrupt-data + * warnings occurred (test whether jerr.pub.num_warnings is nonzero). + */ + + /* And we're done! */ + return 1; +} + + +/* + * SOME FINE POINTS: + * + * In the above code, we ignored the return value of jpeg_read_scanlines, + * which is the number of scanlines actually read. We could get away with + * this because we asked for only one line at a time and we weren't using + * a suspending data source. See libjpeg.doc for more info. + * + * We cheated a bit by calling alloc_sarray() after jpeg_start_decompress(); + * we should have done it beforehand to ensure that the space would be + * counted against the JPEG max_memory setting. In some systems the above + * code would risk an out-of-memory error. However, in general we don't + * know the output image dimensions before jpeg_start_decompress(), unless we + * call jpeg_calc_output_dimensions(). See libjpeg.doc for more about this. + * + * Scanlines are returned in the same order as they appear in the JPEG file, + * which is standardly top-to-bottom. If you must emit data bottom-to-top, + * you can use one of the virtual arrays provided by the JPEG memory manager + * to invert the data. See wrbmp.c for an example. + * + * As with compression, some operating modes may require temporary files. + * On some systems you may need to set up a signal handler to ensure that + * temporary files are deleted if the program is interrupted. See libjpeg.doc. + */ +/* + void main(int argc,char **argv) + { + PICINFO ppp; + LoadJFIF(argv[1],&ppp); + } +*/ diff --git a/src/image/makefile.in b/src/image/makefile.in new file mode 100644 index 0000000..99d2cf6 --- /dev/null +++ b/src/image/makefile.in @@ -0,0 +1,48 @@ +# Image Engine for X Window +# +# Copyright (C) 1996 by Leo Khramov +# email: leo@pop.convey.ru +# Fido: 2:5030/627.15 +# +# 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. +# + +include ../make.conf + +@MCOMMON@ + +.SUFFIXES: .c + +.c.o: + $(CC) -c $(CXXOPT) $(CPPFLAGS) -o $@ $< + + IOBJS= \ + sublib/SDL_error.o \ + sublib/SDL_rwops.o \ + sublib/SDL_surface.o \ + sublib/SDL_to_picinfo.o \ + sublib/IMG_gif.o \ + image.o \ + convert.o \ + accel.o + CXXINCLUDES=$(XINC) -I./sublib + CXXOPT=$(CFLAGS) $(DEFS) $(DEB) $(XINC) -I. -I../include -I./sublib + + +all:: $(IOBJS) + +clean: + $(RM) -f *.o + $(RM) -f sublib/*.o + +FORCE: + + diff --git a/src/image/picinfo.h b/src/image/picinfo.h new file mode 100644 index 0000000..0705723 --- /dev/null +++ b/src/image/picinfo.h @@ -0,0 +1,130 @@ +#ifndef PICINFO_H +#define PICINFO_H +#include "config.h" +#include "globdef.h" +#ifdef HAVE_SYS_SIGEVENT_H +#include +#endif +#include +#include +#include +#include +#include +#include +#ifndef __FreeBSD__ +#elif ! defined __OpenBSD__ +#include +#endif +#include +#include + +/* +#undef PARM +#ifdef __STDC__ +# define PARM(a) a +#else +# define PARM(a) () +# define const +#endif + */ +#define MONO(rr,gg,bb) (((rr)*11+(gg)*16+(bb)*5)>>5) /*0.33r+0.5g+0.17b*/ +#ifndef PCD_DEFS +#define RANGE(a,b,c) {if(ac) a=c;} +#endif + +#define GETWD(x) getcwd(x,sizeof(x)) + +#define True 1 +#define False 0 +#define TRUE 1 +#define FALSE 0 +#define F_COLORS 0 +#define F_FORMAT 1 +#define PIC8 0 +#define PIC24 1 +#define F_FULLCOLOR 0 +#define F_GREYSCALE 1 +#define F_BWDITHER 2 +#define F_REDUCED 3 + +#define CMP_AUTO 0 +#define CMP_OWN 1 +#define CMP_COM 2 +#define F_GIF 0 +#define F_PM 1 +#define F_PBMRAW 2 +#define F_PBMASCII 3 +#define F_XBM 4 +#define F_SUNRAS 5 +#define F_BMP 6 +#define F_PS 7 +#define F_IRIS 8 +#define F_JPEG 9 +#define F_AUTO 11 +#define F_TIFF 10 +#define F_PCX 12 +#define F_TARGA 13 +#define F_XPM 14 +#define F_PCD 15 +#define F_PNG 16 + +#define CONV24_FAST 5 +#define CONV24_SLOW 6 +#define CONV24_BEST 7 + +#define ALG_NONE 0 +#define ALG_BLUR3 2 +#define ALG_BLUR5 3 +#define ALG_BLUR7 4 +#define ALG_BLUR9 1 +#define ALG_EDGE 5 +#define ALG_TINF 6 +#define ALG_OIL 7 +#define ALG_GRAY 8 + +typedef unsigned char byte; +#ifndef JPEG_IMAGES +#ifndef PCD_DEFS +#ifndef u_short +typedef unsigned short u_short; +#endif +#ifndef u_char +typedef unsigned char u_char; +#endif +#ifndef u_int +typedef unsigned int u_int; +#endif +#ifndef u_long +typedef unsigned long u_long; +#endif +#endif +#endif + +extern int numcols; +extern float normaspect; +extern int conv24; +extern int noqcheck; +extern int picType,pWIDE,pHIGH,ncols; +extern byte bMap[256],gMap[256],rMap[256]; +extern byte* pic; +extern byte colAllocOrder[256]; + +typedef struct { byte *pic; /* image data */ + int w, h; /* size */ + int type; /* PIC8 or PIC24 */ + + byte pal[768]; + /* colormap, if PIC8 */ + + int frmType; /* def. Format type to save in */ + int colType; /* def. Color type to save in */ + char fullInfo[128]; /* Format: field in info box */ + char shrtInfo[128]; /* short format info */ + char *comment; /* comment text */ + + int numpages; /* # of page files, if >1 */ + char pagebname[64]; /* basename of page files */ + } PICINFO; +#endif +/* ------------ End of file -------------- */ + diff --git a/src/image/sublib/IMG_gif.c b/src/image/sublib/IMG_gif.c new file mode 100644 index 0000000..99907be --- /dev/null +++ b/src/image/sublib/IMG_gif.c @@ -0,0 +1,606 @@ +/* + SDL_image: An example image loading library for use with SDL + Copyright (C) 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* $Id: IMG_gif.c,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ */ + +/* This is a GIF image file loading framework */ + +#include +#include + +#include "SDL_image.h" + +#define LOAD_GIF + +#ifdef LOAD_GIF + +/* See if an image is contained in a data source */ +int IMG_isGIF(SDL_RWops *src) +{ + int is_GIF; + char magic[6]; + + is_GIF = 0; + if ( SDL_RWread(src, magic, 6, 1) ) { + if ( (strncmp(magic, "GIF", 3) == 0) && + ((memcmp(magic + 3, "87a", 3) == 0) || + (memcmp(magic + 3, "89a", 3) == 0)) ) { + is_GIF = 1; + } + } + return(is_GIF); +} + +/* Code from here to end of file has been adapted from XPaint: */ +/* +-------------------------------------------------------------------+ */ +/* | Copyright 1990, 1991, 1993 David Koblas. | */ +/* | Copyright 1996 Torsten Martinsen. | */ +/* | Permission to use, copy, modify, and distribute this software | */ +/* | and its documentation for any purpose and without fee is hereby | */ +/* | granted, provided that the above copyright notice appear in all | */ +/* | copies and that both that copyright notice and this permission | */ +/* | notice appear in supporting documentation. This software is | */ +/* | provided "as is" without express or implied warranty. | */ +/* +-------------------------------------------------------------------+ */ + +/* Adapted for use in SDL by Sam Lantinga -- 7/20/98 */ +#define USED_BY_SDL + +#include +#include + +#ifdef USED_BY_SDL +/* Changes to work with SDL: + + Include SDL header file + Use SDL_Surface rather than xpaint Image structure + Define SDL versions of RWSetMsg(), ImageNewCmap() and ImageSetCmap() +*/ +#include "SDL.h" + +#define Image SDL_Surface +#define RWSetMsg IMG_SetError +#define ImageNewCmap(w, h, s) SDL_AllocSurface(SDL_SWSURFACE,w,h,8,0,0,0,0) +#define ImageSetCmap(s, i, R, G, B) do { \ + s->format->palette->colors[i].r = R; \ + s->format->palette->colors[i].g = G; \ + s->format->palette->colors[i].b = B; \ + } while (0) +/* * * * * */ + +#else + +/* Original XPaint sources */ + +#include "image.h" +#include "rwTable.h" + +#define SDL_RWops FILE +#define SDL_RWclose fclose + +#endif /* USED_BY_SDL */ + + +#define MAXCOLORMAPSIZE 256 + +#define TRUE 1 +#define FALSE 0 + +#define CM_RED 0 +#define CM_GREEN 1 +#define CM_BLUE 2 + +#define MAX_LWZ_BITS 12 + +#define INTERLACE 0x40 +#define LOCALCOLORMAP 0x80 +#define BitSet(byte, bit) (((byte) & (bit)) == (bit)) + +#define ReadOK(file,buffer,len) SDL_RWread(file, buffer, len, 1) + +#define LM_to_uint(a,b) (((b)<<8)|(a)) + +static struct { + unsigned int Width; + unsigned int Height; + unsigned char ColorMap[3][MAXCOLORMAPSIZE]; + unsigned int BitPixel; + unsigned int ColorResolution; + unsigned int Background; + unsigned int AspectRatio; + int GrayScale; +} GifScreen; + +static struct { + int transparent; + int delayTime; + int inputFlag; + int disposal; +} Gif89; + +static int ReadColorMap(SDL_RWops * src, int number, + unsigned char buffer[3][MAXCOLORMAPSIZE], int *flag); +static int DoExtension(SDL_RWops * src, int label); +static int GetDataBlock(SDL_RWops * src, unsigned char *buf); +static int GetCode(SDL_RWops * src, int code_size, int flag); +static int LWZReadByte(SDL_RWops * src, int flag, int input_code_size); +static Image *ReadImage(SDL_RWops * src, int len, int height, int, + unsigned char cmap[3][MAXCOLORMAPSIZE], + int gray, int interlace, int ignore); + +Image * +IMG_LoadGIF_RW(SDL_RWops *src) +{ + unsigned char buf[16]; + unsigned char c; + unsigned char localColorMap[3][MAXCOLORMAPSIZE]; + int grayScale; + int useGlobalColormap; + int bitPixel; + int imageCount = 0; + char version[4]; + int imageNumber = 1; + Image *image = NULL; + + if ( src == NULL ) { + goto done; + } + if (!ReadOK(src, buf, 6)) { + RWSetMsg("error reading magic number"); + goto done; + } + if (strncmp((char *) buf, "GIF", 3) != 0) { + RWSetMsg("not a GIF file"); + goto done; + } + strncpy(version, (char *) buf + 3, 3); + version[3] = '\0'; + + if ((strcmp(version, "87a") != 0) && (strcmp(version, "89a") != 0)) { + RWSetMsg("bad version number, not '87a' or '89a'"); + goto done; + } + Gif89.transparent = -1; + Gif89.delayTime = -1; + Gif89.inputFlag = -1; + Gif89.disposal = 0; + + if (!ReadOK(src, buf, 7)) { + RWSetMsg("failed to read screen descriptor"); + goto done; + } + GifScreen.Width = LM_to_uint(buf[0], buf[1]); + GifScreen.Height = LM_to_uint(buf[2], buf[3]); + GifScreen.BitPixel = 2 << (buf[4] & 0x07); + GifScreen.ColorResolution = (((buf[4] & 0x70) >> 3) + 1); + GifScreen.Background = buf[5]; + GifScreen.AspectRatio = buf[6]; + + if (BitSet(buf[4], LOCALCOLORMAP)) { /* Global Colormap */ + if (ReadColorMap(src, GifScreen.BitPixel, GifScreen.ColorMap, + &GifScreen.GrayScale)) { + RWSetMsg("error reading global colormap"); + goto done; + } + } + do { + if (!ReadOK(src, &c, 1)) { + RWSetMsg("EOF / read error on image data"); + goto done; + } + if (c == ';') { /* GIF terminator */ + if (imageCount < imageNumber) { + RWSetMsg("only %d image%s found in file", + imageCount, imageCount > 1 ? "s" : ""); + goto done; + } + } + if (c == '!') { /* Extension */ + if (!ReadOK(src, &c, 1)) { + RWSetMsg("EOF / read error on extention function code"); + goto done; + } + DoExtension(src, c); + continue; + } + if (c != ',') { /* Not a valid start character */ + continue; + } + ++imageCount; + + if (!ReadOK(src, buf, 9)) { + RWSetMsg("couldn't read left/top/width/height"); + goto done; + } + useGlobalColormap = !BitSet(buf[8], LOCALCOLORMAP); + + bitPixel = 1 << ((buf[8] & 0x07) + 1); + + if (!useGlobalColormap) { + if (ReadColorMap(src, bitPixel, localColorMap, &grayScale)) { + RWSetMsg("error reading local colormap"); + goto done; + } + image = ReadImage(src, LM_to_uint(buf[4], buf[5]), + LM_to_uint(buf[6], buf[7]), + bitPixel, localColorMap, grayScale, + BitSet(buf[8], INTERLACE), + imageCount != imageNumber); + } else { + image = ReadImage(src, LM_to_uint(buf[4], buf[5]), + LM_to_uint(buf[6], buf[7]), + GifScreen.BitPixel, GifScreen.ColorMap, + GifScreen.GrayScale, BitSet(buf[8], INTERLACE), + imageCount != imageNumber); + } + } while (image == NULL); + +#ifdef USED_BY_SDL + if ( Gif89.transparent >= 0 ) { + SDL_SetColorKey(image, SDL_SRCCOLORKEY, Gif89.transparent); + } +#endif + +done: + return image; +} + +static int +ReadColorMap(SDL_RWops *src, int number, + unsigned char buffer[3][MAXCOLORMAPSIZE], int *gray) +{ + int i; + unsigned char rgb[3]; + int flag; + + flag = TRUE; + + for (i = 0; i < number; ++i) { + if (!ReadOK(src, rgb, sizeof(rgb))) { + RWSetMsg("bad colormap"); + return 1; + } + buffer[CM_RED][i] = rgb[0]; + buffer[CM_GREEN][i] = rgb[1]; + buffer[CM_BLUE][i] = rgb[2]; + flag &= (rgb[0] == rgb[1] && rgb[1] == rgb[2]); + } + +#if 0 + if (flag) + *gray = (number == 2) ? PBM_TYPE : PGM_TYPE; + else + *gray = PPM_TYPE; +#else + *gray = 0; +#endif + + return FALSE; +} + +static int +DoExtension(SDL_RWops *src, int label) +{ + static unsigned char buf[256]; + char *str; + + switch (label) { + case 0x01: /* Plain Text Extension */ + str = "Plain Text Extension"; + break; + case 0xff: /* Application Extension */ + str = "Application Extension"; + break; + case 0xfe: /* Comment Extension */ + str = "Comment Extension"; + while (GetDataBlock(src, (unsigned char *) buf) != 0); + return FALSE; + case 0xf9: /* Graphic Control Extension */ + str = "Graphic Control Extension"; + (void) GetDataBlock(src, (unsigned char *) buf); + Gif89.disposal = (buf[0] >> 2) & 0x7; + Gif89.inputFlag = (buf[0] >> 1) & 0x1; + Gif89.delayTime = LM_to_uint(buf[1], buf[2]); + if ((buf[0] & 0x1) != 0) + Gif89.transparent = buf[3]; + + while (GetDataBlock(src, (unsigned char *) buf) != 0); + return FALSE; + default: + str = (char *)buf; + sprintf(str, "UNKNOWN (0x%02x)", label); + break; + } + + while (GetDataBlock(src, (unsigned char *) buf) != 0); + + return FALSE; +} + +static int ZeroDataBlock = FALSE; + +static int +GetDataBlock(SDL_RWops *src, unsigned char *buf) +{ + unsigned char count; + + if (!ReadOK(src, &count, 1)) { + /* pm_message("error in getting DataBlock size" ); */ + return -1; + } + ZeroDataBlock = count == 0; + + if ((count != 0) && (!ReadOK(src, buf, count))) { + /* pm_message("error in reading DataBlock" ); */ + return -1; + } + return count; +} + +static int +GetCode(SDL_RWops *src, int code_size, int flag) +{ + static unsigned char buf[280]; + static int curbit, lastbit, done, last_byte; + int i, j, ret; + unsigned char count; + + if (flag) { + curbit = 0; + lastbit = 0; + done = FALSE; + return 0; + } + if ((curbit + code_size) >= lastbit) { + if (done) { + if (curbit >= lastbit) + RWSetMsg("ran off the end of my bits"); + return -1; + } + buf[0] = buf[last_byte - 2]; + buf[1] = buf[last_byte - 1]; + + if ((count = GetDataBlock(src, &buf[2])) == 0) + done = TRUE; + + last_byte = 2 + count; + curbit = (curbit - lastbit) + 16; + lastbit = (2 + count) * 8; + } + ret = 0; + for (i = curbit, j = 0; j < code_size; ++i, ++j) + ret |= ((buf[i / 8] & (1 << (i % 8))) != 0) << j; + + curbit += code_size; + + return ret; +} + +static int +LWZReadByte(SDL_RWops *src, int flag, int input_code_size) +{ + static int fresh = FALSE; + int code, incode; + static int code_size, set_code_size; + static int max_code, max_code_size; + static int firstcode, oldcode; + static int clear_code, end_code; + static int table[2][(1 << MAX_LWZ_BITS)]; + static int stack[(1 << (MAX_LWZ_BITS)) * 2], *sp; + register int i; + + if (flag) { + set_code_size = input_code_size; + code_size = set_code_size + 1; + clear_code = 1 << set_code_size; + end_code = clear_code + 1; + max_code_size = 2 * clear_code; + max_code = clear_code + 2; + + GetCode(src, 0, TRUE); + + fresh = TRUE; + + for (i = 0; i < clear_code; ++i) { + table[0][i] = 0; + table[1][i] = i; + } + for (; i < (1 << MAX_LWZ_BITS); ++i) + table[0][i] = table[1][0] = 0; + + sp = stack; + + return 0; + } else if (fresh) { + fresh = FALSE; + do { + firstcode = oldcode = GetCode(src, code_size, FALSE); + } while (firstcode == clear_code); + return firstcode; + } + if (sp > stack) + return *--sp; + + while ((code = GetCode(src, code_size, FALSE)) >= 0) { + if (code == clear_code) { + for (i = 0; i < clear_code; ++i) { + table[0][i] = 0; + table[1][i] = i; + } + for (; i < (1 << MAX_LWZ_BITS); ++i) + table[0][i] = table[1][i] = 0; + code_size = set_code_size + 1; + max_code_size = 2 * clear_code; + max_code = clear_code + 2; + sp = stack; + firstcode = oldcode = GetCode(src, code_size, FALSE); + return firstcode; + } else if (code == end_code) { + int count; + unsigned char buf[260]; + + if (ZeroDataBlock) + return -2; + + while ((count = GetDataBlock(src, buf)) > 0); + + if (count != 0) { + /* + * pm_message("missing EOD in data stream (common occurence)"); + */ + } + return -2; + } + incode = code; + + if (code >= max_code) { + *sp++ = firstcode; + code = oldcode; + } + while (code >= clear_code) { + *sp++ = table[1][code]; + if (code == table[0][code]) + RWSetMsg("circular table entry BIG ERROR"); + code = table[0][code]; + } + + *sp++ = firstcode = table[1][code]; + + if ((code = max_code) < (1 << MAX_LWZ_BITS)) { + table[0][code] = oldcode; + table[1][code] = firstcode; + ++max_code; + if ((max_code >= max_code_size) && + (max_code_size < (1 << MAX_LWZ_BITS))) { + max_code_size *= 2; + ++code_size; + } + } + oldcode = incode; + + if (sp > stack) + return *--sp; + } + return code; +} + +static Image * +ReadImage(SDL_RWops * src, int len, int height, int cmapSize, + unsigned char cmap[3][MAXCOLORMAPSIZE], + int gray, int interlace, int ignore) +{ + Image *image; + unsigned char c; + int i, v; + int xpos = 0, ypos = 0, pass = 0; + + /* + ** Initialize the compression routines + */ + if (!ReadOK(src, &c, 1)) { + RWSetMsg("EOF / read error on image data"); + return NULL; + } + if (LWZReadByte(src, TRUE, c) < 0) { + RWSetMsg("error reading image"); + return NULL; + } + /* + ** If this is an "uninteresting picture" ignore it. + */ + if (ignore) { + while (LWZReadByte(src, FALSE, c) >= 0); + return NULL; + } + image = ImageNewCmap(len, height, cmapSize); + + for (i = 0; i < cmapSize; i++) + ImageSetCmap(image, i, cmap[CM_RED][i], + cmap[CM_GREEN][i], cmap[CM_BLUE][i]); + + while ((v = LWZReadByte(src, FALSE, c)) >= 0) { +#ifdef USED_BY_SDL + ((Uint8 *)image->pixels)[xpos + ypos * image->pitch] = v; +#else + image->data[xpos + ypos * len] = v; +#endif + ++xpos; + if (xpos == len) { + xpos = 0; + if (interlace) { + switch (pass) { + case 0: + case 1: + ypos += 8; + break; + case 2: + ypos += 4; + break; + case 3: + ypos += 2; + break; + } + + if (ypos >= height) { + ++pass; + switch (pass) { + case 1: + ypos = 4; + break; + case 2: + ypos = 2; + break; + case 3: + ypos = 1; + break; + default: + goto fini; + } + } + } else { + ++ypos; + } + } + if (ypos >= height) + break; + } + + fini: + + return image; +} + +#else + +/* See if an image is contained in a data source */ +int IMG_isGIF(SDL_RWops *src) +{ + return(0); +} + +/* Load a GIF type image from an SDL datasource */ +SDL_Surface *IMG_LoadGIF_RW(SDL_RWops *src) +{ + return(NULL); +} + +#endif /* LOAD_GIF */ diff --git a/src/image/sublib/SDL.h b/src/image/sublib/SDL.h new file mode 100644 index 0000000..a48b0ac --- /dev/null +++ b/src/image/sublib/SDL.h @@ -0,0 +1,12 @@ +#ifndef SDL_H + +#define SDL_H + +// SDL main header (dummy file) for compatibility + +#include "SDL_types.h" +#include "SDL_error.h" +#include "SDL_rwops.h" +#include "SDL_video.h" + +#endif diff --git a/src/image/sublib/SDL_error.c b/src/image/sublib/SDL_error.c new file mode 100644 index 0000000..c068b58 --- /dev/null +++ b/src/image/sublib/SDL_error.c @@ -0,0 +1,56 @@ +/* + Copyright (C) 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org + + Modified for using with XNC image engine by Leo + 26-03-2002. +*/ + +#include "SDL.h" + +/* Very common errors go here */ +void SDL_Error(SDL_errorcode code) +{ + switch (code) { + case SDL_ENOMEM: + SDL_SetError("Out of memory"); + break; + case SDL_EFREAD: + SDL_SetError("Error reading from datastream"); + break; + case SDL_EFWRITE: + SDL_SetError("Error writing to datastream"); + break; + case SDL_EFSEEK: + SDL_SetError("Error seeking in datastream"); + break; + default: + SDL_SetError("Unknown SDL error"); + break; + } +} + +void SDL_SetError (const char *fmt, ...) +{ + fprintf(stderr, "SDL_error: %s\n",fmt); +} + +void SDL_ClearError(void) +{ +} diff --git a/src/image/sublib/SDL_error.h b/src/image/sublib/SDL_error.h new file mode 100644 index 0000000..fd8228d --- /dev/null +++ b/src/image/sublib/SDL_error.h @@ -0,0 +1,62 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id: SDL_error.h,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $"; +#endif + +/* Simple error message routines for SDL */ + +#ifndef _SDL_error_h +#define _SDL_error_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Public functions */ +extern DECLSPEC void SDL_SetError(const char *fmt, ...); +extern DECLSPEC char * SDL_GetError(void); +extern DECLSPEC void SDL_ClearError(void); + +/* Private error message function - used internally */ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +typedef enum { + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_LASTERROR +} SDL_errorcode; +extern void SDL_Error(SDL_errorcode code); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_error_h */ diff --git a/src/image/sublib/SDL_image.h b/src/image/sublib/SDL_image.h new file mode 100644 index 0000000..60ce9cc --- /dev/null +++ b/src/image/sublib/SDL_image.h @@ -0,0 +1,94 @@ +/* + SDL_image: An example image loading library for use with SDL + Copyright (C) 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* $Id: SDL_image.h,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ */ + +/* A simple library to load images of various formats as SDL surfaces */ + +#ifndef _IMG_h +#define _IMG_h + +#include "SDL.h" +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Load an image from an SDL data source. + The 'type' may be one of: "BMP", "GIF", "PNG", etc. + + If the image format supports a transparent pixel, SDL will set the + colorkey for the surface. You can enable RLE acceleration on the + surface afterwards by calling: + SDL_SetColorKey(image, SDL_RLEACCEL, image->format->colorkey); + */ +extern DECLSPEC SDL_Surface *IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, + char *type); +/* Convenience functions */ +extern DECLSPEC SDL_Surface *IMG_Load(const char *file); +extern DECLSPEC SDL_Surface *IMG_Load_RW(SDL_RWops *src, int freesrc); + +/* Invert the alpha of a surface for use with OpenGL + This function is now a no-op, and only provided for backwards compatibility. +*/ +extern DECLSPEC int IMG_InvertAlpha(int on); + +/* Functions to detect a file type, given a seekable source */ +extern DECLSPEC int IMG_isBMP(SDL_RWops *src); +extern DECLSPEC int IMG_isPNM(SDL_RWops *src); +extern DECLSPEC int IMG_isXPM(SDL_RWops *src); +extern DECLSPEC int IMG_isXCF(SDL_RWops *src); +extern DECLSPEC int IMG_isPCX(SDL_RWops *src); +extern DECLSPEC int IMG_isGIF(SDL_RWops *src); +extern DECLSPEC int IMG_isJPG(SDL_RWops *src); +extern DECLSPEC int IMG_isTIF(SDL_RWops *src); +extern DECLSPEC int IMG_isPNG(SDL_RWops *src); +extern DECLSPEC int IMG_isLBM(SDL_RWops *src); + +/* Individual loading functions */ +extern DECLSPEC SDL_Surface *IMG_LoadBMP_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadPNM_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadXCF_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadPCX_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadGIF_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadJPG_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadTIF_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadTGA_RW(SDL_RWops *src); +extern DECLSPEC SDL_Surface *IMG_LoadLBM_RW(SDL_RWops *src); + +extern DECLSPEC SDL_Surface *IMG_ReadXPMFromArray(char **xpm); + +/* We'll use SDL for reporting errors */ +#define IMG_SetError SDL_SetError +#define IMG_GetError SDL_GetError + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _IMG_h */ diff --git a/src/image/sublib/SDL_mutex.h b/src/image/sublib/SDL_mutex.h new file mode 100644 index 0000000..6737407 --- /dev/null +++ b/src/image/sublib/SDL_mutex.h @@ -0,0 +1,8 @@ +#ifndef SDL_MUTEX_H +#define SDL_MUTEX_H + +// Dummy file created by Leo for compatibility +// Need for compile SDL part of files for XNC +// Leo 25-03-2002 + +#endif diff --git a/src/image/sublib/SDL_rwops.c b/src/image/sublib/SDL_rwops.c new file mode 100644 index 0000000..6c2b076 --- /dev/null +++ b/src/image/sublib/SDL_rwops.c @@ -0,0 +1,275 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id: SDL_rwops.c,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $"; +#endif + +/* This file provides a general interface for SDL to read and write + data sources. It can easily be extended to files, memory, etc. +*/ + +#include +#include +#include + +#include "SDL_error.h" +#include "SDL_rwops.h" + +/* Functions to read/write stdio file pointers */ + +static int stdio_seek(SDL_RWops *context, int offset, int whence) +{ + if ( fseek(context->hidden.stdio.fp, offset, whence) == 0 ) { + return(ftell(context->hidden.stdio.fp)); + } else { + SDL_Error(SDL_EFSEEK); + return(-1); + } +} +static int stdio_read(SDL_RWops *context, void *ptr, int size, int maxnum) +{ + size_t nread; + + nread = fread(ptr, size, maxnum, context->hidden.stdio.fp); + if ( nread == 0 && ferror(context->hidden.stdio.fp) ) { + SDL_Error(SDL_EFREAD); + } + return(nread); +} +static int stdio_write(SDL_RWops *context, const void *ptr, int size, int num) +{ + size_t nwrote; + + nwrote = fwrite(ptr, size, num, context->hidden.stdio.fp); + if ( nwrote == 0 && ferror(context->hidden.stdio.fp) ) { + SDL_Error(SDL_EFWRITE); + } + return(nwrote); +} +static int stdio_close(SDL_RWops *context) +{ + if ( context ) { + if ( context->hidden.stdio.autoclose ) { + /* WARNING: Check the return value here! */ + fclose(context->hidden.stdio.fp); + } + free(context); + } + return(0); +} + +/* Functions to read/write memory pointers */ + +static int mem_seek(SDL_RWops *context, int offset, int whence) +{ + Uint8 *newpos; + + switch (whence) { + case SEEK_SET: + newpos = context->hidden.mem.base+offset; + break; + case SEEK_CUR: + newpos = context->hidden.mem.here+offset; + break; + case SEEK_END: + newpos = context->hidden.mem.stop+offset; + break; + default: + SDL_SetError("Unknown value for 'whence'"); + return(-1); + } + if ( newpos < context->hidden.mem.base ) { + newpos = context->hidden.mem.base; + } + if ( newpos > context->hidden.mem.stop ) { + newpos = context->hidden.mem.stop; + } + context->hidden.mem.here = newpos; + return(context->hidden.mem.here-context->hidden.mem.base); +} +static int mem_read(SDL_RWops *context, void *ptr, int size, int maxnum) +{ + int num; + + num = maxnum; + if ( (context->hidden.mem.here + (num*size)) > context->hidden.mem.stop ) { + num = (context->hidden.mem.stop-context->hidden.mem.here)/size; + } + memcpy(ptr, context->hidden.mem.here, num*size); + context->hidden.mem.here += num*size; + return(num); +} +static int mem_write(SDL_RWops *context, const void *ptr, int size, int num) +{ + if ( (context->hidden.mem.here + (num*size)) > context->hidden.mem.stop ) { + num = (context->hidden.mem.stop-context->hidden.mem.here)/size; + } + memcpy(context->hidden.mem.here, ptr, num*size); + context->hidden.mem.here += num*size; + return(num); +} +static int mem_close(SDL_RWops *context) +{ + if ( context ) { + free(context); + } + return(0); +} + +/* Functions to create SDL_RWops structures from various data sources */ +#ifdef WIN32 +/* Aggh. You can't (apparently) open a file in an application and + read from it in a DLL. +*/ +static int in_sdl = 0; +#endif + +#ifdef macintosh +/* + * translate unix-style slash-separated filename to mac-style colon-separated + * name; return malloced string + */ +static char *unix_to_mac(const char *file) +{ + int flen = strlen(file); + char *path = malloc(flen + 2); + const char *src = file; + char *dst = path; + if(*src == '/') { + /* really depends on filesystem layout, hope for the best */ + src++; + } else { + /* Check if this is a MacOS path to begin with */ + if(*src != ':') + *dst++ = ':'; /* relative paths begin with ':' */ + } + while(src < file + flen) { + const char *end = strchr(src, '/'); + int len; + if(!end) + end = file + flen; /* last component */ + len = end - src; + if(len == 0 || (len == 1 && src[0] == '.')) { + /* remove repeated slashes and . */ + } else { + if(len == 2 && src[0] == '.' && src[1] == '.') { + /* replace .. with the empty string */ + } else { + memcpy(dst, src, len); + dst += len; + } + if(end < file + flen) + *dst++ = ':'; + } + src = end + 1; + } + *dst++ = '\0'; + return path; +} +#endif /* macintosh */ + +SDL_RWops *SDL_RWFromFile(const char *file, const char *mode) +{ + FILE *fp; + SDL_RWops *rwops; + + rwops = NULL; + +#ifdef macintosh + { + char *mpath = unix_to_mac(file); + fp = fopen(mpath, mode); + free(mpath); + } +#else + fp = fopen(file, mode); +#endif + if ( fp == NULL ) { + SDL_SetError("Couldn't open %s", file); + } else { +#ifdef WIN32 + in_sdl = 1; + rwops = SDL_RWFromFP(fp, 1); + in_sdl = 0; +#else + rwops = SDL_RWFromFP(fp, 1); +#endif + } + return(rwops); +} + +SDL_RWops *SDL_RWFromFP(FILE *fp, int autoclose) +{ + SDL_RWops *rwops; + +#ifdef WIN32 + if ( ! in_sdl ) { + SDL_SetError("You can't pass a FILE pointer to a DLL (??)"); + /*return(NULL);*/ + } +#endif + rwops = SDL_AllocRW(); + if ( rwops != NULL ) { + rwops->seek = stdio_seek; + rwops->read = stdio_read; + rwops->write = stdio_write; + rwops->close = stdio_close; + rwops->hidden.stdio.fp = fp; + rwops->hidden.stdio.autoclose = autoclose; + } + return(rwops); +} + +SDL_RWops *SDL_RWFromMem(void *mem, int size) +{ + SDL_RWops *rwops; + + rwops = SDL_AllocRW(); + if ( rwops != NULL ) { + rwops->seek = mem_seek; + rwops->read = mem_read; + rwops->write = mem_write; + rwops->close = mem_close; + rwops->hidden.mem.base = (Uint8 *)mem; + rwops->hidden.mem.here = rwops->hidden.mem.base; + rwops->hidden.mem.stop = rwops->hidden.mem.base+size; + } + return(rwops); +} + +SDL_RWops *SDL_AllocRW(void) +{ + SDL_RWops *area; + + area = (SDL_RWops *)malloc(sizeof *area); + if ( area == NULL ) { + SDL_OutOfMemory(); + } + return(area); +} + +void SDL_FreeRW(SDL_RWops *area) +{ + free(area); +} diff --git a/src/image/sublib/SDL_rwops.h b/src/image/sublib/SDL_rwops.h new file mode 100644 index 0000000..8e23340 --- /dev/null +++ b/src/image/sublib/SDL_rwops.h @@ -0,0 +1,113 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id: SDL_rwops.h,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $"; +#endif + +/* This file provides a general interface for SDL to read and write + data sources. It can easily be extended to files, memory, etc. +*/ + +#ifndef _SDL_RWops_h +#define _SDL_RWops_h + +#include + +#include "SDL_types.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* This is the read/write operation structure -- very basic */ + +typedef struct SDL_RWops { + /* Seek to 'offset' relative to whence, one of stdio's whence values: + SEEK_SET, SEEK_CUR, SEEK_END + Returns the final offset in the data source. + */ + int (*seek)(struct SDL_RWops *context, int offset, int whence); + + /* Read up to 'num' objects each of size 'objsize' from the data + source to the area pointed at by 'ptr'. + Returns the number of objects read, or -1 if the read failed. + */ + int (*read)(struct SDL_RWops *context, void *ptr, int size, int maxnum); + + /* Write exactly 'num' objects each of size 'objsize' from the area + pointed at by 'ptr' to data source. + Returns 'num', or -1 if the write failed. + */ + int (*write)(struct SDL_RWops *context, const void *ptr, int size, int num); + + /* Close and free an allocated SDL_FSops structure */ + int (*close)(struct SDL_RWops *context); + + Uint32 type; + union { + struct { + int autoclose; + FILE *fp; + } stdio; + struct { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct { + void *data1; + } unknown; + } hidden; + +} SDL_RWops; + + +/* Functions to create SDL_RWops structures from various data sources */ + +extern DECLSPEC SDL_RWops * SDL_RWFromFile(const char *file, const char *mode); + +extern DECLSPEC SDL_RWops * SDL_RWFromFP(FILE *fp, int autoclose); + +extern DECLSPEC SDL_RWops * SDL_RWFromMem(void *mem, int size); + +extern DECLSPEC SDL_RWops * SDL_AllocRW(void); +extern DECLSPEC void SDL_FreeRW(SDL_RWops *area); + +/* Macros to easily read and write from an SDL_RWops structure */ +#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) +#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, SEEK_CUR) +#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) +#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) +#define SDL_RWclose(ctx) (ctx)->close(ctx) + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_RWops_h */ diff --git a/src/image/sublib/SDL_surface.c b/src/image/sublib/SDL_surface.c new file mode 100644 index 0000000..9b25e3c --- /dev/null +++ b/src/image/sublib/SDL_surface.c @@ -0,0 +1,331 @@ + +#include "SDL.h" + + +/* + * Calculate the pad-aligned scanline width of a surface + */ +Uint16 SDL_CalculatePitch(SDL_Surface *surface) +{ + Uint16 pitch; + + /* Surface should be 4-byte aligned for speed */ + pitch = surface->w*surface->format->BytesPerPixel; + switch (surface->format->BitsPerPixel) + { + case 1: + pitch = (pitch+7)/8; + break; + case 4: + pitch = (pitch+1)/2; + break; + default: + break; + } + pitch = (pitch + 3) & ~3; /* 4-byte aligning */ + return(pitch); +} + +/* + * Free a previously allocated format structure + */ +void SDL_FreeFormat(SDL_PixelFormat *format) +{ + if ( format ) + { + if ( format->palette ) + { + if ( format->palette->colors ) + { + free(format->palette->colors); + } + free(format->palette); + } + free(format); + } +} + +/* Helper functions */ +/* + * Allocate a pixel format structure and fill it according to the given info. + */ +SDL_PixelFormat *SDL_AllocFormat(int bpp, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) +{ + SDL_PixelFormat *format; + Uint32 mask; + + /* Allocate an empty pixel format structure */ + format = (SDL_PixelFormat*)malloc(sizeof(*format)); + if ( format == NULL ) { + SDL_OutOfMemory(); + return(NULL); + } + memset(format, 0, sizeof(*format)); + format->alpha = SDL_ALPHA_OPAQUE; + + /* Set up the format */ + format->BitsPerPixel = bpp; + format->BytesPerPixel = (bpp+7)/8; + switch (bpp) { + case 1: + /* Create the 2 color black-white palette */ + format->palette = (SDL_Palette *)malloc( + sizeof(SDL_Palette)); + if ( format->palette == NULL ) { + SDL_FreeFormat(format); + SDL_OutOfMemory(); + return(NULL); + } + (format->palette)->ncolors = 2; + (format->palette)->colors = (SDL_Color *)malloc( + (format->palette)->ncolors*sizeof(SDL_Color)); + if ( (format->palette)->colors == NULL ) { + SDL_FreeFormat(format); + SDL_OutOfMemory(); + return(NULL); + } + format->palette->colors[0].r = 0xFF; + format->palette->colors[0].g = 0xFF; + format->palette->colors[0].b = 0xFF; + format->palette->colors[1].r = 0x00; + format->palette->colors[1].g = 0x00; + format->palette->colors[1].b = 0x00; + format->Rloss = 8; + format->Gloss = 8; + format->Bloss = 8; + format->Aloss = 8; + format->Rshift = 0; + format->Gshift = 0; + format->Bshift = 0; + format->Ashift = 0; + format->Rmask = 0; + format->Gmask = 0; + format->Bmask = 0; + format->Amask = 0; + break; + + case 4: + /* Create the 16 color VGA palette */ + format->palette = (SDL_Palette *)malloc( + sizeof(SDL_Palette)); + if ( format->palette == NULL ) { + SDL_FreeFormat(format); + SDL_OutOfMemory(); + return(NULL); + } + (format->palette)->ncolors = 16; + (format->palette)->colors = (SDL_Color *)malloc( + (format->palette)->ncolors*sizeof(SDL_Color)); + if ( (format->palette)->colors == NULL ) { + SDL_FreeFormat(format); + SDL_OutOfMemory(); + return(NULL); + } + /* Punt for now, will this ever be used? */ + memset((format->palette)->colors, 0, + (format->palette)->ncolors*sizeof(SDL_Color)); + + /* Palettized formats have no mask info */ + format->Rloss = 8; + format->Gloss = 8; + format->Bloss = 8; + format->Aloss = 8; + format->Rshift = 0; + format->Gshift = 0; + format->Bshift = 0; + format->Ashift = 0; + format->Rmask = 0; + format->Gmask = 0; + format->Bmask = 0; + format->Amask = 0; + break; + + case 8: + /* Create an empty 256 color palette */ + format->palette = (SDL_Palette *)malloc( + sizeof(SDL_Palette)); + if ( format->palette == NULL ) { + SDL_FreeFormat(format); + SDL_OutOfMemory(); + return(NULL); + } + (format->palette)->ncolors = 256; + (format->palette)->colors = (SDL_Color *)malloc( + (format->palette)->ncolors*sizeof(SDL_Color)); + if ( (format->palette)->colors == NULL ) { + SDL_FreeFormat(format); + SDL_OutOfMemory(); + return(NULL); + } + memset((format->palette)->colors, 0, + (format->palette)->ncolors*sizeof(SDL_Color)); + + /* Palettized formats have no mask info */ + format->Rloss = 8; + format->Gloss = 8; + format->Bloss = 8; + format->Aloss = 8; + format->Rshift = 0; + format->Gshift = 0; + format->Bshift = 0; + format->Ashift = 0; + format->Rmask = 0; + format->Gmask = 0; + format->Bmask = 0; + format->Amask = 0; + break; + + default: + /* No palette, just packed pixel info */ + format->palette = NULL; + format->Rshift = 0; + format->Rloss = 8; + if ( Rmask ) { + for ( mask = Rmask; !(mask&0x01); mask >>= 1 ) + ++format->Rshift; + for ( ; (mask&0x01); mask >>= 1 ) + --format->Rloss; + } + format->Gshift = 0; + format->Gloss = 8; + if ( Gmask ) { + for ( mask = Gmask; !(mask&0x01); mask >>= 1 ) + ++format->Gshift; + for ( ; (mask&0x01); mask >>= 1 ) + --format->Gloss; + } + format->Bshift = 0; + format->Bloss = 8; + if ( Bmask ) { + for ( mask = Bmask; !(mask&0x01); mask >>= 1 ) + ++format->Bshift; + for ( ; (mask&0x01); mask >>= 1 ) + --format->Bloss; + } + format->Ashift = 0; + format->Aloss = 8; + if ( Amask ) { + for ( mask = Amask; !(mask&0x01); mask >>= 1 ) + ++format->Ashift; + for ( ; (mask&0x01); mask >>= 1 ) + --format->Aloss; + } + format->Rmask = Rmask; + format->Gmask = Gmask; + format->Bmask = Bmask; + format->Amask = Amask; + break; + } + /* Calculate some standard bitmasks, if necessary + * Note: This could conflict with an alpha mask, if given. + */ + if ( (bpp > 8) && !format->Rmask && !format->Gmask && !format->Bmask ) { + /* R-G-B */ + if ( bpp > 24 ) + bpp = 24; + format->Rloss = 8-(bpp/3); + format->Gloss = 8-(bpp/3)-(bpp%3); + format->Bloss = 8-(bpp/3); + format->Rshift = ((bpp/3)+(bpp%3))+(bpp/3); + format->Gshift = (bpp/3); + format->Bshift = 0; + format->Rmask = ((0xFF>>format->Rloss)<Rshift); + format->Gmask = ((0xFF>>format->Gloss)<Gshift); + format->Bmask = ((0xFF>>format->Bloss)<Bshift); + } + return(format); +} + +/* + * Free a surface created by the above function. + */ +void SDL_FreeSurface (SDL_Surface *surface) +{ + /* Free anything that's not NULL, and not the screen surface */ + if (surface == NULL) + { + return; + } + if ( --surface->refcount > 0 ) { + return; + } + if ( surface->format ) + { + SDL_FreeFormat(surface->format); + surface->format = NULL; + } + if ( surface->pixels && + ((surface->flags & SDL_PREALLOC) != SDL_PREALLOC) ) + { + free(surface->pixels); + } + free(surface); +} + + + +/* Public routines */ +/* + * Create an empty RGB surface of the appropriate depth + */ +SDL_Surface * SDL_CreateRGBSurface (Uint32 flags, + int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) +{ + SDL_Surface *surface; + + flags &= ~SDL_HWSURFACE; + + /* Allocate the surface */ + surface = (SDL_Surface *)malloc(sizeof(*surface)); + if ( surface == NULL ) + { + return(NULL); + } + surface->flags = SDL_SWSURFACE; + + surface->format = SDL_AllocFormat(depth, Rmask, Gmask, Bmask, Amask); + + if ( surface->format == NULL ) + { + free(surface); + return(NULL); + } + if ( Amask ) + { + surface->flags |= SDL_SRCALPHA; + } + surface->w = width; + surface->h = height; + surface->pitch = SDL_CalculatePitch(surface); + surface->pixels = NULL; + surface->offset = 0; + // surface->hwdata = NULL; + // surface->locked = 0; + // surface->map = NULL; + surface->format_version = 0; + + if ( surface->w && surface->h ) + { + surface->pixels = (void*)malloc(surface->h*surface->pitch); + if ( surface->pixels == NULL ) + { + SDL_FreeSurface(surface); + return(NULL); + } + /* This is important for bitmaps */ + memset(surface->pixels, 0, surface->h*surface->pitch); + } + + /* The surface is ready to go */ + surface->refcount = 1; + return(surface); +} + +int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key) +{ + return 0; +} + + diff --git a/src/image/sublib/SDL_to_picinfo.c b/src/image/sublib/SDL_to_picinfo.c new file mode 100644 index 0000000..5a2493b --- /dev/null +++ b/src/image/sublib/SDL_to_picinfo.c @@ -0,0 +1,64 @@ +#define JPEG_IMAGES +#include "SDL.h" +#include "picinfo.h" +#include "SDL_image.h" + +void im_sdl_surface_to_picinfo(SDL_Surface* surface, PICINFO* pic) +{ + int i; + + pic->w=surface->w; + pic->h=surface->h; + + if(surface->format->BytesPerPixel==1) + { + pic->type=PIC8; + pic->pic=(byte*)surface->pixels; + surface->pixels=0; + for(i=0;i<256;i++) + { + pic->pal[i*3] =surface->format->palette->colors[i].r; + pic->pal[i*3+1]=surface->format->palette->colors[i].g; + pic->pal[i*3+2]=surface->format->palette->colors[i].b; + } + SDL_FreeSurface(surface); + } + else + { + pic->type=PIC24; + pic->pic=(byte*)surface->pixels; + surface->pixels=0; + SDL_FreeSurface(surface); + } +} + +int im_load_image_through_loader(char* fname, PICINFO* to_pic, + int from_mem_size, + SDL_Surface* (*img_loader)(SDL_RWops*)) +{ + SDL_RWops *rw; + SDL_Surface *surface; + + if(!from_mem_size) + rw=SDL_RWFromFile(fname,"rb"); + else + rw=SDL_RWFromMem((void*)fname, from_mem_size); + + surface=img_loader(rw); + + SDL_FreeRW(rw); + + im_sdl_surface_to_picinfo(surface,to_pic); + + return 1; +} + +/******************************************************************/ + +int im_load_gif(char* fname, PICINFO* to_pic, int from_mem_size) +{ + + return im_load_image_through_loader(fname,to_pic, + from_mem_size,IMG_LoadGIF_RW); +} + diff --git a/src/image/sublib/SDL_types.h b/src/image/sublib/SDL_types.h new file mode 100644 index 0000000..f5cb43d --- /dev/null +++ b/src/image/sublib/SDL_types.h @@ -0,0 +1,92 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id: SDL_types.h,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $"; +#endif + +/* General data types used by the SDL library */ + +#ifndef _SDL_types_h +#define _SDL_types_h + +/* The number of elements in a table */ +#define SDL_TABLESIZE(table) (sizeof(table)/sizeof(table[0])) + +/* Basic data types */ +typedef enum { + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; +typedef unsigned char Uint8; +typedef signed char Sint8; +typedef unsigned short Uint16; +typedef signed short Sint16; +typedef unsigned int Uint32; +typedef signed int Sint32; + +/* Figure out how to support 64-bit datatypes */ +#if !defined(__STRICT_ANSI__) +#if defined(__GNUC__) || defined(__MWERKS__) || defined(__SUNPRO_C) +#define SDL_HAS_64BIT_TYPE long long +#elif defined(_MSC_VER) /* VC++ */ +#define SDL_HAS_64BIT_TYPE __int64 +#endif +#endif /* !__STRICT_ANSI__ */ + +/* The 64-bit type isn't available on EPOC/Symbian OS */ +#ifdef __SYMBIAN32__ +#undef SDL_HAS_64BIT_TYPE +#endif + +/* The 64-bit datatype isn't supported on all platforms */ +#ifdef SDL_HAS_64BIT_TYPE +typedef unsigned SDL_HAS_64BIT_TYPE Uint64; +typedef SDL_HAS_64BIT_TYPE Sint64; +#else +/* This is really just a hack to prevent the compiler from complaining */ +typedef struct { + Uint32 hi; + Uint32 lo; +} Uint64, Sint64; +#endif + +/* Make sure the types really have the right sizes */ +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_dummy_ ## name[(x) * 2 - 1] + +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); + +#undef SDL_COMPILE_TIME_ASSERT + +/* General keyboard/mouse state definitions */ +enum { SDL_PRESSED = 0x01, SDL_RELEASED = 0x00 }; + +#endif diff --git a/src/image/sublib/SDL_video.h b/src/image/sublib/SDL_video.h new file mode 100644 index 0000000..ae6a9e5 --- /dev/null +++ b/src/image/sublib/SDL_video.h @@ -0,0 +1,891 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id: SDL_video.h,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $"; +#endif + +/* Header file for access to the SDL raw framebuffer window */ + +#ifndef _SDL_video_h +#define _SDL_video_h + +#include + +#include "SDL_types.h" +#include "SDL_mutex.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Transparency definitions: These define alpha as the opacity of a surface */ +#define SDL_ALPHA_OPAQUE 255 +#define SDL_ALPHA_TRANSPARENT 0 + +/* Useful data types */ +typedef struct { + Sint16 x, y; + Uint16 w, h; +} SDL_Rect; + +typedef struct { + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 unused; +} SDL_Color; + +typedef struct { + int ncolors; + SDL_Color *colors; +} SDL_Palette; + +/* Everything in the pixel format structure is read-only */ +typedef struct SDL_PixelFormat { + SDL_Palette *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + + /* RGB color key information */ + Uint32 colorkey; + /* Alpha value information (per-surface alpha) */ + Uint8 alpha; +} SDL_PixelFormat; + +/* typedef for private surface blitting functions */ +struct SDL_Surface; +typedef int (*SDL_blit)(struct SDL_Surface *src, SDL_Rect *srcrect, + struct SDL_Surface *dst, SDL_Rect *dstrect); + +/* This structure should be treated as read-only, except for 'pixels', + which, if not NULL, contains the raw pixel data for the surface. +*/ +typedef struct SDL_Surface { + Uint32 flags; /* Read-only */ + SDL_PixelFormat *format; /* Read-only */ + int w, h; /* Read-only */ + Uint16 pitch; /* Read-only */ + void *pixels; /* Read-write */ + int offset; /* Private */ + + /* Hardware-specific surface info */ + // struct private_hwdata *hwdata; + + /* clipping information */ + // SDL_Rect clip_rect; /* Read-only */ + Uint32 unused1; /* for binary compatibility */ + + /* Allow recursive locks */ + // Uint32 locked; /* Private */ + + /* info for fast blit mapping to other surfaces */ + // struct SDL_BlitMap *map; /* Private */ + + /* format version, bumped at every change to invalidate blit maps */ + unsigned int format_version; /* Private */ + + /* Reference count -- used when freeing surface */ + int refcount; /* Read-mostly */ +} SDL_Surface; + +/* These are the currently supported flags for the SDL_surface */ +/* Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ +#define SDL_SWSURFACE 0x00000000 /* Surface is in system memory */ +#define SDL_HWSURFACE 0x00000001 /* Surface is in video memory */ +#define SDL_ASYNCBLIT 0x00000004 /* Use asynchronous blits if possible */ +/* Available for SDL_SetVideoMode() */ +#define SDL_ANYFORMAT 0x10000000 /* Allow any video depth/pixel-format */ +#define SDL_HWPALETTE 0x20000000 /* Surface has exclusive palette */ +#define SDL_DOUBLEBUF 0x40000000 /* Set up double-buffered video mode */ +#define SDL_FULLSCREEN 0x80000000 /* Surface is a full screen display */ +#define SDL_OPENGL 0x00000002 /* Create an OpenGL rendering context */ +#define SDL_OPENGLBLIT 0x0000000A /* Create an OpenGL rendering context and use it for blitting */ +#define SDL_RESIZABLE 0x00000010 /* This video mode may be resized */ +#define SDL_NOFRAME 0x00000020 /* No window caption or edge frame */ +/* Used internally (read-only) */ +#define SDL_HWACCEL 0x00000100 /* Blit uses hardware acceleration */ +#define SDL_SRCCOLORKEY 0x00001000 /* Blit uses a source color key */ +#define SDL_RLEACCELOK 0x00002000 /* Private flag */ +#define SDL_RLEACCEL 0x00004000 /* Surface is RLE encoded */ +#define SDL_SRCALPHA 0x00010000 /* Blit uses source alpha blending */ +#define SDL_PREALLOC 0x01000000 /* Surface uses preallocated memory */ + +/* Evaluates to true if the surface needs to be locked before access */ +#define SDL_MUSTLOCK(surface) \ + (surface->offset || \ + ((surface->flags & (SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_RLEACCEL)) != 0)) + + +/* Useful for determining the video hardware capabilities */ +typedef struct { + Uint32 hw_available :1; /* Flag: Can you create hardware surfaces? */ + Uint32 wm_available :1; /* Flag: Can you talk to a window manager? */ + Uint32 UnusedBits1 :6; + Uint32 UnusedBits2 :1; + Uint32 blit_hw :1; /* Flag: Accelerated blits HW --> HW */ + Uint32 blit_hw_CC :1; /* Flag: Accelerated blits with Colorkey */ + Uint32 blit_hw_A :1; /* Flag: Accelerated blits with Alpha */ + Uint32 blit_sw :1; /* Flag: Accelerated blits SW --> HW */ + Uint32 blit_sw_CC :1; /* Flag: Accelerated blits with Colorkey */ + Uint32 blit_sw_A :1; /* Flag: Accelerated blits with Alpha */ + Uint32 blit_fill :1; /* Flag: Accelerated color fill */ + Uint32 UnusedBits3 :16; + Uint32 video_mem; /* The total amount of video memory (in K) */ + SDL_PixelFormat *vfmt; /* Value: The format of the video surface */ +} SDL_VideoInfo; + + +/* The most common video overlay formats. + For an explanation of these pixel formats, see: + http://www.webartz.com/fourcc/indexyuv.htm + + For information on the relationship between color spaces, see: + http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html + */ +#define SDL_YV12_OVERLAY 0x32315659 /* Planar mode: Y + V + U (3 planes) */ +#define SDL_IYUV_OVERLAY 0x56555949 /* Planar mode: Y + U + V (3 planes) */ +#define SDL_YUY2_OVERLAY 0x32595559 /* Packed mode: Y0+U0+Y1+V0 (1 plane) */ +#define SDL_UYVY_OVERLAY 0x59565955 /* Packed mode: U0+Y0+V0+Y1 (1 plane) */ +#define SDL_YVYU_OVERLAY 0x55595659 /* Packed mode: Y0+V0+Y1+U0 (1 plane) */ + +/* The YUV hardware video overlay */ +typedef struct SDL_Overlay { + Uint32 format; /* Read-only */ + int w, h; /* Read-only */ + int planes; /* Read-only */ + Uint16 *pitches; /* Read-only */ + Uint8 **pixels; /* Read-write */ + + /* Hardware-specific surface info */ + struct private_yuvhwfuncs *hwfuncs; + struct private_yuvhwdata *hwdata; + + /* Special flags */ + Uint32 hw_overlay :1; /* Flag: This overlay hardware accelerated? */ + Uint32 UnusedBits :31; +} SDL_Overlay; + + +/* Public enumeration for setting the OpenGL window attributes. */ +typedef enum { + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE +} SDL_GLattr; + +/* flags for SDL_SetPalette() */ +#define SDL_LOGPAL 0x01 +#define SDL_PHYSPAL 0x02 + +/* Function prototypes */ + +/* These functions are used internally, and should not be used unless you + * have a specific need to specify the video driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + * + * SDL_VideoInit() initializes the video subsystem -- sets up a connection + * to the window manager, etc, and determines the current video mode and + * pixel format, but does not initialize a window or graphics mode. + * Note that event handling is activated by this routine. + * + * If you use both sound and video in your application, you need to call + * SDL_Init() before opening the sound device, otherwise under Win32 DirectX, + * you won't be able to set full-screen display modes. + */ +extern DECLSPEC int SDL_VideoInit(const char *driver_name, Uint32 flags); +extern DECLSPEC void SDL_VideoQuit(void); + +/* This function fills the given character buffer with the name of the + * video driver, and returns a pointer to it if the video driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char *SDL_VideoDriverName(char *namebuf, int maxlen); + +/* + * This function returns a pointer to the current display surface. + * If SDL is doing format conversion on the display surface, this + * function returns the publicly visible surface, not the real video + * surface. + */ +extern DECLSPEC SDL_Surface * SDL_GetVideoSurface(void); + +/* + * This function returns a read-only pointer to information about the + * video hardware. If this is called before SDL_SetVideoMode(), the 'vfmt' + * member of the returned structure will contain the pixel format of the + * "best" video mode. + */ +extern DECLSPEC const SDL_VideoInfo * SDL_GetVideoInfo(void); + +/* + * Check to see if a particular video mode is supported. + * It returns 0 if the requested mode is not supported under any bit depth, + * or returns the bits-per-pixel of the closest available mode with the + * given width and height. If this bits-per-pixel is different from the + * one used when setting the video mode, SDL_SetVideoMode() will succeed, + * but will emulate the requested bits-per-pixel with a shadow surface. + * + * The arguments to SDL_VideoModeOK() are the same ones you would pass to + * SDL_SetVideoMode() + */ +extern DECLSPEC int SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); + +/* + * Return a pointer to an array of available screen dimensions for the + * given format and video flags, sorted largest to smallest. Returns + * NULL if there are no dimensions available for a particular format, + * or (SDL_Rect **)-1 if any dimension is okay for the given format. + * + * If 'format' is NULL, the mode list will be for the format given + * by SDL_GetVideoInfo()->vfmt + */ +extern DECLSPEC SDL_Rect ** SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); + +/* + * Set up a video mode with the specified width, height and bits-per-pixel. + * + * If 'bpp' is 0, it is treated as the current display bits per pixel. + * + * If SDL_ANYFORMAT is set in 'flags', the SDL library will try to set the + * requested bits-per-pixel, but will return whatever video pixel format is + * available. The default is to emulate the requested pixel format if it + * is not natively available. + * + * If SDL_HWSURFACE is set in 'flags', the video surface will be placed in + * video memory, if possible, and you may have to call SDL_LockSurface() + * in order to access the raw framebuffer. Otherwise, the video surface + * will be created in system memory. + * + * If SDL_ASYNCBLIT is set in 'flags', SDL will try to perform rectangle + * updates asynchronously, but you must always lock before accessing pixels. + * SDL will wait for updates to complete before returning from the lock. + * + * If SDL_HWPALETTE is set in 'flags', the SDL library will guarantee + * that the colors set by SDL_SetColors() will be the colors you get. + * Otherwise, in 8-bit mode, SDL_SetColors() may not be able to set all + * of the colors exactly the way they are requested, and you should look + * at the video surface structure to determine the actual palette. + * If SDL cannot guarantee that the colors you request can be set, + * i.e. if the colormap is shared, then the video surface may be created + * under emulation in system memory, overriding the SDL_HWSURFACE flag. + * + * If SDL_FULLSCREEN is set in 'flags', the SDL library will try to set + * a fullscreen video mode. The default is to create a windowed mode + * if the current graphics system has a window manager. + * If the SDL library is able to set a fullscreen video mode, this flag + * will be set in the surface that is returned. + * + * If SDL_DOUBLEBUF is set in 'flags', the SDL library will try to set up + * two surfaces in video memory and swap between them when you call + * SDL_Flip(). This is usually slower than the normal single-buffering + * scheme, but prevents "tearing" artifacts caused by modifying video + * memory while the monitor is refreshing. It should only be used by + * applications that redraw the entire screen on every update. + * + * If SDL_RESIZABLE is set in 'flags', the SDL library will allow the + * window manager, if any, to resize the window at runtime. When this + * occurs, SDL will send a SDL_VIDEORESIZE event to you application, + * and you must respond to the event by re-calling SDL_SetVideoMode() + * with the requested size (or another size that suits the application). + * + * If SDL_NOFRAME is set in 'flags', the SDL library will create a window + * without any title bar or frame decoration. Fullscreen video modes have + * this flag set automatically. + * + * This function returns the video framebuffer surface, or NULL if it fails. + * + * If you rely on functionality provided by certain video flags, check the + * flags of the returned surface to make sure that functionality is available. + * SDL will fall back to reduced functionality if the exact flags you wanted + * are not available. + */ +extern DECLSPEC SDL_Surface *SDL_SetVideoMode + (int width, int height, int bpp, Uint32 flags); + +/* + * Makes sure the given list of rectangles is updated on the given screen. + * If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the entire + * screen. + * These functions should not be called while 'screen' is locked. + */ +extern DECLSPEC void SDL_UpdateRects + (SDL_Surface *screen, int numrects, SDL_Rect *rects); +extern DECLSPEC void SDL_UpdateRect + (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); + +/* + * On hardware that supports double-buffering, this function sets up a flip + * and returns. The hardware will wait for vertical retrace, and then swap + * video buffers before the next video surface blit or lock will return. + * On hardware that doesn not support double-buffering, this is equivalent + * to calling SDL_UpdateRect(screen, 0, 0, 0, 0); + * The SDL_DOUBLEBUF flag must have been passed to SDL_SetVideoMode() when + * setting the video mode for this function to perform hardware flipping. + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDL_Flip(SDL_Surface *screen); + +/* + * Set the gamma correction for each of the color channels. + * The gamma values range (approximately) between 0.1 and 10.0 + * + * If this function isn't supported directly by the hardware, it will + * be emulated using gamma ramps, if available. If successful, this + * function returns 0, otherwise it returns -1. + */ +extern DECLSPEC int SDL_SetGamma(float red, float green, float blue); + +/* + * Set the gamma translation table for the red, green, and blue channels + * of the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. + * The input is the index into the array, and the output is the 16-bit + * gamma value at that index, scaled to the output color precision. + * + * You may pass NULL for any of the channels to leave it unchanged. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDL_SetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue); + +/* + * Retrieve the current values of the gamma translation tables. + * + * You must pass in valid pointers to arrays of 256 16-bit quantities. + * Any of the pointers may be NULL to ignore that channel. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue); + +/* + * Sets a portion of the colormap for the given 8-bit surface. If 'surface' + * is not a palettized surface, this function does nothing, returning 0. + * If all of the colors were set as passed to SDL_SetColors(), it will + * return 1. If not all the color entries were set exactly as given, + * it will return 0, and you should look at the surface palette to + * determine the actual color palette. + * + * When 'surface' is the surface associated with the current display, the + * display colormap will be updated with the requested colors. If + * SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors() + * will always return 1, and the palette is guaranteed to be set the way + * you desire, even if the window colormap has to be warped or run under + * emulation. + */ +extern DECLSPEC int SDL_SetColors(SDL_Surface *surface, + SDL_Color *colors, int firstcolor, int ncolors); + +/* + * Sets a portion of the colormap for a given 8-bit surface. + * 'flags' is one or both of: + * SDL_LOGPAL -- set logical palette, which controls how blits are mapped + * to/from the surface, + * SDL_PHYSPAL -- set physical palette, which controls how pixels look on + * the screen + * Only screens have physical palettes. Separate change of physical/logical + * palettes is only possible if the screen has SDL_HWPALETTE set. + * + * The return value is 1 if all colours could be set as requested, and 0 + * otherwise. + * + * SDL_SetColors() is equivalent to calling this function with + * flags = (SDL_LOGPAL|SDL_PHYSPAL). + */ +extern DECLSPEC int SDL_SetPalette(SDL_Surface *surface, int flags, + SDL_Color *colors, int firstcolor, + int ncolors); + +/* + * Maps an RGB triple to an opaque pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDL_MapRGB + (SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b); + +/* + * Maps an RGBA quadruple to a pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDL_MapRGBA(SDL_PixelFormat *format, + Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* + * Maps a pixel value into the RGB components for a given pixel format + */ +extern DECLSPEC void SDL_GetRGB(Uint32 pixel, SDL_PixelFormat *fmt, + Uint8 *r, Uint8 *g, Uint8 *b); + +/* + * Maps a pixel value into the RGBA components for a given pixel format + */ +extern DECLSPEC void SDL_GetRGBA(Uint32 pixel, SDL_PixelFormat *fmt, + Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); + +/* + * Allocate and free an RGB surface (must be called after SDL_SetVideoMode) + * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. + * If the depth is greater than 8 bits, the pixel format is set using the + * flags '[RGB]mask'. + * If the function runs out of memory, it will return NULL. + * + * The 'flags' tell what kind of surface to create. + * SDL_SWSURFACE means that the surface should be created in system memory. + * SDL_HWSURFACE means that the surface should be created in video memory, + * with the same format as the display surface. This is useful for surfaces + * that will not change much, to take advantage of hardware acceleration + * when being blitted to the display surface. + * SDL_ASYNCBLIT means that SDL will try to perform asynchronous blits with + * this surface, but you must always lock it before accessing the pixels. + * SDL will wait for current blits to finish before returning from the lock. + * SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits. + * If the hardware supports acceleration of colorkey blits between + * two surfaces in video memory, SDL will try to place the surface in + * video memory. If this isn't possible or if there is no hardware + * acceleration available, the surface will be placed in system memory. + * SDL_SRCALPHA means that the surface will be used for alpha blits and + * if the hardware supports hardware acceleration of alpha blits between + * two surfaces in video memory, to place the surface in video memory + * if possible, otherwise it will be placed in system memory. + * If the surface is created in video memory, blits will be _much_ faster, + * but the surface format must be identical to the video surface format, + * and the only way to access the pixels member of the surface is to use + * the SDL_LockSurface() and SDL_UnlockSurface() calls. + * If the requested surface actually resides in video memory, SDL_HWSURFACE + * will be set in the flags member of the returned surface. If for some + * reason the surface could not be placed in video memory, it will not have + * the SDL_HWSURFACE flag set, and will be created in system memory instead. + */ +#define SDL_AllocSurface SDL_CreateRGBSurface +extern DECLSPEC SDL_Surface *SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +extern DECLSPEC SDL_Surface *SDL_CreateRGBSurfaceFrom(void *pixels, + int width, int height, int depth, int pitch, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +extern DECLSPEC void SDL_FreeSurface(SDL_Surface *surface); + +/* + * SDL_LockSurface() sets up a surface for directly accessing the pixels. + * Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write + * to and read from 'surface->pixels', using the pixel format stored in + * 'surface->format'. Once you are done accessing the surface, you should + * use SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates + * to 0, then you can read and write to the surface at any time, and the + * pixel format of the surface will not change. In particular, if the + * SDL_HWSURFACE flag is not given when calling SDL_SetVideoMode(), you + * will not need to lock the display surface before accessing it. + * + * No operating system or library calls should be made between lock/unlock + * pairs, as critical system locks may be held during this time. + * + * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. + */ +extern DECLSPEC int SDL_LockSurface(SDL_Surface *surface); +extern DECLSPEC void SDL_UnlockSurface(SDL_Surface *surface); + +/* + * Load a surface from a seekable SDL data source (memory or file.) + * If 'freesrc' is non-zero, the source will be closed after being read. + * Returns the new surface, or NULL if there was an error. + * The new surface should be freed with SDL_FreeSurface(). + */ +extern DECLSPEC SDL_Surface * SDL_LoadBMP_RW(SDL_RWops *src, int freesrc); + +/* Convenience macro -- load a surface from a file */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/* + * Save a surface to a seekable SDL data source (memory or file.) + * If 'freedst' is non-zero, the source will be closed after being written. + * Returns 0 if successful or -1 if there was an error. + */ +extern DECLSPEC int SDL_SaveBMP_RW + (SDL_Surface *surface, SDL_RWops *dst, int freedst); + +/* Convenience macro -- save a surface to a file */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/* + * Sets the color key (transparent pixel) in a blittable surface. + * If 'flag' is SDL_SRCCOLORKEY (optionally OR'd with SDL_RLEACCEL), + * 'key' will be the transparent pixel in the source image of a blit. + * SDL_RLEACCEL requests RLE acceleration for the surface if present, + * and removes RLE acceleration if absent. + * If 'flag' is 0, this function clears any current color key. + * This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDL_SetColorKey + (SDL_Surface *surface, Uint32 flag, Uint32 key); + +/* + * This function sets the alpha value for the entire surface, as opposed to + * using the alpha component of each pixel. This value measures the range + * of transparency of the surface, 0 being completely transparent to 255 + * being completely opaque. An 'alpha' value of 255 causes blits to be + * opaque, the source pixels copied to the destination (the default). Note + * that per-surface alpha can be combined with colorkey transparency. + * + * If 'flag' is 0, alpha blending is disabled for the surface. + * If 'flag' is SDL_SRCALPHA, alpha blending is enabled for the surface. + * OR:ing the flag with SDL_RLEACCEL requests RLE acceleration for the + * surface; if SDL_RLEACCEL is not specified, the RLE accel will be removed. + */ +extern DECLSPEC int SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); + +/* + * Sets the clipping rectangle for the destination surface in a blit. + * + * If the clip rectangle is NULL, clipping will be disabled. + * If the clip rectangle doesn't intersect the surface, the function will + * return SDL_FALSE and blits will be completely clipped. Otherwise the + * function returns SDL_TRUE and blits to the surface will be clipped to + * the intersection of the surface area and the clipping rectangle. + * + * Note that blits are automatically clipped to the edges of the source + * and destination surfaces. + */ +extern DECLSPEC SDL_bool SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect); + +/* + * Gets the clipping rectangle for the destination surface in a blit. + * 'rect' must be a pointer to a valid rectangle which will be filled + * with the correct values. + */ +extern DECLSPEC void SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); + +/* + * Creates a new surface of the specified format, and then copies and maps + * the given surface to it so the blit of the converted surface will be as + * fast as possible. If this function fails, it returns NULL. + * + * The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those + * semantics. You can also pass SDL_RLEACCEL in the flags parameter and + * SDL will try to RLE accelerate colorkey and alpha blits in the resulting + * surface. + * + * This function is used internally by SDL_DisplayFormat(). + */ +extern DECLSPEC SDL_Surface *SDL_ConvertSurface + (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags); + +/* + * This performs a fast blit from the source surface to the destination + * surface. It assumes that the source and destination rectangles are + * the same size. If either 'srcrect' or 'dstrect' are NULL, the entire + * surface (src or dst) is copied. The final blit rectangles are saved + * in 'srcrect' and 'dstrect' after all clipping is performed. + * If the blit is successful, it returns 0, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without alpha and colorkey + * are defined as follows: + * + * RGBA->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using alpha-channel). + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy RGB. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value); + * set destination alpha to opaque. + * SDL_SRCALPHA not set: + * copy RGB, set destination alpha to opaque. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * RGBA->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source alpha channel) the RGB values; + * leave destination alpha untouched. [Note: is this correct?] + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy all of RGBA to the destination. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value). + * SDL_SRCALPHA not set: + * copy RGB. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * If either of the surfaces were in video memory, and the blit returns -2, + * the video memory was lost, so it should be reloaded with artwork and + * re-blitted: + while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { + while ( SDL_LockSurface(image) < 0 ) + Sleep(10); + -- Write image pixels to image->pixels -- + SDL_UnlockSurface(image); + } + * This happens under DirectX 5.0 when the system switches away from your + * fullscreen application. The lock will also fail until you have access + * to the video memory again. + */ +/* You should call SDL_BlitSurface() unless you know exactly how SDL + blitting works internally and how to use the other blit functions. +*/ +#define SDL_BlitSurface SDL_UpperBlit + +/* This is the public blit function, SDL_BlitSurface(), and it performs + rectangle validation and clipping before passing it to SDL_LowerBlit() +*/ +extern DECLSPEC int SDL_UpperBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); +/* This is a semi-private blit function and it performs low-level surface + blitting only. +*/ +extern DECLSPEC int SDL_LowerBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/* + * This function performs a fast fill of the given rectangle with 'color' + * The given rectangle is clipped to the destination surface clip area + * and the final fill rectangle is saved in the passed in pointer. + * If 'dstrect' is NULL, the whole surface will be filled with 'color' + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * This function returns 0 on success, or -1 on error. + */ +extern DECLSPEC int SDL_FillRect + (SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); + +/* + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer, suitable for fast + * blitting onto the display surface. It calls SDL_ConvertSurface() + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDL_DisplayFormat(SDL_Surface *surface); + +/* + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer (if possible), + * suitable for fast alpha blitting onto the display surface. + * The new surface will always have an alpha channel. + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDL_DisplayFormatAlpha(SDL_Surface *surface); + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* YUV video surface overlay functions */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* This function creates a video output overlay + Calling the returned surface an overlay is something of a misnomer because + the contents of the display surface underneath the area where the overlay + is shown is undefined - it may be overwritten with the converted YUV data. +*/ +extern DECLSPEC SDL_Overlay *SDL_CreateYUVOverlay(int width, int height, + Uint32 format, SDL_Surface *display); + +/* Lock an overlay for direct access, and unlock it when you are done */ +extern DECLSPEC int SDL_LockYUVOverlay(SDL_Overlay *overlay); +extern DECLSPEC void SDL_UnlockYUVOverlay(SDL_Overlay *overlay); + +/* Blit a video overlay to the display surface. + The contents of the video surface underneath the blit destination are + not defined. + The width and height of the destination rectangle may be different from + that of the overlay, but currently only 2x scaling is supported. +*/ +extern DECLSPEC int SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect); + +/* Free a video overlay */ +extern DECLSPEC void SDL_FreeYUVOverlay(SDL_Overlay *overlay); + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* OpenGL support functions. */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Dynamically load a GL driver, if SDL is built with dynamic GL. + * + * SDL links normally with the OpenGL library on your system by default, + * but you can compile it to dynamically load the GL driver at runtime. + * If you do this, you need to retrieve all of the GL functions used in + * your program from the dynamic library using SDL_GL_GetProcAddress(). + * + * This is disabled in default builds of SDL. + */ +extern DECLSPEC int SDL_GL_LoadLibrary(const char *path); + +/* + * Get the address of a GL function (for extension functions) + */ +extern DECLSPEC void *SDL_GL_GetProcAddress(const char* proc); + +/* + * Set an attribute of the OpenGL subsystem before intialization. + */ +extern DECLSPEC int SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/* + * Get an attribute of the OpenGL subsystem from the windowing + * interface, such as glX. This is of course different from getting + * the values from SDL's internal OpenGL subsystem, which only + * stores the values you request before initialization. + * + * Developers should track the values they pass into SDL_GL_SetAttribute + * themselves if they want to retrieve these values. + */ +extern DECLSPEC int SDL_GL_GetAttribute(SDL_GLattr attr, int* value); + +/* + * Swap the OpenGL buffers, if double-buffering is supported. + */ +extern DECLSPEC void SDL_GL_SwapBuffers(void); + +/* + * Internal functions that should not be called unless you have read + * and understood the source code for these functions. + */ +extern DECLSPEC void SDL_GL_UpdateRects(int numrects, SDL_Rect* rects); +extern DECLSPEC void SDL_GL_Lock(void); +extern DECLSPEC void SDL_GL_Unlock(void); + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* These functions allow interaction with the window manager, if any. */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Sets/Gets the title and icon text of the display window + */ +extern DECLSPEC void SDL_WM_SetCaption(const char *title, const char *icon); +extern DECLSPEC void SDL_WM_GetCaption(char **title, char **icon); + +/* + * Sets the icon for the display window. + * This function must be called before the first call to SDL_SetVideoMode(). + * It takes an icon surface, and a mask in MSB format. + * If 'mask' is NULL, the entire icon surface will be used as the icon. + */ +extern DECLSPEC void SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); + +/* + * This function iconifies the window, and returns 1 if it succeeded. + * If the function succeeds, it generates an SDL_APPACTIVE loss event. + * This function is a noop and returns 0 in non-windowed environments. + */ +extern DECLSPEC int SDL_WM_IconifyWindow(void); + +/* + * Toggle fullscreen mode without changing the contents of the screen. + * If the display surface does not require locking before accessing + * the pixel information, then the memory pointers will not change. + * + * If this function was able to toggle fullscreen mode (change from + * running in a window to fullscreen, or vice-versa), it will return 1. + * If it is not implemented, or fails, it returns 0. + * + * The next call to SDL_SetVideoMode() will set the mode fullscreen + * attribute based on the flags parameter - if SDL_FULLSCREEN is not + * set, then the display will be windowed by default where supported. + * + * This is currently only implemented in the X11 video driver. + */ +extern DECLSPEC int SDL_WM_ToggleFullScreen(SDL_Surface *surface); + +/* + * This function allows you to set and query the input grab state of + * the application. It returns the new input grab state. + */ +typedef enum { + SDL_GRAB_QUERY = -1, + SDL_GRAB_OFF = 0, + SDL_GRAB_ON = 1, + SDL_GRAB_FULLSCREEN /* Used internally */ +} SDL_GrabMode; +/* + * Grabbing means that the mouse is confined to the application window, + * and nearly all keyboard input is passed directly to the application, + * and not interpreted by a window manager, if any. + */ +extern DECLSPEC SDL_GrabMode SDL_WM_GrabInput(SDL_GrabMode mode); + +/* Not in public API at the moment - do not use! */ +extern DECLSPEC int SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/src/image/sublib/begin_code.h b/src/image/sublib/begin_code.h new file mode 100644 index 0000000..d455ea2 --- /dev/null +++ b/src/image/sublib/begin_code.h @@ -0,0 +1,100 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +/* This file sets things up for C dynamic library function definitions, + static inlined functions, and structures aligned at 4-byte alignment. + If you don't like ugly C preprocessor code, don't look at this file. :) +*/ + +/* This shouldn't be nested -- included it around code only. */ +#ifdef _begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define _begin_code_h + +/* Some compilers use a special export keyword */ +#ifndef DECLSPEC +# ifdef __BEOS__ +# if defined(__GNUC__) +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC __declspec(export) +# endif +# else +# ifdef WIN32 +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# endif +#endif + +/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */ +#ifdef __SYMBIAN32__ +#undef DECLSPEC +#define DECLSPEC +#endif /* __SYMBIAN32__ */ + +/* Force structure packing at 4 byte alignment. + This is necessary if the header is included in code which has structure + packing set to an alternate value, say for loading structures from disk. + The packing is reset to the previous value in close_code.h + */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__WATCOMC__) || defined(__BORLANDC__) +#ifdef _MSC_VER +#pragma warning(disable: 4103) +#endif +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#pragma pack(push,4) +#elif (defined(__MWERKS__) && defined(macintosh)) +#pragma options align=mac68k4byte +#pragma enumsalwaysint on +#endif /* Compiler needs structure packing set */ + +/* Set up compiler-specific options for inlining functions */ +#ifndef SDL_INLINE_OKAY +#ifdef __GNUC__ +#define SDL_INLINE_OKAY +#else +/* Add any special compiler-specific cases here */ +#if defined(_MSC_VER) +#define __inline__ __inline +#define SDL_INLINE_OKAY +#else +#if !defined(__MRC__) && !defined(_SGI_SOURCE) +#define __inline__ inline +#define SDL_INLINE_OKAY +#endif /* Not a funky compiler */ +#endif /* Visual C++ */ +#endif /* GNU C */ +#endif /* SDL_INLINE_OKAY */ + +/* If inlining isn't supported, remove "__inline__", turning static + inlined functions into static functions (resulting in code bloat + in all files which include the offending header files) +*/ +#ifndef SDL_INLINE_OKAY +#define __inline__ +#endif + diff --git a/src/image/sublib/close_code.h b/src/image/sublib/close_code.h new file mode 100644 index 0000000..d3b5c07 --- /dev/null +++ b/src/image/sublib/close_code.h @@ -0,0 +1,41 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +/* This file reverses the effects of begin_code.h and should be included + after you finish any function and structure declarations in your headers +*/ + +#undef _begin_code_h + +/* Reset structure packing at previous byte alignment */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__WATCOMC__) || defined(__BORLANDC__) +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#if (defined(__MWERKS__) && defined(macintosh)) +#pragma options align=reset +#pragma enumsalwaysint reset +#else +#pragma pack(pop) +#endif +#endif /* Compiler needs structure packing set */ + diff --git a/src/image/sublib/im_exp.h b/src/image/sublib/im_exp.h new file mode 100644 index 0000000..632d38b --- /dev/null +++ b/src/image/sublib/im_exp.h @@ -0,0 +1,18 @@ +#ifndef IM_EXP_H +#define IM_EXP_H +#include "globals.h" +#include "picinfo.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +extern int im_load_gif(char* fname, PICINFO* to_pic, int from_mem_size); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/image/sublib/makefile.in b/src/image/sublib/makefile.in new file mode 100644 index 0000000..8d1369e --- /dev/null +++ b/src/image/sublib/makefile.in @@ -0,0 +1,93 @@ +# Image Engine for X Window +# +# Copyright (C) 1996 by Leo Khramov +# email: leo@pop.convey.ru +# Fido: 2:5030/627.15 +# +# 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. +# + +include ../../make.conf + +@MCOMMON@ + + IOBJS = SDL_surface.o SDL_rwops.o SDL_error.o SDL_to_picinfo.o \ + IMG_gif.o + CXXINCLUDES=$(XINC) $(JINC) + CXXOPT=-I../.. -I../../include $(CFLAGS) $(DEFS) $(DEB) $(PSEUDO) $(PCX) $(TIFF) $(BMP) $(XBM) $(XPM) $(TGA) $(PCD) $(PNG) + + + +all:: $(IOBJS) + +SDL_surface.o: SDL_surface.c + $(CC) -c SDL_surface.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +SDL_error.o: SDL_error.c + $(CC) -c SDL_error.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +SDL_to_picinfo.o: SDL_to_picinfo.c + $(CC) -c SDL_to_picinfo.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +SDL_rwops.o: SDL_rwops.c + $(CC) -c SDL_rwops.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +IMG_gif.o: IMG_gif.c + $(CC) -c IMG_gif.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +jpeg.o: jpeg.c + $(CC) -c jpeg.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +accel.o: accel.c + $(CC) -c accel.c $(CXXOPT) $(CXXINCLUDES) $(CPPFLAGS) + +pcdr.o: pcdr.c + $(CC) -c pcdr.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +inter.o: inter.c + $(CC) -c inter.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +huff.o: huff.c + $(CC) -c huff.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +file.o: file.c + $(CC) -c file.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +yuv2rgb.o: yuv2rgb.c + $(CC) -c yuv2rgb.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +tiffr.o: tiffr.c + $(CC) -c tiffr.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +png.o: png.c + $(CC) -c png.c $(CXXOPT) $(INCLUDES) $(ZINC) $(PNGINC) $(CPPFLAGS) + +../zlib/libz.a: + cd ../zlib && make + +../libpng/libpng.a: + cd ../libpng && make + +pcxr.o: pcxr.c + $(CC) -c pcxr.c $(CXXOPT) $(INCLUDES) $(CPPFLAGS) + +libie.a: $(IOBJS) + $(RM) -f libie.a + ar rc libie.a $(IOBJS) + @RANLIB@ libie.a + +clean: + $(RM) -f libie.a + $(RM) -f *.o + +FORCE: + + diff --git a/src/include/bilist.h b/src/include/bilist.h new file mode 100644 index 0000000..7890507 --- /dev/null +++ b/src/include/bilist.h @@ -0,0 +1,61 @@ +#ifndef BILIST_H +#define BILIST_H + +template < class TC > class bilist +{ + TC object; + bool usable; + bilist *next,*prev; + public: + bilist() { next=prev=0;usable=false;}; + bilist(TC& obj) { next=prev=0;object=obj;usable=true;}; + + bool add(bilist *plist); + bilist* del(TC& obj); + bool del_self() + { + if(next) + next->set_prev(prev); + if(prev) + prev->set_next(next); + return true; + }; + + bool is_last() {return next==0;}; + bool is_first() {return prev==0;}; + + bilist *get_next() { return next;}; + bilist *get_prev() { return prev;}; + + void set_prev(bilist *plist) { prev=plist;}; + void set_next(bilist *plist) { next=plist;}; + + TC& get_object() { return object;}; +}; + +//here we are using while for searching end of list +template bool bilist::add(bilist *plist) +{ + bilist *ptr=this; + while(ptr->get_next()!=0) + ptr=ptr->get_next(); + ptr->set_next(plist); + plist->set_prev(ptr); + return true; +} + +//and here lets make recursion for diff :) +template bilist* bilist::del(TC& obj) +{ + if(obj==object) + { + del_self(); + return this; + } + if(next) + return next->del(obj); + return 0; //Can't find object in list. +} + +#endif + diff --git a/src/include/commonfuncs.h b/src/include/commonfuncs.h new file mode 100644 index 0000000..9fef973 --- /dev/null +++ b/src/include/commonfuncs.h @@ -0,0 +1,11 @@ +#ifndef COMMONFUNCS_H +#define COMMONFUNCS_H + +#include "globals.h" + +enum FMode { ReadOnly, ReadWrite }; + +extern bool find_full_path_for_file(char* fname, char* ret_full_pathname, + FMode fm=ReadOnly); + +#endif diff --git a/src/include/config.h b/src/include/config.h new file mode 100644 index 0000000..a91dd57 --- /dev/null +++ b/src/include/config.h @@ -0,0 +1,145 @@ +/* src/include/config.h. Generated automatically by configure. */ +/* src/include/config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define if you have that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define as __inline if that's what the C compiler calls it. */ +/* #undef inline */ + +/* Define if on MINIX. */ +/* #undef _MINIX */ + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define if your declares struct tm. */ +/* #undef TM_IN_SYS_TIME */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define if the X Window System is missing or not being used. */ +/* #undef X_DISPLAY_MISSING */ + +/* Define if you have the atexit function. */ +#define HAVE_ATEXIT 1 + +/* Define if you have the getcwd function. */ +#define HAVE_GETCWD 1 + +/* Define if you have the mkdir function. */ +#define HAVE_MKDIR 1 + +/* Define if you have the putenv function. */ +#define HAVE_PUTENV 1 + +/* Define if you have the select function. */ +#define HAVE_SELECT 1 + +/* Define if you have the seteuid function. */ +#define HAVE_SETEUID 1 + +/* Define if you have the setlocale function. */ +#define HAVE_SETLOCALE 1 + +/* Define if you have the setutent function. */ +#define HAVE_SETUTENT 1 + +/* Define if you have the socket function. */ +#define HAVE_SOCKET 1 + +/* Define if you have the unsetenv function. */ +#define HAVE_UNSETENV 1 + +/* Define if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define if you have the header file. */ +#define HAVE_MATH_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_SIGEVENT_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_UTSNAME_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you have the m library (-lm). */ +#define HAVE_LIBM 1 diff --git a/src/include/config.h.in b/src/include/config.h.in new file mode 100644 index 0000000..275ca89 --- /dev/null +++ b/src/include/config.h.in @@ -0,0 +1,144 @@ +/* src/include/config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +#undef _ALL_SOURCE +#endif + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define to `int' if doesn't define. */ +#undef gid_t + +/* Define if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define if on MINIX. */ +#undef _MINIX + +/* Define to `int' if doesn't define. */ +#undef mode_t + +/* Define to `int' if doesn't define. */ +#undef pid_t + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +#undef _POSIX_1_SOURCE + +/* Define if you need to in order for stat and other things to work. */ +#undef _POSIX_SOURCE + +/* Define as the return type of signal handlers (int or void). */ +#undef RETSIGTYPE + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define if your declares struct tm. */ +#undef TM_IN_SYS_TIME + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* Define if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING + +/* Define if you have the atexit function. */ +#undef HAVE_ATEXIT + +/* Define if you have the getcwd function. */ +#undef HAVE_GETCWD + +/* Define if you have the mkdir function. */ +#undef HAVE_MKDIR + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the select function. */ +#undef HAVE_SELECT + +/* Define if you have the seteuid function. */ +#undef HAVE_SETEUID + +/* Define if you have the setlocale function. */ +#undef HAVE_SETLOCALE + +/* Define if you have the setutent function. */ +#undef HAVE_SETUTENT + +/* Define if you have the socket function. */ +#undef HAVE_SOCKET + +/* Define if you have the unsetenv function. */ +#undef HAVE_UNSETENV + +/* Define if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the header file. */ +#undef HAVE_MATH_H + +/* Define if you have the header file. */ +#undef HAVE_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_DIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_SIGEVENT_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_UTSNAME_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the m library (-lm). */ +#undef HAVE_LIBM diff --git a/src/include/geometry.h b/src/include/geometry.h new file mode 100644 index 0000000..bb699ba --- /dev/null +++ b/src/include/geometry.h @@ -0,0 +1,23 @@ +#ifndef GEOMETRY_H +#define GEOMETRY_H + +#include "welltris.h" + +struct Geo +{ + Images im; + int fromx, fromy; + int tox,toy; + unsigned int l,h; +}; + +struct GeoObject +{ + char name[GEO_NAME]; + Geo *geo; +}; + +extern Geo* get_geo_by_name(char* name); + + +#endif diff --git a/src/include/globals.h b/src/include/globals.h new file mode 100644 index 0000000..9b5a911 --- /dev/null +++ b/src/include/globals.h @@ -0,0 +1,89 @@ +#ifndef XNC_GLOBALS_H +#define XNC_GLOBALS_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef HAVE_SYS_SIGEVENT_H +#include +#endif +#include +#include +#ifdef HAVE_STRINGS_H +#include +#endif +#include +#include + +#ifdef HAVE_LIMITS_H +#include +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_UTSNAME_H +#include +#endif + +#ifdef TIME_WITH_SYS_TIME +#include +#include +#else +#ifdef HAVE_SYS_TIME_H +#include +#else +#include +#endif +#endif + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#ifdef HAVE_SYS_WAIT_H +#include +#endif + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_FCNTL_H +#include +#endif + +#include + +#ifdef HAVE_ERRNO_H +#include +#endif + +#ifdef HAVE_MATH_H +#include +#endif + +#include "types.h" +#include "mydebug.h" + +#define MAX2(x1,x2) (x1 +#endif + +#include +#ifdef HAVE_SYS_SIGEVENT_H +#include +#endif +#include +#include +#ifdef HAVE_STRINGS_H +#include +#endif +#include +#include + +#ifdef HAVE_LIMITS_H +#include +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_UTSNAME_H +#include +#endif + +#ifdef TIME_WITH_SYS_TIME +#include +#include +#else +#ifdef HAVE_SYS_TIME_H +#include +#else +#include +#endif +#endif + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#ifdef HAVE_SYS_WAIT_H +#include +#endif + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_FCNTL_H +#include +#endif + +#include + +#ifdef HAVE_ERRNO_H +#include +#endif + +#ifdef HAVE_MATH_H +#include +#endif + +#include "types.h" +#include "mydebug.h" + +#define MAX2(x1,x2) (x1 +#ifdef HAVE_SYS_SIGEVENT_H +#include +#endif +#include +#include + +#ifdef __cplusplus +extern "C" int debprintf(const char *format,...); +#else +extern int debprintf(const char *format,...); +#endif + +#ifdef DEBUG_XNC +#ifdef __FILE__ +#ifdef __LINE__ +#define __DEBUG() fprintf(stderr, "%-17s:%4d ", __FILE__, __LINE__) +#endif +#endif + +#ifndef __DEBUG +#define __DEBUG() ((void)0) +#endif + +# define dbgprintf(x) do {__DEBUG(); debprintf x;} while(0) +#else +# define dbgprintf(x) ((void)0) +#endif + +#endif diff --git a/src/include/sysheaders.h b/src/include/sysheaders.h new file mode 100644 index 0000000..e7f8d4c --- /dev/null +++ b/src/include/sysheaders.h @@ -0,0 +1,12 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + diff --git a/src/include/types.h b/src/include/types.h new file mode 100644 index 0000000..fe07f19 --- /dev/null +++ b/src/include/types.h @@ -0,0 +1,23 @@ +#ifndef MYTYPES_H +#define MYTYPES_H + +#ifndef uchar +typedef unsigned char uchar; +#endif + +#ifndef ulong +typedef unsigned long ulong; +#endif + +#ifndef uint +typedef unsigned int uint; +#endif + +#define L_MAXPATH 2048 + +#define YES 1 +#define NO 0 + +#endif +/* ------------ End of file -------------- */ + diff --git a/src/include/version.h b/src/include/version.h new file mode 100644 index 0000000..3c3ccc1 --- /dev/null +++ b/src/include/version.h @@ -0,0 +1,5 @@ +#ifndef WELL_VERSION_H +#define WELL_VERSION_H +#define VERSION "1.0.0" +#endif + diff --git a/src/include/wellclass.h b/src/include/wellclass.h new file mode 100644 index 0000000..e75201e --- /dev/null +++ b/src/include/wellclass.h @@ -0,0 +1,162 @@ +#ifndef WELLCLASS_H +#define WELLCLASS_H + +#include "globals.h" +#include "welltris.h" +#include "wellobject.h" +#include "welldrawing.h" +#include "wellengine.h" +#include "wellimagefont.h" +#include "welltopnine.h" + +//define structures for work with figures +struct thing_t +{ + int squares, polyomino_number; + int xpos, ypos; + int size, color_number; + int bonus, random_rotation, random_reflection; + long random_number; + thing_t() + { + squares=polyomino_number=xpos=ypos=size=0; + color_number=bonus=random_rotation=random_reflection=0; + random_number=0; + }; +}; + +struct Polyominoes +{ + int rotation; + int reflection; + int start_height; + int shape[MAX_SQUARES][MAX_SQUARES]; + int size; +}; + +struct Mode +{ + int number[MAX_MODES][MAX_TYPES]; + int start[MAX_START_POLYOMINOES][MAX_TYPES]; + int turn_style; +}; + +struct Polytris +{ + Polyominoes polyomino[MAX_POLYOMINOES]; + Mode mode[MAX_MODES]; + int diagonal_switch; +}; + +struct Field +{ + int pmid, cid; +}; + + +class WellBase: public WellObject +{ + protected: + Polytris tris[MAX_SQUARES - MIN_SQUARES + 1]; + int frozen_wall[MAX_SIDES]; + thing_t curThing, nextThing; + Field wall[MAX_DEPTH+MAX_WIDTH][MAX_PERIMETER]; + Field base[MAX_WIDTH][MAX_WIDTH]; + + int level, score, rows, rows_levelup; + + bool bonusNow; + + //Options + bool showNext; + bool beep; + bool diagonal; + bool mixed; + bool bonus; + bool grid; + bool cw; + bool gradualAppear; + bool rotation; + int squares, pause, steps_to_rotate; + + //Drawing Engine + + WellDrawingEngine *dre; + WellImageFont *txt_score; + WellImageFont *txt_lines; + WellImageFont *txt_levelup; + WellImageFont *txt_level; + + WellImageFont *txt_first; + WellImageFont *txt_second; + WellImageFont *txt_third; + + Score *player_score; + + ObjectCaller game_over_object; + + char player_name[PLAYER_NAME_LEN]; + + void set_default_options(); + + void read_polyominoes(); + void new_thing(); + void redo_next(); + void put_box(); + bool overlapping(); + bool at_bottom(); + bool at_base_fully(); + bool at_base_partially(); + bool wall_change(thing_t old,thing_t new_t); + bool all_frozen(); + void wall_to_base(int* base_x,int* base_y,int wall_x,int wall_y); + void try_move(Actions move); + void draw_thing_diff(thing_t* old); + void draw_thing(); + void draw_field(); + void fill_lines(); + void freeze_wall(int w); + void defreeze_wall(int w); + void drop_wall(int); + void check_freeze(); + int check_lines(); + void check_update_lines(); + bool process_action(Actions action); + void make_pause(); + void make_rotation(); + + virtual void draw_status(); + virtual void draw_next(); + virtual void clear_next(); + virtual void draw_grid(); + virtual void draw_box(int color, int x, int y); + + public: + WellBase(); + void init(WellEngine*); + void udelay(int msec); + bool move_one_step(Actions); + void game_over(); + void new_game(); + void new_level_calc(); + void redraw_all(); + void set_level(int il) { level=il; dbgprintf(("Level now is %d\n",level));}; + void set_rotation(bool r) { rotation=r;}; + void set_mixed(bool r) { mixed=r;}; + void set_next_piece(bool r) { showNext=r;}; + void set_squares(int i) { squares=i;}; + void set_object_on_game_over(ObjectCaller obj) + { + game_over_object=obj; + }; + void set_player_name(char *pn) + { + strcpy(player_name,pn); + }; + virtual bool process_event(wEvent); + virtual void show(); + virtual void hide(); +}; + +#endif + diff --git a/src/include/welldrawing.h b/src/include/welldrawing.h new file mode 100644 index 0000000..f9dfeb6 --- /dev/null +++ b/src/include/welldrawing.h @@ -0,0 +1,62 @@ +#ifndef DRAWING_H +#define DRAWING_H + +#include "globals.h" +#include "welltris.h" +#include "wellsimpledraw.h" +#include "geometry.h" + +struct FieldPoints +{ + WPoint wall_points[MAX_PERIMETER+1][MAX_DEPTH+1]; + WPoint base_points[MAX_WIDTH+1][MAX_WIDTH+1]; +}; + +class WellDrawingEngine: public WellSimpleDraw +{ + protected: + int num_fields; + unsigned int l,h; + int delta_x,delta_y; + int current_id; + + int pix_max_width; + int pix_base_width; + int pix_base_delta; + int pix_wall_delta; + int pix_max_delta; + int pix_dx,pix_dy; + int center_x,center_y; + int f_step; + + float inner_max_alpha,outer_max_alpha; + + FieldPoints *points; + + public: + virtual void init(int,int,int,unsigned int,unsigned int); + virtual void draw_square(int color, int x, int y); + virtual void draw_trapazoid(int color, int x, int y); + virtual void sync(); + virtual void field_sync() {}; + virtual void bell(int); + virtual void flush_all(); + virtual void flush_dirty(); + virtual void clear_field(int i) {}; + virtual void set_field_id(int id) { current_id=id;}; + virtual void draw_grid() {}; + virtual Actions key_to_action(void* event) { return NOTHING; }; + virtual void calc_grid_points(); + virtual void set_field_sizes(int idx, int idy, + int ipix_wall_delta, + int ipix_base_delta); + virtual void set_inner_alpha(float ialpha) { inner_max_alpha= + ialpha*float(W_PI/180.0);}; + virtual void set_outer_alpha(float ialpha) { outer_max_alpha= + ialpha*float(W_PI/180.0);}; + virtual void outer_rotation(); + virtual void pixmap_copy(Geo *pgeo) {}; +}; + + +#endif diff --git a/src/include/wellengine.h b/src/include/wellengine.h new file mode 100644 index 0000000..bb5de1e --- /dev/null +++ b/src/include/wellengine.h @@ -0,0 +1,93 @@ +#ifndef WELLENGINE_H +#define WELLENGINE_H + +#include "wellobject.h" +#include "bilist.h" +#include "welldrawing.h" +#include "wellimagefont.h" +#include "welltopnine.h" +#include "wellintro.h" +#include "wellkey.h" +#include "wellswitch.h" +#include "wellinput.h" + +class WellBase; + +//Class used in Time queue for delivering time events to objects +struct TimeObject +{ + WellObject* obj; + int ticks_left; + int ticks; + TimeObject() {ticks=ticks_left=0; obj=0;}; + TimeObject(WellObject* wo, int t=1) { obj=wo;ticks_left=ticks=t;}; + void restart_ticks() { ticks_left=ticks; }; + bool operator == (TimeObject& o2) {return o2.obj==obj;}; +}; + +typedef bilist TimeList; //List of objects that want timers +typedef bilist ObjectList; //List of all objects that waht events + +struct WellImage +{ + Images id; //Image id + int l,h; //Size of image + WellImage() { id=imNone; l=h=0;}; +}; + +class WellEngine +{ + protected: + + TimeList timelist; + ObjectList objectlist; + + unsigned int mainl,mainh; // size of main window + bool done_loop_var; + + WellImage images[MAX_IMAGES]; + + virtual void init_mainwindow(int,char**)=0; + virtual int wait_for_timers()=0; + virtual bool process_time_event(); + virtual bool process_event_for_all(wEvent); + + public: + WellEngine(int,char**); + ~WellEngine(); + + virtual void show_main()=0; + virtual void event_loop()=0; + + virtual bool add_timer(WellObject* wo, int ticks); + virtual bool del_timer(WellObject* wo); + virtual bool add_object(WellObject* wo); + virtual bool del_object(WellObject* wo); + virtual void clear_objectlist(); + virtual void done_loop() { done_loop_var=true;}; + + virtual WellDrawingEngine* new_well_drawing_engine(); + virtual WellTopNine* new_well_top_nine(); + virtual WellIntro* new_well_intro(); + virtual WellKey* new_well_key(char*); + virtual WellInput* new_well_input(char*) { return 0;}; + virtual WellSwitch* new_well_switch(char*); + virtual WellImageFont* new_well_image_font(Images id, + unsigned int ifl, + unsigned int ifh, + int idx, int idy) { return 0;}; + + virtual WellBase* new_well_base(); + + virtual bool load_image(Images id, char* name) { return false;}; + virtual void set_main_background_image(Images id) {}; + virtual void screen_copy(Geo*) {}; + virtual void screen_clear(Geo*) {}; + virtual void load_images(); + virtual void udelay(int msec) {}; +}; + +extern WellEngine* default_well_engine; +extern WellEngine* new_well_engine(int argc, char** argv); + +#endif diff --git a/src/include/wellimagefont.h b/src/include/wellimagefont.h new file mode 100644 index 0000000..144dd92 --- /dev/null +++ b/src/include/wellimagefont.h @@ -0,0 +1,37 @@ +#ifndef WELLIMAGEFONT_H +#define WELLIMAGEFONT_H + +#include "globals.h" +#include "welltris.h" +#include "wellsimpledraw.h" + +enum Justify { RightJust, CenterJust, LeftJust }; + +class WellImageFont: public WellSimpleDraw +{ + protected: + Images font_id; + unsigned int font_l, font_h; + int dx,dy; + char text[L_MAXPATH]; + int text_l; + int screen_x,screen_y,screen_l,screen_h; + + virtual void draw_symbol(int ix, int iy, + unsigned int il, + unsigned int ih, + char symb)=0; + public: + WellImageFont(Images id, unsigned int ifl, unsigned int ifh, int idx, int idy); + virtual void set_text(char* itext); + virtual void set_font(unsigned int ifl, unsigned int ifh, + int idx, int idy); + virtual void set_screen_region(int ix, int iy, int il, int ih); + virtual void draw_text(Justify just=LeftJust); + virtual void draw_text(char* text, int text_l, Justify just=LeftJust); + virtual void draw_text(char* text, int text_l, Colors idx, Justify just=LeftJust); + virtual void clear_region()=0; + virtual void clear_region(Colors idx)=0; +}; + +#endif diff --git a/src/include/wellinput.h b/src/include/wellinput.h new file mode 100644 index 0000000..d36304c --- /dev/null +++ b/src/include/wellinput.h @@ -0,0 +1,30 @@ +#ifndef WELLINPUT_H +#define WELLINPUT_H + +#include "globals.h" +#include "wellobject.h" +#include "wellimagefont.h" + +class WellInput: public WellObject +{ + protected: + ObjectCaller object_on_enter; + char buf[L_MAXPATH]; + int buflen,pos,maxlen; + WellImageFont *fnt; + + virtual void draw_text(); + + public: + WellInput(char* keyname); + void set_object_on_enter(ObjectCaller o) { object_on_enter=o;}; + virtual bool process_event(wEvent); + virtual void show(); + virtual void hide(); + virtual void redraw(); + void set_text(char* txt); + void set_max_len(int ml) { maxlen=ml;}; + virtual char* get_text() { return buf;}; +}; + +#endif diff --git a/src/include/wellintro.h b/src/include/wellintro.h new file mode 100644 index 0000000..beb59ed --- /dev/null +++ b/src/include/wellintro.h @@ -0,0 +1,66 @@ +#ifndef WELLINTRO_H +#define WELLINTRO_H + +#include "welltris.h" +#include "wellobject.h" +#include "wellkey.h" +#include "wellimagefont.h" +#include "wellswitch.h" +#include "wellinput.h" + +class WellBase; + +class WellIntro: public WellObject +{ + protected: + ObjectCaller object_on_exit, + object_on_new_game, + object_on_top_nine; + + WellKey *key_exit, *key_new_game, *key_top_nine, + *key_plus, *key_minus; + + WellImageFont *txt_level; + WellBase *well; + + WellSwitch *sw_rotation, *sw_mixed, *sw_next_piece, + *sw_squares[TOTAL_SQUARES]; + + WellInput *inp_player; + + int start_level; + + void draw_start_level(); + char* get_next_token(char* from, char* to); + + public: + WellIntro(); + virtual bool process_event(wEvent); + virtual void show(); + virtual void redraw(); + virtual void hide(); + virtual bool hide_by_call(wEvent); + + void set_object_on_exit(ObjectCaller obj) + + { + object_on_exit=obj; + }; + void set_object_on_new_game(ObjectCaller obj) + + { + object_on_new_game=obj; + }; + void set_object_on_top_nine(ObjectCaller obj) + + { + object_on_top_nine=obj; + }; + void set_well_base(WellBase* o); + void put_all_to_game(); + void load_defaults(); + void load_options(); + void save_options(); +}; + +#endif diff --git a/src/include/wellkey.h b/src/include/wellkey.h new file mode 100644 index 0000000..08444f9 --- /dev/null +++ b/src/include/wellkey.h @@ -0,0 +1,24 @@ +#ifndef WELLKEY_H +#define WELLKEY_H + +#include "wellobject.h" + +class WellKey: public WellObject +{ + protected: + ObjectCaller object_on_press; + bool highlighted; + + bool press(int mx, int my); + bool highlight(int mx, int my); + + public: + WellKey(char* keyname); + void set_object_on_press(ObjectCaller o) { object_on_press=o;}; + virtual bool process_event(wEvent); + virtual void show(); + virtual void hide(); + virtual void redraw(); +}; + +#endif diff --git a/src/include/wellobject.h b/src/include/wellobject.h new file mode 100644 index 0000000..b80ade0 --- /dev/null +++ b/src/include/wellobject.h @@ -0,0 +1,74 @@ +#ifndef WELLOBJECT_H +#define WELLOBJECT_H + +#include "geometry.h" + +enum EvType { + eTimeOut, + eKeyPress, + eMouseMove, + eMousePress, + eExpose, + eDelete, + eFocusOut, + + aEmpty, + aGameOver, + aIntroExit, + aKeyPressed, + aSwitchChanged, + aInputDone +}; + + +enum ButtonState { But1Press, But2Press, But3Press }; + +struct wEvent +{ + EvType type; + void *data; + wEvent(EvType t,void *idata=0) { type=t;data=idata;}; +}; + +struct MouseEvent +{ + int mx,my; + ButtonState bstate; +}; + +//Basic class of all game objects +class WellObject +{ + protected: + bool shown; + Geo *geo; + char object_name[GEO_NAME+1]; + + public: + WellObject() { shown=false; geo=0; object_name[0]=0;}; + virtual bool process_event(wEvent)=0; + virtual void show() { shown=true;}; + virtual bool show_by_call(wEvent) { show(); return true;}; + virtual void hide() { shown=false;}; + virtual bool hide_by_call(wEvent) { hide(); return true;}; + virtual void redraw() {}; + virtual bool redraw_by_call(wEvent) { redraw(); return true;}; +}; + +class ObjectCaller +{ + WellObject *object; + bool (WellObject::*method)(wEvent); + + public: + ObjectCaller() { object=0; method=0;}; + ObjectCaller(WellObject* o,bool (WellObject::*m)(wEvent)) { object=o; method=m;}; + bool call(wEvent ev) + { + if(!object) + return false; + return (object->*method)(ev); + }; +}; + +#endif diff --git a/src/include/wellsimpledraw.h b/src/include/wellsimpledraw.h new file mode 100644 index 0000000..ba85b78 --- /dev/null +++ b/src/include/wellsimpledraw.h @@ -0,0 +1,63 @@ +#ifndef WELLSIMPLEDRAW_H +#define WELLSIMPLEDRAW_H + +#include "bilist.h" + +enum Canvas { screen=0, pixmap=1 }; + +struct WPoint +{ + int x,y; + WPoint() { x=y=0;}; +}; + +struct DirtyRect +{ + int delta_x,delta_y; //here is the delta between dest screen and our dirty screen + int x,y; + unsigned int l,h; + DirtyRect() { x=y=delta_x=delta_y=0;l=h=0;}; + DirtyRect(int dx, int dy, + int ix=0, int iy=0, + unsigned int il=0, unsigned int ih=0) + { + delta_x=dx; delta_y=dy; + x=ix; y=iy; + l=il; h=ih; + }; + int get_src_x() { return x;}; + int get_src_y() { return y;}; + int get_dest_x() { return delta_x+x;}; + int get_dest_y() { return delta_y+y;}; +}; + +typedef bilist DirtyList; + +class WellSimpleDraw +{ + protected: + DirtyList dirty_list; + int max_x,max_y,min_x,min_y; + DirtyRect current_dirty; + int max_dirties; + + public: + WellSimpleDraw(); + ~WellSimpleDraw(); + virtual void new_dirty_rec(int dx=0, int dy=0); + virtual void dirty_add_xy(int,int); + virtual void dirty_add_rec(DirtyRect); + virtual void finish_dirty_rec(); + virtual void clear_dirty_list(); + virtual void draw_line(int x1, int y1, int x2, int y2, int color_idx, + Canvas where=screen) {}; + virtual void draw_rect(int x1, int y1, unsigned int il, + unsigned int ih, int color_idx, + Canvas where=screen) {}; + virtual void fill_rect(int x1, int y1, unsigned int il, + unsigned int ih, int color_idx, + Canvas where=screen) {}; + int get_max_dirties() { return max_dirties;}; +}; + +#endif diff --git a/src/include/wellswitch.h b/src/include/wellswitch.h new file mode 100644 index 0000000..30deef8 --- /dev/null +++ b/src/include/wellswitch.h @@ -0,0 +1,31 @@ +#ifndef WELLSWITCH_H +#define WELLSWITCH_H + +#include "wellobject.h" + +enum SwitchMode { OnlySet, OnlyReset, SetReset}; + +class WellSwitch: public WellObject +{ + protected: + ObjectCaller object_on_switch; + bool highlighted; + bool value; + SwitchMode mode; + + bool press(int mx, int my); + bool highlight(int mx, int my); + + public: + WellSwitch(char* keyname); + void set_object_on_switch(ObjectCaller o) { object_on_switch=o;}; + virtual bool process_event(wEvent); + virtual void show(); + virtual void hide(); + virtual void redraw(); + void set_value(bool v) { value=v; if(shown) redraw();}; + bool get_value() { return value;}; + void set_mode(SwitchMode m) { mode=m;}; +}; + +#endif diff --git a/src/include/welltopnine.h b/src/include/welltopnine.h new file mode 100644 index 0000000..899aaa0 --- /dev/null +++ b/src/include/welltopnine.h @@ -0,0 +1,84 @@ +#ifndef WELLTOPNINE_H +#define WELLTOPNINE_H + +#include "globals.h" +#include "welltris.h" +#include "wellobject.h" +#include "wellimagefont.h" +#include "wellkey.h" + +struct Score +{ + int place; + char player[PLAYER_NAME_LEN+1]; + char date_time[L_DATE]; + int score; + int lines; + int level; + int squares; + bool mixed; + bool rotation; + bool next_piece; + time_t start_t; + int play_time; + + Score(); + void save(FILE* fp); + bool load(FILE* fp); + void set_current_time(); + char* get_next_token(char* from, char* to); + void calc_play_time(); + void set_player(char* pl); + void set_params(int iscore, int ilines, int ilevel) + { + score=iscore; lines=ilines; level=ilevel; + }; +}; + +struct ScoreTable +{ + Score *table[TOP_NINE]; + + ScoreTable(); + ~ScoreTable(); + + void sort_by_score(); + void save(FILE* fp); + void set_squares(int isquares); + Score* set_and_get(int idx, Score *toset); +}; + +class WellTopNine: public WellObject +{ + protected: + ScoreTable tables[MAX_SQUARES]; + WellImageFont* text_lines[TOP_NINE]; + ObjectCaller object_on_exit; + + Score* current_score; + int page; + + WellKey *key_exit; + + public: + WellTopNine(); + + virtual bool process_event(wEvent); + virtual void show(); + virtual void hide(); + virtual void redraw_table(); + bool save_scores(); + bool load_scores(); + Score* try_add_to_table(Score* new_one); + Score* find_challenger(Score* me); + void set_object_on_exit(ObjectCaller o) + { + object_on_exit=o; + }; + void set_page(int pg) { page=pg;}; +}; + +extern WellTopNine *default_top_nine; + + +#endif diff --git a/src/include/welltris.h b/src/include/welltris.h new file mode 100644 index 0000000..aeec493 --- /dev/null +++ b/src/include/welltris.h @@ -0,0 +1,230 @@ +#ifndef WELLTRIS_H +#define WELLTRIS_H +/* +# GENERIC X-BASED WELLTRIS +# +# welltris.h +# +# +# C++ implementation by Leo Khramov, leo@xnc.dubna.su +# +*/ + +/*** random number generator ***/ + +/* insert your favorite */ +extern void SetRNG(long); +extern long LongRNG(); +#define SRAND(X) SetRNG((long) X) +#define LRAND() LongRNG() + +#define NRAND(X) ((int)(LRAND()%(X))) + +/*** macros ***/ + +#define ZLIM(X, Y) (((int) X) < (Y) ? ((int) X) : (Y)) + +/*** constants ***/ + +#ifndef SCOREFILE +#define SCOREFILE "welltris.scores" +#endif +#ifndef POLYOMINOFILE +#define POLYOMINOFILE "polyomino.dat" +#endif + +#define XWELL_DIR ".xwelltris" +#define RC_FILE "xwelltris.rc" + +#define BVOLUME -90 +#define NUM_FLASHES 5 + +#define SAMPLERATE 5000000 +#define FLUSH_DELAY 100000 + +#define MILLION 1000000 +#define PLAYER_NAME_LEN 15 +#define TOP_NINE 9 +#define L_DATE 11 + +#define NUM_LEVELS 19 + + + +#define MAX_WIDTH 8 +#define MAX_DEPTH 12 +#define MAX_SIDES 4 +#define MAX_PERIMETER (MAX_SIDES*MAX_WIDTH) + + +#define EMPTY (-1) +#define NODIAG 0 /* Normal, ie no diagonals */ +#define DIAGONAL 1 /* Normal and diagonal */ +#define NOMIX 0 /* Do not mix lowered number squares with current */ +#define MIXED 1 +#define MAX_MODES 2 +#define NONE 0 /* No rotation or reflection */ +#define NOREFL 1 /* Normal, no reflection allow rotation */ +#define ALL 2 /* Allow reflection or rotation */ +#define MAX_TYPES 3 +#define DEFAULT_SQUARES 4 +#define MIN_SQUARES 2 /* Why not 1 you say? */ +#define MAX_SQUARES 6 +#define TOTAL_SQUARES (MAX_SQUARES - MIN_SQUARES + 1) +#define DEFAULT_DIAGONAL 3 +#define MIN_DIAGONAL 2 +#define MAX_DIAGONAL 3 +#define MAX_POLYOMINOES 216 +#define MAX_START_POLYOMINOES 55 +#define JUMPIN 0 +#define GRADUAL 1 +#define LEGAL(n,g,m,o) ((n>=MIN_SQUARES+m)&&\ + (n<=((g)?MAX_DIAGONAL:MAX_SQUARES)-o)) +#define THRESHOLD(x) ((x)*(x)*4-(x)+1) +#define CHECKUP(x) ((x)%8) +#define CHECKRIGHT(x) (((x)/8)*8+(x)%4) +#define CHECKDOWN(x) (((x)/4)*4+(x)%2) +#define CHECKLEFT(x) (((x)/2)*2) + +/*** types ***/ + +enum Actions { + NOTHING, + FALL, + DROP, + LEFT, + RIGHT, + ROTATE, + REFLECT, + PAUSE_GAME, + END_GAME, + OUTER_ROTATION, + INNER_ROTATION, + LEVEL_UP, + LEVEL_DOWN +}; + +#define SYSCOLORS 7 +#define MAX_GAME_COLORS (MAX_START_POLYOMINOES+SYSCOLORS) +#define COLOR_DELTA MAX_START_POLYOMINOES +#define FREE_COLORS (255 - 211 - SYSCOLORS) +enum Colors {BackColor=COLOR_DELTA, + GridColor=COLOR_DELTA+1, + GridColor2=COLOR_DELTA+2, + FreezeColor=COLOR_DELTA+3, + FlashColor=COLOR_DELTA+4, + BonusColor=COLOR_DELTA+5, + BonusColor2=COLOR_DELTA+6}; + + +enum Images { + imNone=-1, + imBoardBG=0, + imIntroBG=1, + imCuts=2, + imScoreBG=3, + imFont1=4 }; + + +#define MAX_IMAGES 20 + + +#define NEXT_CENTER_X 700 +#define NEXT_CENTER_Y 519 +#define NEXT_BOX_SIZE 15 +#define NEXT_X_SIZE 120 +#define NEXT_Y_SIZE 120 + +//scores region in the game +#define SCORE_REG_X 638 +#define SCORE_REG_Y 112 +#define SCORE_REG_L 126 +#define SCORE_REG_H 30 + +//Lines region in the game +#define LINES_REG_X 775-5*11 +#define LINES_REG_Y 172 +#define LINES_REG_L 55 +#define LINES_REG_H 17 + +//Level up region in the game +#define LEVUP_REG_X 775-4*11 +#define LEVUP_REG_Y 212 +#define LEVUP_REG_L 44 +#define LEVUP_REG_H 17 + +//Level region in the game +#define LEVEL_REG_X 775-3*11 +#define LEVEL_REG_Y 252 +#define LEVEL_REG_L 33 +#define LEVEL_REG_H 17 + +//Challengers region in the game +#define CHAL1_REG_X 613 +#define CHAL1_REG_Y 333 +#define CHAL2_REG_X 613 +#define CHAL2_REG_Y 358 +#define CHAL3_REG_X 613 +#define CHAL3_REG_Y 382 +#define CHAL_REG_L 12*15 +#define CHAL_REG_H 17 + +//Top nine text +#define TOPNINE_TXT_X 30 +#define TOPNINE_TXT_Y 140 +#define TOPNINE_TXT_L 750 +#define TOPNINE_TXT_H 22 +#define TOPNINE_TXT_STEPY 42 + +//challengers display name len in symbols +#define CHAL_NAME_LEN 9 + +//game view and other +#define VIEW_X 30 +#define VIEW_Y 30 +#define VIEW_L 540 +#define VIEW_H 540 + +#define NUM_ROT_STEPS 8 + +//Font sizes, delta ... +#define FONT1_L 10 +#define FONT1_H 18 +#define FONT1_DX 0 +#define FONT1_DY 0 + +#define FONT2_L 19 +#define FONT2_H 30 +#define FONT2_DX 12 +#define FONT2_DY 0 + +#define FONT3_L 15 +#define FONT3_H 23 +#define FONT3_DX 30 +#define FONT3_DY 0 + +#define FONT4_L 15 +#define FONT4_H 24 +#define FONT4_DX 45 +#define FONT4_DY 0 + +#define FONT5_L 15 +#define FONT5_H 24 +#define FONT5_DX 65 +#define FONT5_DY 0 + + +#define GEO_NAME 20 + +//Game geo idexes for wellbase +#define GEO_PAUSE_IDX 0 +#define GEO_ROT_IDX 1 +#define GEO_NEXT_IDX 2 +#define GEO_MIXED_IDX 3 + +#endif + + + + + diff --git a/src/include/xheaders.h b/src/include/xheaders.h new file mode 100644 index 0000000..37883b2 --- /dev/null +++ b/src/include/xheaders.h @@ -0,0 +1,9 @@ + +#include +#include +#include +#include +#include + + + diff --git a/src/main.cxx b/src/main.cxx new file mode 100644 index 0000000..d5abf15 --- /dev/null +++ b/src/main.cxx @@ -0,0 +1,67 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: main.cxx,v 1.3 2003/02/19 09:51:39 leo Exp $ + +/// module description +/// Main module - init the game, create main objects and entering in event loop + +#include "wellengine.h" +#include "wellclass.h" +#include "wellintro.h" + +WellBase *game_object; +WellIntro *game_intro; + +//=========================================================================== +/// global main(int, char**) +/// main function - start of the game +/// tags main +int main(int argc, char** argv) +{ + default_well_engine=new_well_engine(argc,argv); + + game_intro= default_well_engine->new_well_intro(); + default_top_nine=default_well_engine->new_well_top_nine(); + game_object= default_well_engine->new_well_base(); + + default_top_nine->load_scores(); + game_intro->set_well_base(game_object); + game_object->init(default_well_engine); + + game_object->set_object_on_game_over(ObjectCaller(default_top_nine, + &WellObject::show_by_call)); + + game_intro->set_object_on_new_game(ObjectCaller(game_object, + &WellObject::process_event)); + + game_intro->set_object_on_top_nine(ObjectCaller(default_top_nine, + &WellObject::show_by_call)); + + default_top_nine->set_object_on_exit(ObjectCaller(game_intro, + &WellObject::show_by_call)); + default_well_engine->show_main(); + game_intro->show(); + + default_well_engine->event_loop(); + + default_top_nine->save_scores(); + game_intro->save_options(); + + delete game_object; + delete default_top_nine; + delete default_well_engine; + return 0; +} diff --git a/src/makefile.in b/src/makefile.in new file mode 100644 index 0000000..46a3fd0 --- /dev/null +++ b/src/makefile.in @@ -0,0 +1,117 @@ +# XWelltris - a tetris like game +# +# Copyright (C) 2002 by Leo Khramov +# email: leo@xnc.dubna.su +# +# +# 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 2 for more details. +# +include make.conf + +@MCOMMON@ + +.c.o: + $(CC) -c $(CXXINCLUDES) $(INCLUDES) $(CXXOPT) $< -o $@ + +IFACELIBS=@IFACELIBS@ +IFACEINC=@IFACEINC@ +IFACEOBJS=@IFACEOBJS@ + + X11IMAGE = \ + image/sublib/SDL_error.o \ + image/sublib/SDL_rwops.o \ + image/sublib/SDL_surface.o \ + image/sublib/SDL_to_picinfo.o \ + image/sublib/IMG_gif.o \ + image/image.o \ + image/convert.o \ + image/accel.o + X11OBJS = \ + x11/xwellengine.o \ + x11/xwelldrawing.o \ + x11/xwellinput.o \ + x11/xwellimagefont.o + SDLOBJS = \ + sdl/sdl_gfxprimitives.o \ + sdl/sdlwellengine.o \ + sdl/sdlwellimagefont.o \ + sdl/sdlwellinput.o \ + sdl/sdlwelldrawing.o + + OBJS = \ + mydebug.o \ + main.o \ + rndgen.o \ + geometry.o \ + commonfuncs.o \ + wellclass.o \ + welldrawing.o \ + wellengine.o \ + wellsimpledraw.o \ + wellimagefont.o \ + welltopnine.o \ + wellintro.o \ + wellkey.o \ + wellswitch.o \ + wellinput.o \ + $(IFACEOBJS) + + CXXINCLUDES=$(IFACEINC) + CXXOPT=$(DEFS) $(DEB) $(CFLAGS) + LOCAL_LIBRARIES=$(IFACELIBS) $(LIBS) + +PROGRAM =../xwelltris + +all:: $(PROGRAM) + +image/sublib/SDL_error.o: image/sublib/SDL_error.c + cd image && make sublib/SDL_error.o + +image/sublib/SDL_surface.o: image/sublib/SDL_surface.c + cd image && make sublib/SDL_surface.o + +image/sublib/SDL_rwops.o: image/sublib/SDL_rwops.c + cd image && make sublib/SDL_rwops.o + +image/sublib/SDL_to_picinfo.o: image/sublib/SDL_to_picinfo.c + cd image && make sublib/SDL_to_picinfo.o + +image/sublib/IMG_gif.o: image/sublib/IMG_gif.c + cd image && make sublib/IMG_gif.o + +image/accel.o: image/accel.c + cd image && make accel.o + +image/image.o: image/image.cxx + cd image && make image.o + +image/convert.o: image/convert.cxx + cd image && make convert.o + +$(JLOC): FORCE + -(cd jpeg && make) + + +$(PROGRAM): $(OBJS) + $(CXX) -o $@ $(OBJS) $(DEB) $(STRIPPING) $(CFLAGS) $(LDFLAGS) $(LOCAL_LIBRARIES) + +mydebug.o: mydebug.c + $(CC) -c $< $(CXXOPT) $(CXXINCLUDES) $(INCLUDES) $(CPPFLAGS) + +clean: + $(RM) -f *.o + $(RM) -f */*.o + (cd image && make clean) + +tags: FORCE + etags *.cxx x11/*.cxx sdl/*.cxx include/*.h + +FORCE: diff --git a/src/mydebug.c b/src/mydebug.c new file mode 100644 index 0000000..81caa2f --- /dev/null +++ b/src/mydebug.c @@ -0,0 +1,32 @@ +/**************************************************************************** +* Copyright (C) 2001 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ + +//This file contains C functions useful for debugging xnc -> printing. +#include "mydebug.h" + +int debprintf(const char *format,...) +{ + + va_list args; + int n; + + va_start(args, format); + n = fprintf(stderr, "[dbg] "); + n += vfprintf(stderr, format, args); + va_end(args); + fflush(stderr); + return (n); +} + diff --git a/src/rndgen.cxx b/src/rndgen.cxx new file mode 100644 index 0000000..310f483 --- /dev/null +++ b/src/rndgen.cxx @@ -0,0 +1,46 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: rndgen.cxx,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ + +/// module description +/// Dr. Park's algorithm published in the Oct. '88 ACM +/// "Random Number Generators: Good Ones Are Hard To Find" +/// His version available at ftp://cs.wm.edu/pub/rngs.tar +/// Present form by many authors. + + +static int Seed = 1; /* This is required to be 32 bits long */ + +//=========================================================================== +/// global SetRNG(long) +/// Set random seed generator, +/// Given an integer, this routine initializes the RNG seed. +/// tags random_gen +void SetRNG(long s) +{ + Seed = (int) s; +} + +//=========================================================================== +/// global LongRNG() +/// Returns an pseudo random integer between 0 and 2147483647, inclusive. +/// tags random_gen +long LongRNG() +{ + if ((Seed = Seed % 44488 * 48271 - Seed / 44488 * 3399) < 0) + Seed += 2147483647; + return (long) (Seed - 1); +} diff --git a/src/sdl/sdl_gfxprimitives.c b/src/sdl/sdl_gfxprimitives.c new file mode 100644 index 0000000..af84a4c --- /dev/null +++ b/src/sdl/sdl_gfxprimitives.c @@ -0,0 +1,3387 @@ +/* + + SDL_gfxPrimitives - Graphics primitives for SDL surfaces + + LGPL (c) A. Schiffler + +*/ + +#include +#include +#include +#include + +#include "SDL.h" + +#include "sdl_gfxprimitives.h" +#include "sdl_gfxprimitives_font.h" + +/* -===================- */ + +/* Define this flag to use surface blits for alpha blended drawing. */ +/* This is usually slower that direct surface calculations. */ + +#undef SURFACE_ALPHA_PIXEL + +/* ----- Defines for pixel clipping tests */ + +#define clip_xmin(surface) surface->clip_rect.x +#define clip_xmax(surface) surface->clip_rect.x+surface->clip_rect.w-1 +#define clip_ymin(surface) surface->clip_rect.y +#define clip_ymax(surface) surface->clip_rect.y+surface->clip_rect.h-1 + +/* ----- Pixel - fast, no blending, no locking, clipping */ + +int fastPixelColorNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) +{ + int bpp; + Uint8 *p; + + /* + * Honor clipping setup at pixel level + */ + if ((x >= clip_xmin(dst)) && (x <= clip_xmax(dst)) && (y >= clip_ymin(dst)) && (y <= clip_ymax(dst))) { + + /* + * Get destination format + */ + bpp = dst->format->BytesPerPixel; + p = (Uint8 *) dst->pixels + y * dst->pitch + x * bpp; + switch (bpp) { + case 1: + *p = color; + break; + case 2: + *(Uint16 *) p = color; + break; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + p[0] = (color >> 16) & 0xff; + p[1] = (color >> 8) & 0xff; + p[2] = color & 0xff; + } else { + p[0] = color & 0xff; + p[1] = (color >> 8) & 0xff; + p[2] = (color >> 16) & 0xff; + } + break; + case 4: + *(Uint32 *) p = color; + break; + } /* switch */ + + + } + + return (0); +} + +/* ----- Pixel - fast, no blending, no locking, no clipping */ + +/* (faster but dangerous, make sure we stay in surface bounds) */ + +int fastPixelColorNolockNoclip(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) +{ + int bpp; + Uint8 *p; + + /* + * Get destination format + */ + bpp = dst->format->BytesPerPixel; + p = (Uint8 *) dst->pixels + y * dst->pitch + x * bpp; + switch (bpp) { + case 1: + *p = color; + break; + case 2: + *(Uint16 *) p = color; + break; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + p[0] = (color >> 16) & 0xff; + p[1] = (color >> 8) & 0xff; + p[2] = color & 0xff; + } else { + p[0] = color & 0xff; + p[1] = (color >> 8) & 0xff; + p[2] = (color >> 16) & 0xff; + } + break; + case 4: + *(Uint32 *) p = color; + break; + } /* switch */ + + return (0); +} + +/* ----- Pixel - fast, no blending, locking, clipping */ + +int fastPixelColor(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) +{ + int result; + + /* + * Lock the surface + */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return (-1); + } + } + + result = fastPixelColorNolock(dst, x, y, color); + + /* + * Unlock surface + */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return (result); +} + +/* ----- Pixel - fast, no blending, locking, RGB input */ + +int fastPixelRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + Uint32 color; + + /* + * Setup color + */ + color = SDL_MapRGBA(dst->format, r, g, b, a); + + /* + * Draw + */ + return (fastPixelColor(dst, x, y, color)); + +} + +/* ----- Pixel - fast, no blending, no locking RGB input */ + +int fastPixelRGBANolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + Uint32 color; + + /* + * Setup color + */ + color = SDL_MapRGBA(dst->format, r, g, b, a); + + /* + * Draw + */ + return (fastPixelColorNolock(dst, x, y, color)); +} + +#ifdef SURFACE_ALPHA_PIXEL + +/* ----- Pixel - using single pixel blit with blending enabled if a<255 */ + +/* Old, slower routine - normally disabled */ + +static SDL_Surface *gfxPrimitivesSinglePixel = NULL; + +int pixelColor(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) +{ + SDL_Rect srect; + SDL_Rect drect; + int result; + + /* + * Setup source rectangle for pixel + */ + srect.x = 0; + srect.y = 0; + srect.w = 1; + srect.h = 1; + + /* + * Setup destination rectangle for pixel + */ + drect.x = x; + drect.y = y; + drect.w = 1; + drect.h = 1; + + /* + * Create single pixel in 32bit RGBA format + */ + if (gfxPrimitivesSinglePixel == NULL) { + gfxPrimitivesSinglePixel = + SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_HWSURFACE | SDL_SRCALPHA, 1, 1, + 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); + } + + /* + * Draw color into pixel + */ + SDL_FillRect(gfxPrimitivesSinglePixel, &srect, color); + + /* + * Draw pixel onto destination surface + */ + result = SDL_BlitSurface(gfxPrimitivesSinglePixel, &srect, dst, &drect); + + return (result); +} + +#else + +/* PutPixel routine with alpha blending, input color in destination format */ + +/* New, faster routine - default blending pixel */ + +int _putPixelAlpha(SDL_Surface * surface, Sint16 x, Sint16 y, Uint32 color, Uint8 alpha) +{ + Uint32 Rmask = surface->format->Rmask, Gmask = + surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask; + Uint32 R, G, B, A = 0; + + if (x >= clip_xmin(surface) && x <= clip_xmax(surface) + && y >= clip_ymin(surface) && y <= clip_ymax(surface)) { + + switch (surface->format->BytesPerPixel) { + case 1:{ /* Assuming 8-bpp */ + if (alpha == 255) { + *((Uint8 *) surface->pixels + y * surface->pitch + x) = color; + } else { + Uint8 *pixel = (Uint8 *) surface->pixels + y * surface->pitch + x; + + Uint8 dR = surface->format->palette->colors[*pixel].r; + Uint8 dG = surface->format->palette->colors[*pixel].g; + Uint8 dB = surface->format->palette->colors[*pixel].b; + Uint8 sR = surface->format->palette->colors[color].r; + Uint8 sG = surface->format->palette->colors[color].g; + Uint8 sB = surface->format->palette->colors[color].b; + + dR = dR + ((sR - dR) * alpha >> 8); + dG = dG + ((sG - dG) * alpha >> 8); + dB = dB + ((sB - dB) * alpha >> 8); + + *pixel = SDL_MapRGB(surface->format, dR, dG, dB); + } + } + break; + + case 2:{ /* Probably 15-bpp or 16-bpp */ + if (alpha == 255) { + *((Uint16 *) surface->pixels + y * surface->pitch / 2 + x) = color; + } else { + Uint16 *pixel = (Uint16 *) surface->pixels + y * surface->pitch / 2 + x; + Uint32 dc = *pixel; + + R = ((dc & Rmask) + (((color & Rmask) - (dc & Rmask)) * alpha >> 8)) & Rmask; + G = ((dc & Gmask) + (((color & Gmask) - (dc & Gmask)) * alpha >> 8)) & Gmask; + B = ((dc & Bmask) + (((color & Bmask) - (dc & Bmask)) * alpha >> 8)) & Bmask; + if (Amask) + A = ((dc & Amask) + (((color & Amask) - (dc & Amask)) * alpha >> 8)) & Amask; + + *pixel = R | G | B | A; + } + } + break; + + case 3:{ /* Slow 24-bpp mode, usually not used */ + Uint8 *pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; + Uint8 rshift8 = surface->format->Rshift / 8; + Uint8 gshift8 = surface->format->Gshift / 8; + Uint8 bshift8 = surface->format->Bshift / 8; + Uint8 ashift8 = surface->format->Ashift / 8; + + + if (alpha == 255) { + *(pix + rshift8) = color >> surface->format->Rshift; + *(pix + gshift8) = color >> surface->format->Gshift; + *(pix + bshift8) = color >> surface->format->Bshift; + *(pix + ashift8) = color >> surface->format->Ashift; + } else { + Uint8 dR, dG, dB, dA = 0; + Uint8 sR, sG, sB, sA = 0; + + pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; + + dR = *((pix) + rshift8); + dG = *((pix) + gshift8); + dB = *((pix) + bshift8); + dA = *((pix) + ashift8); + + sR = (color >> surface->format->Rshift) & 0xff; + sG = (color >> surface->format->Gshift) & 0xff; + sB = (color >> surface->format->Bshift) & 0xff; + sA = (color >> surface->format->Ashift) & 0xff; + + dR = dR + ((sR - dR) * alpha >> 8); + dG = dG + ((sG - dG) * alpha >> 8); + dB = dB + ((sB - dB) * alpha >> 8); + dA = dA + ((sA - dA) * alpha >> 8); + + *((pix) + rshift8) = dR; + *((pix) + gshift8) = dG; + *((pix) + bshift8) = dB; + *((pix) + ashift8) = dA; + } + } + break; + + case 4:{ /* Probably 32-bpp */ + if (alpha == 255) { + *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; + } else { + Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; + Uint32 dc = *pixel; + + R = ((dc & Rmask) + (((color & Rmask) - (dc & Rmask)) * alpha >> 8)) & Rmask; + G = ((dc & Gmask) + (((color & Gmask) - (dc & Gmask)) * alpha >> 8)) & Gmask; + B = ((dc & Bmask) + (((color & Bmask) - (dc & Bmask)) * alpha >> 8)) & Bmask; + if (Amask) + A = ((dc & Amask) + (((color & Amask) - (dc & Amask)) * alpha >> 8)) & Amask; + + *pixel = R | G | B | A; + } + } + break; + } + } + + return (0); +} + +/* ----- Pixel - pixel draw with blending enabled if a<255 */ + +int pixelColor(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) +{ + Uint8 alpha; + Uint32 mcolor; + int result = 0; + + /* + * Lock the surface + */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return (-1); + } + } + + /* + * Setup color + */ + alpha = color & 0x000000ff; + mcolor = + SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, + (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); + + /* + * Draw + */ + result = _putPixelAlpha(dst, x, y, mcolor, alpha); + + /* + * Unlock the surface + */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return (result); +} + +int pixelColorNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) +{ + Uint8 alpha; + Uint32 mcolor; + int result = 0; + + /* + * Setup color + */ + alpha = color & 0x000000ff; + mcolor = + SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, + (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); + + /* + * Draw + */ + result = _putPixelAlpha(dst, x, y, mcolor, alpha); + + return (result); +} + + +/* Filled rectangle with alpha blending, color in destination format */ + +int _filledRectAlpha(SDL_Surface * surface, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color, Uint8 alpha) +{ + Uint32 Rmask = surface->format->Rmask, Gmask = + surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask; + Uint32 R, G, B, A = 0; + Sint16 x, y; + + switch (surface->format->BytesPerPixel) { + case 1:{ /* Assuming 8-bpp */ + Uint8 *row, *pixel; + Uint8 dR, dG, dB; + + Uint8 sR = surface->format->palette->colors[color].r; + Uint8 sG = surface->format->palette->colors[color].g; + Uint8 sB = surface->format->palette->colors[color].b; + + for (y = y1; y <= y2; y++) { + row = (Uint8 *) surface->pixels + y * surface->pitch; + for (x = x1; x <= x2; x++) { + pixel = row + x; + + dR = surface->format->palette->colors[*pixel].r; + dG = surface->format->palette->colors[*pixel].g; + dB = surface->format->palette->colors[*pixel].b; + + dR = dR + ((sR - dR) * alpha >> 8); + dG = dG + ((sG - dG) * alpha >> 8); + dB = dB + ((sB - dB) * alpha >> 8); + + *pixel = SDL_MapRGB(surface->format, dR, dG, dB); + } + } + } + break; + + case 2:{ /* Probably 15-bpp or 16-bpp */ + Uint16 *row, *pixel; + Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask), dA = (color & Amask); + + for (y = y1; y <= y2; y++) { + row = (Uint16 *) surface->pixels + y * surface->pitch / 2; + for (x = x1; x <= x2; x++) { + pixel = row + x; + + R = ((*pixel & Rmask) + ((dR - (*pixel & Rmask)) * alpha >> 8)) & Rmask; + G = ((*pixel & Gmask) + ((dG - (*pixel & Gmask)) * alpha >> 8)) & Gmask; + B = ((*pixel & Bmask) + ((dB - (*pixel & Bmask)) * alpha >> 8)) & Bmask; + if (Amask) + A = ((*pixel & Amask) + ((dA - (*pixel & Amask)) * alpha >> 8)) & Amask; + + *pixel = R | G | B | A; + } + } + } + break; + + case 3:{ /* Slow 24-bpp mode, usually not used */ + Uint8 *row, *pix; + Uint8 dR, dG, dB, dA; + Uint8 rshift8 = surface->format->Rshift / 8; + Uint8 gshift8 = surface->format->Gshift / 8; + Uint8 bshift8 = surface->format->Bshift / 8; + Uint8 ashift8 = surface->format->Ashift / 8; + + Uint8 sR = (color >> surface->format->Rshift) & 0xff; + Uint8 sG = (color >> surface->format->Gshift) & 0xff; + Uint8 sB = (color >> surface->format->Bshift) & 0xff; + Uint8 sA = (color >> surface->format->Ashift) & 0xff; + + for (y = y1; y <= y2; y++) { + row = (Uint8 *) surface->pixels + y * surface->pitch; + for (x = x1; x <= x2; x++) { + pix = row + x * 3; + + dR = *((pix) + rshift8); + dG = *((pix) + gshift8); + dB = *((pix) + bshift8); + dA = *((pix) + ashift8); + + dR = dR + ((sR - dR) * alpha >> 8); + dG = dG + ((sG - dG) * alpha >> 8); + dB = dB + ((sB - dB) * alpha >> 8); + dA = dA + ((sA - dA) * alpha >> 8); + + *((pix) + rshift8) = dR; + *((pix) + gshift8) = dG; + *((pix) + bshift8) = dB; + *((pix) + ashift8) = dA; + } + } + + } + break; + + case 4:{ /* Probably 32-bpp */ + Uint32 *row, *pixel; + Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask), dA = (color & Amask); + + for (y = y1; y <= y2; y++) { + row = (Uint32 *) surface->pixels + y * surface->pitch / 4; + for (x = x1; x <= x2; x++) { + pixel = row + x; + + R = ((*pixel & Rmask) + ((dR - (*pixel & Rmask)) * alpha >> 8)) & Rmask; + G = ((*pixel & Gmask) + ((dG - (*pixel & Gmask)) * alpha >> 8)) & Gmask; + B = ((*pixel & Bmask) + ((dB - (*pixel & Bmask)) * alpha >> 8)) & Bmask; + if (Amask) + A = ((*pixel & Amask) + ((dA - (*pixel & Amask)) * alpha >> 8)) & Amask; + + *pixel = R | G | B | A; + } + } + } + break; + } + + return (0); +} + +/* Draw rectangle with alpha enabled from RGBA color. */ + +int filledRectAlpha(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) +{ + Uint8 alpha; + Uint32 mcolor; + int result = 0; + + /* + * Lock the surface + */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return (-1); + } + } + + /* + * Setup color + */ + alpha = color & 0x000000ff; + mcolor = + SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, + (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); + + /* + * Draw + */ + result = _filledRectAlpha(dst, x1, y1, x2, y2, mcolor, alpha); + + /* + * Unlock the surface + */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return (result); +} + +/* Draw horizontal line with alpha enabled from RGBA color */ + +int HLineAlpha(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color) +{ + return (filledRectAlpha(dst, x1, y, x2, y, color)); +} + + +/* Draw vertical line with alpha enabled from RGBA color */ + +int VLineAlpha(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color) +{ + return (filledRectAlpha(dst, x, y1, x, y2, color)); +} + +#endif + + +/* Pixel - using alpha weight on color for AA-drawing */ + +int pixelColorWeight(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color, Uint32 weight) +{ + Uint32 a; + + /* + * Get alpha + */ + a = (color & (Uint32) 0x000000ff); + + /* + * Modify Alpha by weight + */ + a = ((a * weight) >> 8); + + return (pixelColor(dst, x, y, (color & (Uint32) 0xffffff00) | (Uint32) a)); +} + +/* Pixel - using alpha weight on color for AA-drawing - no locking */ + +int pixelColorWeightNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color, Uint32 weight) +{ + Uint32 a; + + /* + * Get alpha + */ + a = (color & (Uint32) 0x000000ff); + + /* + * Modify Alpha by weight + */ + a = ((a * weight) >> 8); + + return (pixelColorNolock(dst, x, y, (color & (Uint32) 0xffffff00) | (Uint32) a)); +} + +int pixelRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + Uint32 color; + + /* + * Check Alpha + */ + if (a == 255) { + /* + * No alpha blending required + */ + /* + * Setup color + */ + color = SDL_MapRGBA(dst->format, r, g, b, a); + /* + * Draw + */ + return (fastPixelColor(dst, x, y, color)); + } else { + /* + * Alpha blending required + */ + /* + * Draw + */ + return (pixelColor(dst, x, y, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); + } +} + +/* ----- Horizontal line */ + +#ifdef SURFACE_ALPHA_PIXEL +static SDL_Surface *gfxPrimitivesHline = NULL; +#endif + +int hlineColor(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color) +{ + Sint16 left, right, top, bottom; + Uint8 *pixel, *pixellast; + int dx; + int pixx, pixy; + Sint16 w; + Sint16 xtmp; + int result = -1; + Uint8 *colorptr; + +#ifdef SURFACE_ALPHA_PIXEL + Uint32 a; + SDL_Rect srect; + SDL_Rect drect; +#endif + + /* + * Get clipping boundary + */ + left = dst->clip_rect.x; + right = dst->clip_rect.x + dst->clip_rect.w - 1; + top = dst->clip_rect.y; + bottom = dst->clip_rect.y + dst->clip_rect.h - 1; + + /* + * Swap x1, x2 if required + */ + if (x1 > x2) { + xtmp = x1; + x1 = x2; + x2 = xtmp; + } + + /* + * Visible + */ + if ((x1 > right) || (x2 < left) || (y < top) || (y > bottom)) { + return (0); + } + + /* + * Clip x + */ + if (x1 < left) { + x1 = left; + } + if (x2 > right) { + x2 = right; + } + + /* + * Calculate width + */ + w = x2 - x1; + + /* + * Sanity check on width + */ + if (w < 0) { + return (0); + } + + /* + * Alpha check + */ + if ((color & 255) == 255) { + + /* + * No alpha-blending required + */ + + /* + * Setup color + */ + colorptr = (Uint8 *) & color; + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); + } else { + color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); + } + + /* + * Lock surface + */ + SDL_LockSurface(dst); + + /* + * More variable setup + */ + dx = w; + pixx = dst->format->BytesPerPixel; + pixy = dst->pitch; + pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y; + + /* + * Draw + */ + switch (dst->format->BytesPerPixel) { + case 1: + memset(pixel, color, dx); + break; + case 2: + pixellast = pixel + dx + dx; + for (; pixel <= pixellast; pixel += pixx) { + *(Uint16 *) pixel = color; + } + break; + case 3: + pixellast = pixel + dx + dx + dx; + for (; pixel <= pixellast; pixel += pixx) { + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + pixel[0] = (color >> 16) & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = color & 0xff; + } else { + pixel[0] = color & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = (color >> 16) & 0xff; + } + } + break; + default: /* case 4 */ + dx = dx + dx; + pixellast = pixel + dx + dx; + for (; pixel <= pixellast; pixel += pixx) { + *(Uint32 *) pixel = color; + } + break; + } + + /* + * Unlock surface + */ + SDL_UnlockSurface(dst); + + /* + * Set result code + */ + result = 0; + + } else { + + /* + * Alpha blending blit + */ + +#ifdef SURFACE_ALPHA_PIXEL + + /* + * Adjust width for Rect setup + */ + w++; + + /* + * Setup source rectangle for pixel + */ + srect.x = 0; + srect.y = 0; + srect.w = w; + srect.h = 1; + + /* + * Setup rectangle for destination line + */ + drect.x = x1; + drect.y = y; + drect.w = w; + drect.h = 1; + + /* + * Maybe deallocate existing surface if size is too small + */ + if ((gfxPrimitivesHline != NULL) && (gfxPrimitivesHline->w < w)) { + SDL_FreeSurface(gfxPrimitivesHline); + gfxPrimitivesHline = NULL; + } + + /* + * Create horizontal line surface in destination format if necessary + */ + if (gfxPrimitivesHline == NULL) { + gfxPrimitivesHline = + SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_HWSURFACE | SDL_SRCALPHA, w, + 1, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); + } + + /* + * Get alpha + */ + a = (color & (Uint32) 0x000000ff); + + /* + * Toggle alpha blending if necessary, reset otherwise + */ + if (a != 255) { + SDL_SetAlpha(gfxPrimitivesHline, SDL_SRCALPHA, 255); + } else { + SDL_SetAlpha(gfxPrimitivesHline, 0, 255); + } + + /* + * Draw color into pixel + */ + SDL_FillRect(gfxPrimitivesHline, &srect, color); + + /* + * Draw pixel onto destination surface + */ + result = SDL_BlitSurface(gfxPrimitivesHline, &srect, dst, &drect); + +#else + + result = HLineAlpha(dst, x1, x1 + w, y, color); + +#endif + + } + + return (result); +} + +int hlineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (hlineColor(dst, x1, x2, y, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ----- Vertical line */ + +#ifdef SURFACE_ALPHA_PIXEL +static SDL_Surface *gfxPrimitivesVline = NULL; +#endif + +int vlineColor(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color) +{ + Sint16 left, right, top, bottom; + Uint8 *pixel, *pixellast; + int dy; + int pixx, pixy; + Sint16 h; + Sint16 ytmp; + int result = -1; + Uint8 *colorptr; + +#ifdef SURFACE_ALPHA_PIXEL + SDL_Rect srect; + SDL_Rect drect; + Uint32 a; +#endif + + /* + * Get clipping boundary + */ + left = dst->clip_rect.x; + right = dst->clip_rect.x + dst->clip_rect.w - 1; + top = dst->clip_rect.y; + bottom = dst->clip_rect.y + dst->clip_rect.h - 1; + + /* + * Swap y1, y2 if required + */ + if (y1 > y2) { + ytmp = y1; + y1 = y2; + y2 = ytmp; + } + + /* + * Visible + */ + if ((y2 < top) || (y1 > bottom) || (x < left) || (x > right)) { + return (0); + } + + /* + * Clip y + */ + if (y1 < top) { + y1 = top; + } + if (y2 > bottom) { + y2 = bottom; + } + + /* + * Calculate height + */ + h = y2 - y1; + + /* + * Sanity check on height + */ + if (h < 0) { + return (0); + } + + /* + * Alpha check + */ + if ((color & 255) == 255) { + + /* + * No alpha-blending required + */ + + /* + * Setup color + */ + colorptr = (Uint8 *) & color; + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); + } else { + color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); + } + + /* + * Lock surface + */ + SDL_LockSurface(dst); + + /* + * More variable setup + */ + dy = h; + pixx = dst->format->BytesPerPixel; + pixy = dst->pitch; + pixel = ((Uint8 *) dst->pixels) + pixx * (int) x + pixy * (int) y1; + pixellast = pixel + pixy * dy; + + /* + * Draw + */ + switch (dst->format->BytesPerPixel) { + case 1: + for (; pixel <= pixellast; pixel += pixy) { + *(Uint8 *) pixel = color; + } + break; + case 2: + for (; pixel <= pixellast; pixel += pixy) { + *(Uint16 *) pixel = color; + } + break; + case 3: + for (; pixel <= pixellast; pixel += pixy) { + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + pixel[0] = (color >> 16) & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = color & 0xff; + } else { + pixel[0] = color & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = (color >> 16) & 0xff; + } + } + break; + default: /* case 4 */ + for (; pixel <= pixellast; pixel += pixy) { + *(Uint32 *) pixel = color; + } + break; + } + + /* + * Unlock surface + */ + SDL_UnlockSurface(dst); + + /* + * Set result code + */ + result = 0; + + } else { + + /* + * Alpha blending blit + */ + +#ifdef SURFACE_ALPHA_PIXEL + + /* + * Adjust height for Rect setup + */ + h++; + + /* + * Setup source rectangle for pixel + */ + srect.x = 0; + srect.y = 0; + srect.w = 1; + srect.h = h; + + /* + * Setup rectangle for line + */ + drect.x = x; + drect.y = y1; + drect.w = 1; + drect.h = h; + + /* + * Maybe deallocate existing surface if size is too small + */ + if ((gfxPrimitivesVline != NULL) && (gfxPrimitivesVline->h < h)) { + SDL_FreeSurface(gfxPrimitivesVline); + gfxPrimitivesVline = NULL; + } + + /* + * Create horizontal line surface in destination format if necessary + */ + if (gfxPrimitivesVline == NULL) { + gfxPrimitivesVline = + SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_HWSURFACE | SDL_SRCALPHA, 1, + h, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); + } + + /* + * Get alpha + */ + a = (color & (Uint32) 0x000000ff); + + /* + * Toggle alpha blending if necessary, reset otherwise + */ + if (a != 255) { + SDL_SetAlpha(gfxPrimitivesVline, SDL_SRCALPHA, 255); + } else { + SDL_SetAlpha(gfxPrimitivesVline, 0, 255); + } + + /* + * Draw color into pixel + */ + SDL_FillRect(gfxPrimitivesVline, &srect, color); + + /* + * Draw Vline onto destination surface + */ + result = SDL_BlitSurface(gfxPrimitivesVline, &srect, dst, &drect); + +#else + + result = VLineAlpha(dst, x, y1, y1 + h, color); + +#endif + + } + + return (result); +} + +int vlineRGBA(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (vlineColor(dst, x, y1, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ----- Rectangle */ + +int rectangleColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) +{ + int result; + Sint16 w, h, xtmp, ytmp; + + + /* + * Swap x1, x2 if required + */ + if (x1 > x2) { + xtmp = x1; + x1 = x2; + x2 = xtmp; + } + + /* + * Swap y1, y2 if required + */ + if (y1 > y2) { + ytmp = y1; + y1 = y2; + y2 = ytmp; + } + + /* + * Calculate width&height + */ + w = x2 - x1; + h = y2 - y1; + + /* + * Sanity check + */ + if ((w < 0) || (h < 0)) { + return (0); + } + + /* + * Test for special cases of straight lines or single point + */ + if (x1 == x2) { + if (y1 == y2) { + return (pixelColor(dst, x1, y1, color)); + } else { + return (vlineColor(dst, x1, y1, y2, color)); + } + } else { + if (y1 == y2) { + return (hlineColor(dst, x1, x2, y1, color)); + } + } + + /* + * Draw rectangle + */ + result = 0; + result |= vlineColor(dst, x1, y1, y2, color); + result |= vlineColor(dst, x2, y1, y2, color); + result |= hlineColor(dst, x1, x2, y1, color); + result |= hlineColor(dst, x1, x2, y2, color); + + return (result); + +} + +int rectangleRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (rectangleColor + (dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* --------- Clipping routines for box/line */ + +/* Clipping based heavily on code from */ + +/* http://www.ncsa.uiuc.edu/Vis/Graphics/src/clipCohSuth.c */ + +#define CLIP_LEFT_EDGE 0x1 +#define CLIP_RIGHT_EDGE 0x2 +#define CLIP_BOTTOM_EDGE 0x4 +#define CLIP_TOP_EDGE 0x8 +#define CLIP_INSIDE(a) (!a) +#define CLIP_REJECT(a,b) (a&b) +#define CLIP_ACCEPT(a,b) (!(a|b)) + +static int clipEncode(Sint16 x, Sint16 y, Sint16 left, Sint16 top, Sint16 right, Sint16 bottom) +{ + int code = 0; + + if (x < left) { + code |= CLIP_LEFT_EDGE; + } else if (x > right) { + code |= CLIP_RIGHT_EDGE; + } + if (y < top) { + code |= CLIP_TOP_EDGE; + } else if (y > bottom) { + code |= CLIP_BOTTOM_EDGE; + } + return code; +} + +static int clipLine(SDL_Surface * dst, Sint16 * x1, Sint16 * y1, Sint16 * x2, Sint16 * y2) +{ + Sint16 left, right, top, bottom; + int code1, code2; + int draw = 0; + Sint16 swaptmp; + float m; + + /* + * Get clipping boundary + */ + left = dst->clip_rect.x; + right = dst->clip_rect.x + dst->clip_rect.w - 1; + top = dst->clip_rect.y; + bottom = dst->clip_rect.y + dst->clip_rect.h - 1; + + while (1) { + code1 = clipEncode(*x1, *y1, left, top, right, bottom); + code2 = clipEncode(*x2, *y2, left, top, right, bottom); + if (CLIP_ACCEPT(code1, code2)) { + draw = 1; + break; + } else if (CLIP_REJECT(code1, code2)) + break; + else { + if (CLIP_INSIDE(code1)) { + swaptmp = *x2; + *x2 = *x1; + *x1 = swaptmp; + swaptmp = *y2; + *y2 = *y1; + *y1 = swaptmp; + swaptmp = code2; + code2 = code1; + code1 = swaptmp; + } + if (*x2 != *x1) { + m = (*y2 - *y1) / (float) (*x2 - *x1); + } else { + m = 1.0f; + } + if (code1 & CLIP_LEFT_EDGE) { + *y1 += (Sint16) ((left - *x1) * m); + *x1 = left; + } else if (code1 & CLIP_RIGHT_EDGE) { + *y1 += (Sint16) ((right - *x1) * m); + *x1 = right; + } else if (code1 & CLIP_BOTTOM_EDGE) { + if (*x2 != *x1) { + *x1 += (Sint16) ((bottom - *y1) / m); + } + *y1 = bottom; + } else if (code1 & CLIP_TOP_EDGE) { + if (*x2 != *x1) { + *x1 += (Sint16) ((top - *y1) / m); + } + *y1 = top; + } + } + } + + return draw; +} + +/* ----- Filled rectangle (Box) */ + +#ifdef SURFACE_ALPHA_PIXEL +static SDL_Surface *gfxPrimitivesBox = NULL; +#endif + +int boxColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) +{ + Uint8 *pixel, *pixellast; + int x, dx; + int dy; + int pixx, pixy; + Sint16 w, h, tmp; + int result; + Uint8 *colorptr; + +#ifdef SURFACE_ALPHA_PIXEL + Uint32 a; + SDL_Rect srect; + SDL_Rect drect; +#endif + + /* + * Clip diagonal and test if we have to draw + */ + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return (0); + } + + /* + * Test for special cases of straight lines or single point + */ + if (x1 == x2) { + if (y1 < y2) { + return (vlineColor(dst, x1, y1, y2, color)); + } else if (y1 > y2) { + return (vlineColor(dst, x1, y2, y1, color)); + } else { + return (pixelColor(dst, x1, y1, color)); + } + } + if (y1 == y2) { + if (x1 < x2) { + return (hlineColor(dst, x1, x2, y1, color)); + } else if (x1 > x2) { + return (hlineColor(dst, x2, x1, y1, color)); + } + } + + /* + * Order coordinates + */ + if (x1 > x2) { + tmp = x1; + x1 = x2; + x2 = tmp; + } + if (y1 > y2) { + tmp = y1; + y1 = y2; + y2 = tmp; + } + + /* + * Calculate width&height + */ + w = x2 - x1; + h = y2 - y1; + + /* + * Alpha check + */ + if ((color & 255) == 255) { + + /* + * No alpha-blending required + */ + + /* + * Setup color + */ + colorptr = (Uint8 *) & color; + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); + } else { + color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); + } + + /* + * Lock surface + */ + SDL_LockSurface(dst); + + /* + * More variable setup + */ + dx = w; + dy = h; + pixx = dst->format->BytesPerPixel; + pixy = dst->pitch; + pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; + pixellast = pixel + pixx * dx + pixy * dy; + + /* + * Draw + */ + switch (dst->format->BytesPerPixel) { + case 1: + for (; pixel <= pixellast; pixel += pixy) { + memset(pixel, (Uint8) color, dx); + } + break; + case 2: + pixy -= (pixx * dx); + for (; pixel <= pixellast; pixel += pixy) { + for (x = 0; x < dx; x++) { + *(Uint16 *) pixel = color; + pixel += pixx; + } + } + break; + case 3: + pixy -= (pixx * dx); + for (; pixel <= pixellast; pixel += pixy) { + for (x = 0; x < dx; x++) { + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + pixel[0] = (color >> 16) & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = color & 0xff; + } else { + pixel[0] = color & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = (color >> 16) & 0xff; + } + pixel += pixx; + } + } + break; + default: /* case 4 */ + pixy -= (pixx * dx); + for (; pixel <= pixellast; pixel += pixy) { + for (x = 0; x < dx; x++) { + *(Uint32 *) pixel = color; + pixel += pixx; + } + } + break; + } + + /* + * Unlock surface + */ + SDL_UnlockSurface(dst); + + result = 0; + + } else { + +#ifdef SURFACE_ALPHA_PIXEL + + /* + * Setup source rectangle for pixel + */ + srect.x = 0; + srect.y = 0; + srect.w = w; + srect.h = h; + + /* + * Setup rectangle for line + */ + drect.x = x1; + drect.y = y1; + drect.w = w; + drect.h = h; + + /* + * Maybe deallocate existing surface if size is too small + */ + if ((gfxPrimitivesBox != NULL) + && ((gfxPrimitivesBox->w < w) || (gfxPrimitivesBox->h < h))) { + SDL_FreeSurface(gfxPrimitivesBox); + gfxPrimitivesBox = NULL; + } + + /* + * Create box surface in destination format if necessary + */ + if (gfxPrimitivesBox == NULL) { + gfxPrimitivesBox = + SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_HWSURFACE | SDL_SRCALPHA, w, + h, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); + } + + /* + * Get alpha + */ + a = (color & (Uint32) 0x000000ff); + + /* + * Toggle alpha blending if necessary, reset otherwise + */ + if (a != 255) { + SDL_SetAlpha(gfxPrimitivesBox, SDL_SRCALPHA, 255); + } else { + SDL_SetAlpha(gfxPrimitivesBox, 0, 255); + } + + /* + * Draw color into pixel + */ + SDL_FillRect(gfxPrimitivesBox, &srect, color); + + /* + * Draw pixel onto destination surface + */ + result = SDL_BlitSurface(gfxPrimitivesBox, &srect, dst, &drect); + +#else + + result = filledRectAlpha(dst, x1, y1, x1 + w, y1 + h, color); + +#endif + + } + + return (result); +} + +int boxRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (boxColor(dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ----- Line */ + +/* Non-alpha line drawing code adapted from routine */ +/* by Pete Shinners, pete@shinners.org */ +/* Originally from pygame, http://pygame.seul.org */ + +#define ABS(a) (((a)<0) ? -(a) : (a)) + +int lineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) +{ + int pixx, pixy; + int x, y; + int dx, dy; + int ax, ay; + int sx, sy; + int swaptmp; + Uint8 *pixel; + Uint8 *colorptr; + + /* + * Clip line and test if we have to draw + */ + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return (0); + } + + /* + * Test for special cases of straight lines or single point + */ + if (x1 == x2) { + if (y1 < y2) { + return (vlineColor(dst, x1, y1, y2, color)); + } else if (y1 > y2) { + return (vlineColor(dst, x1, y2, y1, color)); + } else { + return (pixelColor(dst, x1, y1, color)); + } + } + if (y1 == y2) { + if (x1 < x2) { + return (hlineColor(dst, x1, x2, y1, color)); + } else if (x1 > x2) { + return (hlineColor(dst, x2, x1, y1, color)); + } + } + + /* + * Variable setup + */ + dx = x2 - x1; + dy = y2 - y1; + sx = (dx >= 0) ? 1 : -1; + sy = (dy >= 0) ? 1 : -1; + + /* Lock surface */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return (-1); + } + } + + /* + * Check for alpha blending + */ + if ((color & 255) == 255) { + + /* + * No alpha blending - use fast pixel routines + */ + + /* + * Setup color + */ + colorptr = (Uint8 *) & color; + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); + } else { + color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); + } + + /* + * More variable setup + */ + dx = sx * dx + 1; + dy = sy * dy + 1; + pixx = dst->format->BytesPerPixel; + pixy = dst->pitch; + pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; + pixx *= sx; + pixy *= sy; + if (dx < dy) { + swaptmp = dx; + dx = dy; + dy = swaptmp; + swaptmp = pixx; + pixx = pixy; + pixy = swaptmp; + } + + /* + * Draw + */ + x = 0; + y = 0; + switch (dst->format->BytesPerPixel) { + case 1: + for (; x < dx; x++, pixel += pixx) { + *pixel = color; + y += dy; + if (y >= dx) { + y -= dx; + pixel += pixy; + } + } + break; + case 2: + for (; x < dx; x++, pixel += pixx) { + *(Uint16 *) pixel = color; + y += dy; + if (y >= dx) { + y -= dx; + pixel += pixy; + } + } + break; + case 3: + for (; x < dx; x++, pixel += pixx) { + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + pixel[0] = (color >> 16) & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = color & 0xff; + } else { + pixel[0] = color & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = (color >> 16) & 0xff; + } + y += dy; + if (y >= dx) { + y -= dx; + pixel += pixy; + } + } + break; + default: /* case 4 */ + for (; x < dx; x++, pixel += pixx) { + *(Uint32 *) pixel = color; + y += dy; + if (y >= dx) { + y -= dx; + pixel += pixy; + } + } + break; + } + + } else { + + /* + * Alpha blending required - use single-pixel blits + */ + + ax = ABS(dx) << 1; + ay = ABS(dy) << 1; + x = x1; + y = y1; + if (ax > ay) { + int d = ay - (ax >> 1); + + while (x != x2) { + pixelColorNolock (dst, x, y, color); + if (d > 0 || (d == 0 && sx == 1)) { + y += sy; + d -= ax; + } + x += sx; + d += ay; + } + } else { + int d = ax - (ay >> 1); + + while (y != y2) { + pixelColorNolock (dst, x, y, color); + if (d > 0 || ((d == 0) && (sy == 1))) { + x += sx; + d -= ay; + } + y += sy; + d += ax; + } + } + pixelColorNolock (dst, x, y, color); + + } + + /* Unlock surface */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return (0); +} + +int lineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (lineColor(dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* AA Line */ + +#define AAlevels 256 +#define AAbits 8 + +/* + +This implementation of the Wu antialiasing code is based on Mike Abrash's +DDJ article which was reprinted as Chapter 42 of his Graphics Programming +Black Book, but has been optimized to work with SDL and utilizes 32-bit +fixed-point arithmetic. (A. Schiffler). + +*/ + +int aalineColorInt(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color, int draw_endpoint) +{ + Sint32 xx0, yy0, xx1, yy1; + int result; + Uint32 intshift, erracc, erradj; + Uint32 erracctmp, wgt, wgtcompmask; + int dx, dy, tmp, xdir, y0p1, x0pxdir; + + /* + * Clip line and test if we have to draw + */ + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return (0); + } + + /* + * Keep on working with 32bit numbers + */ + xx0 = x1; + yy0 = y1; + xx1 = x2; + yy1 = y2; + + /* + * Reorder points if required + */ + if (yy0 > yy1) { + tmp = yy0; + yy0 = yy1; + yy1 = tmp; + tmp = xx0; + xx0 = xx1; + xx1 = tmp; + } + + /* + * Calculate distance + */ + dx = xx1 - xx0; + dy = yy1 - yy0; + + /* + * Adjust for negative dx and set xdir + */ + if (dx >= 0) { + xdir = 1; + } else { + xdir = -1; + dx = (-dx); + } + + /* + * Check for special cases + */ + if (dx == 0) { + /* + * Vertical line + */ + return (vlineColor(dst, x1, y1, y2, color)); + } else if (dy == 0) { + /* + * Horizontal line + */ + return (hlineColor(dst, x1, x2, y1, color)); + } else if (dx == dy) { + /* + * Diagonal line + */ + return (lineColor(dst, x1, y1, x2, y2, color)); + } + + /* + * Line is not horizontal, vertical or diagonal + */ + result = 0; + + /* + * Zero accumulator + */ + erracc = 0; + + /* + * # of bits by which to shift erracc to get intensity level + */ + intshift = 32 - AAbits; + /* + * Mask used to flip all bits in an intensity weighting + */ + wgtcompmask = AAlevels - 1; + + /* Lock surface */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return (-1); + } + } + + /* + * Draw the initial pixel in the foreground color + */ + result |= pixelColorNolock(dst, x1, y1, color); + + /* + * x-major or y-major? + */ + if (dy > dx) { + + /* + * y-major. Calculate 16-bit fixed point fractional part of a pixel that + * X advances every time Y advances 1 pixel, truncating the result so that + * we won't overrun the endpoint along the X axis + */ + /* + * Not-so-portable version: erradj = ((Uint64)dx << 32) / (Uint64)dy; + */ + erradj = ((dx << 16) / dy) << 16; + + /* + * draw all pixels other than the first and last + */ + x0pxdir = xx0 + xdir; + while (--dy) { + erracctmp = erracc; + erracc += erradj; + if (erracc <= erracctmp) { + /* + * rollover in error accumulator, x coord advances + */ + xx0 = x0pxdir; + x0pxdir += xdir; + } + yy0++; /* y-major so always advance Y */ + + /* + * the AAbits most significant bits of erracc give us the intensity + * weighting for this pixel, and the complement of the weighting for + * the paired pixel. + */ + wgt = (erracc >> intshift) & 255; + result |= pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); + result |= pixelColorWeightNolock (dst, x0pxdir, yy0, color, wgt); + } + + } else { + + /* + * x-major line. Calculate 16-bit fixed-point fractional part of a pixel + * that Y advances each time X advances 1 pixel, truncating the result so + * that we won't overrun the endpoint along the X axis. + */ + /* + * Not-so-portable version: erradj = ((Uint64)dy << 32) / (Uint64)dx; + */ + erradj = ((dy << 16) / dx) << 16; + + /* + * draw all pixels other than the first and last + */ + y0p1 = yy0 + 1; + while (--dx) { + + erracctmp = erracc; + erracc += erradj; + if (erracc <= erracctmp) { + /* + * Accumulator turned over, advance y + */ + yy0 = y0p1; + y0p1++; + } + xx0 += xdir; /* x-major so always advance X */ + /* + * the AAbits most significant bits of erracc give us the intensity + * weighting for this pixel, and the complement of the weighting for + * the paired pixel. + */ + wgt = (erracc >> intshift) & 255; + result |= pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); + result |= pixelColorWeightNolock (dst, xx0, y0p1, color, wgt); + } + } + + /* + * Do we have to draw the endpoint + */ + if (draw_endpoint) { + /* + * Draw final pixel, always exactly intersected by the line and doesn't + * need to be weighted. + */ + result |= pixelColorNolock (dst, x2, y2, color); + } + + /* Unlock surface */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return (result); +} + +int aalineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) +{ + return (aalineColorInt(dst, x1, y1, x2, y2, color, 1)); +} + +int aalineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + return (aalineColorInt + (dst, x1, y1, x2, y2, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a, 1)); +} + + +/* ----- Circle */ + +/* Note: Based on algorithm from sge library, modified by A. Schiffler */ + +/* with multiple pixel-draw removal and other minor speedup changes. */ + +int circleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color) +{ + int result; + Sint16 x1, y1, x2, y2; + Sint16 cx = 0; + Sint16 cy = r; + Sint16 ocx = (Sint16) 0xffff; + Sint16 ocy = (Sint16) 0xffff; + Sint16 df = 1 - r; + Sint16 d_e = 3; + Sint16 d_se = -2 * r + 5; + Sint16 xpcx, xmcx, xpcy, xmcy; + Sint16 ypcy, ymcy, ypcx, ymcx; + Uint8 *colorptr; + + /* + * Sanity check radius + */ + if (r < 0) { + return (-1); + } + + /* + * Special case for r=0 - draw a point + */ + if (r == 0) { + return (pixelColor(dst, x, y, color)); + } + + /* + * Test if bounding box of circle is visible + */ + x1 = x - r; + y1 = y - r; + x2 = x + r; + y2 = y + r; + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return (0); + } + + /* + * Draw circle + */ + result = 0; + + /* Lock surface */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return (-1); + } + } + + /* + * Alpha Check + */ + if ((color & 255) == 255) { + + /* + * No Alpha - direct memory writes + */ + + /* + * Setup color + */ + colorptr = (Uint8 *) & color; + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); + } else { + color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); + } + + /* + * Draw + */ + do { + if ((ocy != cy) || (ocx != cx)) { + xpcx = x + cx; + xmcx = x - cx; + if (cy > 0) { + ypcy = y + cy; + ymcy = y - cy; + result |= fastPixelColorNolock(dst, xmcx, ypcy, color); + result |= fastPixelColorNolock(dst, xpcx, ypcy, color); + result |= fastPixelColorNolock(dst, xmcx, ymcy, color); + result |= fastPixelColorNolock(dst, xpcx, ymcy, color); + } else { + result |= fastPixelColorNolock(dst, xmcx, y, color); + result |= fastPixelColorNolock(dst, xpcx, y, color); + } + ocy = cy; + xpcy = x + cy; + xmcy = x - cy; + if (cx > 0) { + ypcx = y + cx; + ymcx = y - cx; + result |= fastPixelColorNolock(dst, xmcy, ypcx, color); + result |= fastPixelColorNolock(dst, xpcy, ypcx, color); + result |= fastPixelColorNolock(dst, xmcy, ymcx, color); + result |= fastPixelColorNolock(dst, xpcy, ymcx, color); + } else { + result |= fastPixelColorNolock(dst, xmcy, y, color); + result |= fastPixelColorNolock(dst, xpcy, y, color); + } + ocx = cx; + } + /* + * Update + */ + if (df < 0) { + df += d_e; + d_e += 2; + d_se += 2; + } else { + df += d_se; + d_e += 2; + d_se += 4; + cy--; + } + cx++; + } while (cx <= cy); + + /* + * Unlock surface + */ + SDL_UnlockSurface(dst); + + } else { + + /* + * Using Alpha - blended pixel blits + */ + + do { + /* + * Draw + */ + if ((ocy != cy) || (ocx != cx)) { + xpcx = x + cx; + xmcx = x - cx; + if (cy > 0) { + ypcy = y + cy; + ymcy = y - cy; + result |= pixelColorNolock (dst, xmcx, ypcy, color); + result |= pixelColorNolock (dst, xpcx, ypcy, color); + result |= pixelColorNolock (dst, xmcx, ymcy, color); + result |= pixelColorNolock (dst, xpcx, ymcy, color); + } else { + result |= pixelColorNolock (dst, xmcx, y, color); + result |= pixelColorNolock (dst, xpcx, y, color); + } + ocy = cy; + xpcy = x + cy; + xmcy = x - cy; + if (cx > 0) { + ypcx = y + cx; + ymcx = y - cx; + result |= pixelColorNolock (dst, xmcy, ypcx, color); + result |= pixelColorNolock (dst, xpcy, ypcx, color); + result |= pixelColorNolock (dst, xmcy, ymcx, color); + result |= pixelColorNolock (dst, xpcy, ymcx, color); + } else { + result |= pixelColorNolock (dst, xmcy, y, color); + result |= pixelColorNolock (dst, xpcy, y, color); + } + ocx = cx; + } + /* + * Update + */ + if (df < 0) { + df += d_e; + d_e += 2; + d_se += 2; + } else { + df += d_se; + d_e += 2; + d_se += 4; + cy--; + } + cx++; + } while (cx <= cy); + + } /* Alpha check */ + + /* Unlock surface */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return (result); +} + +int circleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (circleColor(dst, x, y, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ----- AA Circle */ + +/* AA circle is based on AAellipse */ + +int aacircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color) +{ + return (aaellipseColor(dst, x, y, r, r, color)); +} + +int aacircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (aaellipseColor + (dst, x, y, rad, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ----- Filled Circle */ + +/* Note: Based on algorithm from sge library with multiple-hline draw removal */ + +/* and other speedup changes. */ + +int filledCircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color) +{ + int result; + Sint16 x1, y1, x2, y2; + Sint16 cx = 0; + Sint16 cy = r; + Sint16 ocx = (Sint16) 0xffff; + Sint16 ocy = (Sint16) 0xffff; + Sint16 df = 1 - r; + Sint16 d_e = 3; + Sint16 d_se = -2 * r + 5; + Sint16 xpcx, xmcx, xpcy, xmcy; + Sint16 ypcy, ymcy, ypcx, ymcx; + + /* + * Sanity check radius + */ + if (r < 0) { + return (-1); + } + + /* + * Special case for r=0 - draw a point + */ + if (r == 0) { + return (pixelColor(dst, x, y, color)); + } + + /* + * Test bounding box + */ + x1 = x - r; + y1 = y - r; + x2 = x + r; + y2 = y + r; + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return (0); + } + + /* + * Draw + */ + result = 0; + do { + xpcx = x + cx; + xmcx = x - cx; + xpcy = x + cy; + xmcy = x - cy; + if (ocy != cy) { + if (cy > 0) { + ypcy = y + cy; + ymcy = y - cy; + result |= hlineColor(dst, xmcx, xpcx, ypcy, color); + result |= hlineColor(dst, xmcx, xpcx, ymcy, color); + } else { + result |= hlineColor(dst, xmcx, xpcx, y, color); + } + ocy = cy; + } + if (ocx != cx) { + if (cx != cy) { + if (cx > 0) { + ypcx = y + cx; + ymcx = y - cx; + result |= hlineColor(dst, xmcy, xpcy, ymcx, color); + result |= hlineColor(dst, xmcy, xpcy, ypcx, color); + } else { + result |= hlineColor(dst, xmcy, xpcy, y, color); + } + } + ocx = cx; + } + /* + * Update + */ + if (df < 0) { + df += d_e; + d_e += 2; + d_se += 2; + } else { + df += d_se; + d_e += 2; + d_se += 4; + cy--; + } + cx++; + } while (cx <= cy); + + return (result); +} + +int filledCircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (filledCircleColor + (dst, x, y, rad, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + + +/* ----- Ellipse */ + +/* Note: Based on algorithm from sge library with multiple-hline draw removal */ + +/* and other speedup changes. */ + +int ellipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color) +{ + int result; + Sint16 x1, y1, x2, y2; + int ix, iy; + int h, i, j, k; + int oh, oi, oj, ok; + int xmh, xph, ypk, ymk; + int xmi, xpi, ymj, ypj; + int xmj, xpj, ymi, ypi; + int xmk, xpk, ymh, yph; + Uint8 *colorptr; + + /* + * Sanity check radii + */ + if ((rx < 0) || (ry < 0)) { + return (-1); + } + + /* + * Special case for rx=0 - draw a vline + */ + if (rx == 0) { + return (vlineColor(dst, x, y - ry, y + ry, color)); + } + /* + * Special case for ry=0 - draw a hline + */ + if (ry == 0) { + return (hlineColor(dst, x - rx, x + rx, y, color)); + } + + /* + * Test bounding box + */ + x1 = x - rx; + y1 = y - ry; + x2 = x + rx; + y2 = y + ry; + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return (0); + } + + /* + * Init vars + */ + oh = oi = oj = ok = 0xFFFF; + + /* + * Draw + */ + result = 0; + + /* Lock surface */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return (-1); + } + } + + /* + * Check alpha + */ + if ((color & 255) == 255) { + + /* + * No Alpha - direct memory writes + */ + + /* + * Setup color + */ + colorptr = (Uint8 *) & color; + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); + } else { + color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); + } + + + if (rx > ry) { + ix = 0; + iy = rx * 64; + + do { + h = (ix + 32) >> 6; + i = (iy + 32) >> 6; + j = (h * ry) / rx; + k = (i * ry) / rx; + + if (((ok != k) && (oj != k)) || ((oj != j) && (ok != j)) || (k != j)) { + xph = x + h; + xmh = x - h; + if (k > 0) { + ypk = y + k; + ymk = y - k; + result |= fastPixelColorNolock(dst, xmh, ypk, color); + result |= fastPixelColorNolock(dst, xph, ypk, color); + result |= fastPixelColorNolock(dst, xmh, ymk, color); + result |= fastPixelColorNolock(dst, xph, ymk, color); + } else { + result |= fastPixelColorNolock(dst, xmh, y, color); + result |= fastPixelColorNolock(dst, xph, y, color); + } + ok = k; + xpi = x + i; + xmi = x - i; + if (j > 0) { + ypj = y + j; + ymj = y - j; + result |= fastPixelColorNolock(dst, xmi, ypj, color); + result |= fastPixelColorNolock(dst, xpi, ypj, color); + result |= fastPixelColorNolock(dst, xmi, ymj, color); + result |= fastPixelColorNolock(dst, xpi, ymj, color); + } else { + result |= fastPixelColorNolock(dst, xmi, y, color); + result |= fastPixelColorNolock(dst, xpi, y, color); + } + oj = j; + } + + ix = ix + iy / rx; + iy = iy - ix / rx; + + } while (i > h); + } else { + ix = 0; + iy = ry * 64; + + do { + h = (ix + 32) >> 6; + i = (iy + 32) >> 6; + j = (h * rx) / ry; + k = (i * rx) / ry; + + if (((oi != i) && (oh != i)) || ((oh != h) && (oi != h) && (i != h))) { + xmj = x - j; + xpj = x + j; + if (i > 0) { + ypi = y + i; + ymi = y - i; + result |= fastPixelColorNolock(dst, xmj, ypi, color); + result |= fastPixelColorNolock(dst, xpj, ypi, color); + result |= fastPixelColorNolock(dst, xmj, ymi, color); + result |= fastPixelColorNolock(dst, xpj, ymi, color); + } else { + result |= fastPixelColorNolock(dst, xmj, y, color); + result |= fastPixelColorNolock(dst, xpj, y, color); + } + oi = i; + xmk = x - k; + xpk = x + k; + if (h > 0) { + yph = y + h; + ymh = y - h; + result |= fastPixelColorNolock(dst, xmk, yph, color); + result |= fastPixelColorNolock(dst, xpk, yph, color); + result |= fastPixelColorNolock(dst, xmk, ymh, color); + result |= fastPixelColorNolock(dst, xpk, ymh, color); + } else { + result |= fastPixelColorNolock(dst, xmk, y, color); + result |= fastPixelColorNolock(dst, xpk, y, color); + } + oh = h; + } + + ix = ix + iy / ry; + iy = iy - ix / ry; + + } while (i > h); + } + + } else { + + if (rx > ry) { + ix = 0; + iy = rx * 64; + + do { + h = (ix + 32) >> 6; + i = (iy + 32) >> 6; + j = (h * ry) / rx; + k = (i * ry) / rx; + + if (((ok != k) && (oj != k)) || ((oj != j) && (ok != j)) || (k != j)) { + xph = x + h; + xmh = x - h; + if (k > 0) { + ypk = y + k; + ymk = y - k; + result |= pixelColorNolock (dst, xmh, ypk, color); + result |= pixelColorNolock (dst, xph, ypk, color); + result |= pixelColorNolock (dst, xmh, ymk, color); + result |= pixelColorNolock (dst, xph, ymk, color); + } else { + result |= pixelColorNolock (dst, xmh, y, color); + result |= pixelColorNolock (dst, xph, y, color); + } + ok = k; + xpi = x + i; + xmi = x - i; + if (j > 0) { + ypj = y + j; + ymj = y - j; + result |= pixelColorNolock (dst, xmi, ypj, color); + result |= pixelColorNolock (dst, xpi, ypj, color); + result |= pixelColorNolock (dst, xmi, ymj, color); + result |= pixelColor(dst, xpi, ymj, color); + } else { + result |= pixelColorNolock (dst, xmi, y, color); + result |= pixelColorNolock (dst, xpi, y, color); + } + oj = j; + } + + ix = ix + iy / rx; + iy = iy - ix / rx; + + } while (i > h); + } else { + ix = 0; + iy = ry * 64; + + do { + h = (ix + 32) >> 6; + i = (iy + 32) >> 6; + j = (h * rx) / ry; + k = (i * rx) / ry; + + if (((oi != i) && (oh != i)) || ((oh != h) && (oi != h) && (i != h))) { + xmj = x - j; + xpj = x + j; + if (i > 0) { + ypi = y + i; + ymi = y - i; + result |= pixelColorNolock (dst, xmj, ypi, color); + result |= pixelColorNolock (dst, xpj, ypi, color); + result |= pixelColorNolock (dst, xmj, ymi, color); + result |= pixelColorNolock (dst, xpj, ymi, color); + } else { + result |= pixelColorNolock (dst, xmj, y, color); + result |= pixelColorNolock (dst, xpj, y, color); + } + oi = i; + xmk = x - k; + xpk = x + k; + if (h > 0) { + yph = y + h; + ymh = y - h; + result |= pixelColorNolock (dst, xmk, yph, color); + result |= pixelColorNolock (dst, xpk, yph, color); + result |= pixelColorNolock (dst, xmk, ymh, color); + result |= pixelColorNolock (dst, xpk, ymh, color); + } else { + result |= pixelColorNolock (dst, xmk, y, color); + result |= pixelColorNolock (dst, xpk, y, color); + } + oh = h; + } + + ix = ix + iy / ry; + iy = iy - ix / ry; + + } while (i > h); + } + + } /* Alpha check */ + + /* Unlock surface */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return (result); +} + +int ellipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (ellipseColor(dst, x, y, rx, ry, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ----- AA Ellipse */ + +/* Based on code from Anders Lindstroem, based on code from SGE, based on code from TwinLib */ + +int aaellipseColor(SDL_Surface * dst, Sint16 xc, Sint16 yc, Sint16 rx, Sint16 ry, Uint32 color) +{ + int i; + int a2, b2, ds, dt, dxt, t, s, d; + Sint16 x, y, xs, ys, dyt, xx, yy, xc2, yc2; + float cp; + Uint8 weight, iweight; + int result; + + /* Sanity check radius */ + if (rx < 1) + rx = 1; + if (ry < 1) + ry = 1; + + /* Variable setup */ + a2 = rx * rx; + b2 = ry * ry; + + ds = 2 * a2; + dt = 2 * b2; + + xc2 = 2 * xc; + yc2 = 2 * yc; + + dxt = (int) (a2 / sqrt(a2 + b2)); + + t = 0; + s = -2 * a2 * ry; + d = 0; + + x = xc; + y = yc - ry; + + + /* Draw */ + result = 0; + + /* Lock surface */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return (-1); + } + } + + /* "End points" */ + result |= pixelColorNolock(dst, x, y, color); + result |= pixelColorNolock(dst, xc2 - x, y, color); + result |= pixelColorNolock(dst, x, yc2 - y, color); + result |= pixelColorNolock(dst, xc2 - x, yc2 - y, color); + + for (i = 1; i <= dxt; i++) { + x--; + d += t - b2; + + if (d >= 0) + ys = y - 1; + else if ((d - s - a2) > 0) { + if ((2 * d - s - a2) >= 0) + ys = y + 1; + else { + ys = y; + y++; + d -= s + a2; + s += ds; + } + } else { + y++; + ys = y + 1; + d -= s + a2; + s += ds; + } + + t -= dt; + + /* Calculate alpha */ + if (s != 0.0) { + cp = (float) abs(d) / (float) abs(s); + if (cp > 1.0) { + cp = 1.0; + } + } else { + cp = 1.0; + } + + /* Calculate weights */ + weight = (Uint8) (cp * 255); + iweight = 255 - weight; + + /* Upper half */ + xx = xc2 - x; + result |= pixelColorWeightNolock(dst, x, y, color, iweight); + result |= pixelColorWeightNolock(dst, xx, y, color, iweight); + + result |= pixelColorWeightNolock(dst, x, ys, color, weight); + result |= pixelColorWeightNolock(dst, xx, ys, color, weight); + + /* Lower half */ + yy = yc2 - y; + result |= pixelColorWeightNolock(dst, x, yy, color, iweight); + result |= pixelColorWeightNolock(dst, xx, yy, color, iweight); + + yy = yc2 - ys; + result |= pixelColorWeightNolock(dst, x, yy, color, weight); + result |= pixelColorWeightNolock(dst, xx, yy, color, weight); + } + + dyt = abs(y - yc); + + for (i = 1; i <= dyt; i++) { + y++; + d -= s + a2; + + if (d <= 0) + xs = x + 1; + else if ((d + t - b2) < 0) { + if ((2 * d + t - b2) <= 0) + xs = x - 1; + else { + xs = x; + x--; + d += t - b2; + t -= dt; + } + } else { + x--; + xs = x - 1; + d += t - b2; + t -= dt; + } + + s += ds; + + /* Calculate alpha */ + if (t != 0.0) { + cp = (float) abs(d) / (float) abs(t); + if (cp > 1.0) { + cp = 1.0; + } + } else { + cp = 1.0; + } + + /* Calculate weight */ + weight = (Uint8) (cp * 255); + iweight = 255 - weight; + + /* Left half */ + xx = xc2 - x; + yy = yc2 - y; + result |= pixelColorWeightNolock(dst, x, y, color, iweight); + result |= pixelColorWeightNolock(dst, xx, y, color, iweight); + + result |= pixelColorWeightNolock(dst, x, yy, color, iweight); + result |= pixelColorWeightNolock(dst, xx, yy, color, iweight); + + /* Right half */ + xx = 2 * xc - xs; + result |= pixelColorWeightNolock(dst, xs, y, color, weight); + result |= pixelColorWeightNolock(dst, xx, y, color, weight); + + result |= pixelColorWeightNolock(dst, xs, yy, color, weight); + result |= pixelColorWeightNolock(dst, xx, yy, color, weight); + + + } + + /* Unlock surface */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return (result); +} + +int aaellipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (aaellipseColor + (dst, x, y, rx, ry, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ---- Filled Ellipse */ + +/* Note: */ +/* Based on algorithm from sge library with multiple-hline draw removal */ +/* and other speedup changes. */ + +int filledEllipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color) +{ + int result; + Sint16 x1, y1, x2, y2; + int ix, iy; + int h, i, j, k; + int oh, oi, oj, ok; + int xmh, xph; + int xmi, xpi; + int xmj, xpj; + int xmk, xpk; + + /* + * Sanity check radii + */ + if ((rx < 0) || (ry < 0)) { + return (-1); + } + + /* + * Special case for rx=0 - draw a vline + */ + if (rx == 0) { + return (vlineColor(dst, x, y - ry, y + ry, color)); + } + /* + * Special case for ry=0 - draw a hline + */ + if (ry == 0) { + return (hlineColor(dst, x - rx, x + rx, y, color)); + } + + /* + * Test bounding box + */ + x1 = x - rx; + y1 = y - ry; + x2 = x + rx; + y2 = y + ry; + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return (0); + } + + /* + * Init vars + */ + oh = oi = oj = ok = 0xFFFF; + + /* + * Draw + */ + result = 0; + if (rx > ry) { + ix = 0; + iy = rx * 64; + + do { + h = (ix + 32) >> 6; + i = (iy + 32) >> 6; + j = (h * ry) / rx; + k = (i * ry) / rx; + + if ((ok != k) && (oj != k)) { + xph = x + h; + xmh = x - h; + if (k > 0) { + result |= hlineColor(dst, xmh, xph, y + k, color); + result |= hlineColor(dst, xmh, xph, y - k, color); + } else { + result |= hlineColor(dst, xmh, xph, y, color); + } + ok = k; + } + if ((oj != j) && (ok != j) && (k != j)) { + xmi = x - i; + xpi = x + i; + if (j > 0) { + result |= hlineColor(dst, xmi, xpi, y + j, color); + result |= hlineColor(dst, xmi, xpi, y - j, color); + } else { + result |= hlineColor(dst, xmi, xpi, y, color); + } + oj = j; + } + + ix = ix + iy / rx; + iy = iy - ix / rx; + + } while (i > h); + } else { + ix = 0; + iy = ry * 64; + + do { + h = (ix + 32) >> 6; + i = (iy + 32) >> 6; + j = (h * rx) / ry; + k = (i * rx) / ry; + + if ((oi != i) && (oh != i)) { + xmj = x - j; + xpj = x + j; + if (i > 0) { + result |= hlineColor(dst, xmj, xpj, y + i, color); + result |= hlineColor(dst, xmj, xpj, y - i, color); + } else { + result |= hlineColor(dst, xmj, xpj, y, color); + } + oi = i; + } + if ((oh != h) && (oi != h) && (i != h)) { + xmk = x - k; + xpk = x + k; + if (h > 0) { + result |= hlineColor(dst, xmk, xpk, y + h, color); + result |= hlineColor(dst, xmk, xpk, y - h, color); + } else { + result |= hlineColor(dst, xmk, xpk, y, color); + } + oh = h; + } + + ix = ix + iy / ry; + iy = iy - ix / ry; + + } while (i > h); + } + + return (result); +} + + +int filledEllipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (filledEllipseColor + (dst, x, y, rx, ry, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ----- filled pie */ + +/* Low-speed float pie-calc implementation by drawing polygons. */ + +int filledpieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color) +{ + int result; + Sint16 x1, y1, x2, y2; + double angle, start_angle, end_angle; + double deltaAngle; + double dr; + int posX, posY; + int numpoints, i; + Sint16 *vx, *vy; + + /* + * Sanity check radii + */ + if (rad < 0) { + return (-1); + } + + /* + * Fixup angles + */ + start = start % 360; + end = end % 360; + + /* + * Special case for rad=0 - draw a point + */ + if (rad == 0) { + return (pixelColor(dst, x, y, color)); + } + + /* + * Test bounding box for visibility + */ + x1 = x - rad; + y1 = y - rad; + x2 = x + rad; + y2 = y + rad; + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return (0); + } + + /* + * Variable setup + */ + dr = (double) rad; + deltaAngle = 3.0 / dr; + start_angle = (double) start *(2.0 * M_PI / 360.0); + end_angle = (double) end *(2.0 * M_PI / 360.0); + if (start > end) { + end_angle += (2.0 * M_PI); + } + + /* Count points (rather than calculate it) */ + numpoints = 1; + angle = start_angle; + while (angle <= end_angle) { + angle += deltaAngle; + numpoints++; + } + + /* Check size of array */ + if (numpoints == 1) { + return (pixelColor(dst, x, y, color)); + } else if (numpoints == 2) { + posX = x + (int) (dr * cos(start_angle)); + posY = y + (int) (dr * sin(start_angle)); + return (lineColor(dst, x, y, posX, posY, color)); + } + + /* Allocate vertex array */ + vx = vy = (Uint16 *) malloc(2 * sizeof(Uint16) * numpoints); + if (vx == NULL) { + return (-1); + } + vy += numpoints; + + /* Center */ + vx[0] = x; + vy[0] = y; + + /* Calculate and store vertices */ + i = 1; + angle = start_angle; + while (angle <= end_angle) { + vx[i] = x + (int) (dr * cos(angle)); + vy[i] = y + (int) (dr * sin(angle)); + angle += deltaAngle; + i++; + } + + /* Draw */ + result = filledPolygonColor(dst, vx, vy, numpoints, color); + + /* Free vertex */ + free(vx); + + return (result); +} + +int filledpieRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, + Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + return (filledpieColor(dst, x, y, rad, start, end, + ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); + +} + +/* ---- Polygon */ + +int polygonColor(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, Uint32 color) +{ + int result; + int i; + Sint16 *x1, *y1, *x2, *y2; + + /* + * Sanity check + */ + if (n < 3) { + return (-1); + } + + /* + * Pointer setup + */ + x1 = x2 = vx; + y1 = y2 = vy; + x2++; + y2++; + + /* + * Draw + */ + result = 0; + for (i = 1; i < n; i++) { + result |= lineColor(dst, *x1, *y1, *x2, *y2, color); + x1 = x2; + y1 = y2; + x2++; + y2++; + } + result |= lineColor(dst, *x1, *y1, *vx, *vy, color); + + return (result); +} + +int polygonRGBA(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (polygonColor(dst, vx, vy, n, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ---- AA-Polygon */ + +int aapolygonColor(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, Uint32 color) +{ + int result; + int i; + Sint16 *x1, *y1, *x2, *y2; + + /* + * Sanity check + */ + if (n < 3) { + return (-1); + } + + /* + * Pointer setup + */ + x1 = x2 = vx; + y1 = y2 = vy; + x2++; + y2++; + + /* + * Draw + */ + result = 0; + for (i = 1; i < n; i++) { + result |= aalineColorInt(dst, *x1, *y1, *x2, *y2, color, 0); + x1 = x2; + y1 = y2; + x2++; + y2++; + } + result |= aalineColorInt(dst, *x1, *y1, *vx, *vy, color, 0); + + return (result); +} + +int aapolygonRGBA(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (aapolygonColor(dst, vx, vy, n, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +/* ---- Filled Polygon */ + +int gfxPrimitivesCompareInt(const void *a, const void *b); + +static int *gfxPrimitivesPolyInts = NULL; +static int gfxPrimitivesPolyAllocated = 0; + +int filledPolygonColor(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, int color) +{ + int result; + int i; + int y; + int miny, maxy; + int x1, y1; + int x2, y2; + int ind1, ind2; + int ints; + + /* + * Sanity check + */ + if (n < 3) { + return -1; + } + + /* + * Allocate temp array, only grow array + */ + if (!gfxPrimitivesPolyAllocated) { + gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); + gfxPrimitivesPolyAllocated = n; + } else { + if (gfxPrimitivesPolyAllocated < n) { + gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); + gfxPrimitivesPolyAllocated = n; + } + } + + /* + * Determine Y maxima + */ + miny = vy[0]; + maxy = vy[0]; + for (i = 1; (i < n); i++) { + if (vy[i] < miny) { + miny = vy[i]; + } else if (vy[i] > maxy) { + maxy = vy[i]; + } + } + + /* + * Draw, scanning y + */ + result = 0; + for (y = miny; (y <= maxy); y++) { + ints = 0; + for (i = 0; (i < n); i++) { + if (!i) { + ind1 = n - 1; + ind2 = 0; + } else { + ind1 = i - 1; + ind2 = i; + } + y1 = vy[ind1]; + y2 = vy[ind2]; + if (y1 < y2) { + x1 = vx[ind1]; + x2 = vx[ind2]; + } else if (y1 > y2) { + y2 = vy[ind1]; + y1 = vy[ind2]; + x2 = vx[ind1]; + x1 = vx[ind2]; + } else { + continue; + } + if ((y >= y1) && (y < y2)) { + gfxPrimitivesPolyInts[ints++] = (y - y1) * (x2 - x1) / (y2 - y1) + x1; + } else if ((y == maxy) && (y > y1) && (y <= y2)) { + gfxPrimitivesPolyInts[ints++] = (y - y1) * (x2 - x1) / (y2 - y1) + x1; + } + } + qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); + + for (i = 0; (i < ints); i += 2) { + result |= hlineColor(dst, gfxPrimitivesPolyInts[i], gfxPrimitivesPolyInts[i + 1], y, color); + } + } + + return (result); +} + +int filledPolygonRGBA(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (filledPolygonColor + (dst, vx, vy, n, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +int gfxPrimitivesCompareInt(const void *a, const void *b) +{ + return (*(const int *) a) - (*(const int *) b); +} + +/* ---- Character (8x8 internal font) */ + +static SDL_Surface *gfxPrimitivesFont[256]; +static Uint32 gfxPrimitivesFontColor[256]; + +int characterColor(SDL_Surface * dst, Sint16 x, Sint16 y, char c, Uint32 color) +{ + SDL_Rect srect; + SDL_Rect drect; + int result; + int ix, iy, k; + unsigned char *charpos; + unsigned char bits[8] = { 128, 64, 32, 16, 8, 4, 2, 1 }; + unsigned char *bitpos; + Uint8 *curpos; + int forced_redraw; + + /* + * Setup source rectangle for 8x8 bitmap + */ + srect.x = 0; + srect.y = 0; + srect.w = 8; + srect.h = 8; + + /* + * Setup destination rectangle for 8x8 bitmap + */ + drect.x = x; + drect.y = y; + drect.w = 8; + drect.h = 8; + + /* + * Create new 8x8 bitmap surface if not already present + */ + if (gfxPrimitivesFont[(unsigned char) c] == NULL) { + gfxPrimitivesFont[(unsigned char) c] = + SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_HWSURFACE | SDL_SRCALPHA, 8, 8, + 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); + /* + * Check pointer + */ + if (gfxPrimitivesFont[(unsigned char) c] == NULL) { + return (-1); + } + /* + * Definitely redraw + */ + forced_redraw = 1; + } else { + forced_redraw = 0; + } + + /* + * Check if color has changed + */ + if ((gfxPrimitivesFontColor[(unsigned char) c] != color) || (forced_redraw)) { + /* + * Redraw character + */ + SDL_SetAlpha(gfxPrimitivesFont[(unsigned char) c], SDL_SRCALPHA, 255); + gfxPrimitivesFontColor[(unsigned char) c] = color; + + /* + * Variable setup + */ + k = (unsigned char) c; + k *= 8; + charpos = gfxPrimitivesFontdata; + charpos += k; + + /* + * Clear bitmap + */ + curpos = (Uint8 *) gfxPrimitivesFont[(unsigned char) c]->pixels; + memset(curpos, 0, 8 * 8 * 4); + + /* + * Drawing loop + */ + for (iy = 0; iy < 8; iy++) { + bitpos = bits; + for (ix = 0; ix < 8; ix++) { + if ((*charpos & *bitpos) == *bitpos) { + memcpy(curpos, &color, 4); + } + bitpos++; + curpos += 4;; + } + charpos++; + } + } + + /* + * Draw bitmap onto destination surface + */ + result = SDL_BlitSurface(gfxPrimitivesFont[(unsigned char) c], &srect, dst, &drect); + + return (result); +} + +int characterRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, char c, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (characterColor(dst, x, y, c, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} + +int stringColor(SDL_Surface * dst, Sint16 x, Sint16 y, char *c, Uint32 color) +{ + int result; + int i, length; + char *curchar; + int curx; + + length = strlen(c); + curchar = c; + curx = x; + result = 0; + for (i = 0; i < length; i++) { + result |= characterColor(dst, curx, y, *curchar, color); + curchar++; + curx += 8; + } + + return (result); +} + +int stringRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, char *c, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + /* + * Draw + */ + return (stringColor(dst, x, y, c, ((Uint32) r << 24) | ((Uint32) g << 16) | ((Uint32) b << 8) | (Uint32) a)); +} diff --git a/src/sdl/sdl_gfxprimitives.h b/src/sdl/sdl_gfxprimitives.h new file mode 100644 index 0000000..682db92 --- /dev/null +++ b/src/sdl/sdl_gfxprimitives.h @@ -0,0 +1,155 @@ + +/* + + SDL_gfxPrimitives: graphics primitives for SDL + + LGPL (c) A. Schiffler + +*/ + +#ifndef _SDL_gfxPrimitives_h +#define _SDL_gfxPrimitives_h + +#include +#ifndef M_PI +#define M_PI 3.141592654 +#endif + +#include "SDL.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* ----- Versioning */ + +#define SDL_GFXPRIMITIVES_MAJOR 1 +#define SDL_GFXPRIMITIVES_MINOR 5 + +/* ----- W32 DLL interface */ + +#ifdef WIN32 +#ifdef BUILD_DLL +#define DLLINTERFACE __declspec(dllexport) +#else +#define DLLINTERFACE __declspec(dllimport) +#endif +#else +#define DLLINTERFACE +#endif + +/* ----- Prototypes */ + +/* Note: all ___Color routines expect the color to be in format 0xRRGGBBAA */ + +/* Pixel */ + + DLLINTERFACE int pixelColor(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color); + DLLINTERFACE int pixelRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Horizontal line */ + + DLLINTERFACE int hlineColor(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color); + DLLINTERFACE int hlineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Vertical line */ + + DLLINTERFACE int vlineColor(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color); + DLLINTERFACE int vlineRGBA(SDL_Surface * dst, Sint16 x, Sint16 y1, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Rectangle */ + + DLLINTERFACE int rectangleColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); + DLLINTERFACE int rectangleRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, + Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Filled rectangle (Box) */ + + DLLINTERFACE int boxColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); + DLLINTERFACE int boxRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, + Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Line */ + + DLLINTERFACE int lineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); + DLLINTERFACE int lineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, + Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* AA Line */ + DLLINTERFACE int aalineColor(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); + DLLINTERFACE int aalineRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1, + Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Circle */ + + DLLINTERFACE int circleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color); + DLLINTERFACE int circleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* AA Circle */ + + DLLINTERFACE int aacircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color); + DLLINTERFACE int aacircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, + Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Filled Circle */ + + DLLINTERFACE int filledCircleColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 r, Uint32 color); + DLLINTERFACE int filledCircleRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, + Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Ellipse */ + + DLLINTERFACE int ellipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color); + DLLINTERFACE int ellipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, + Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* AA Ellipse */ + + DLLINTERFACE int aaellipseColor(SDL_Surface * dst, Sint16 xc, Sint16 yc, Sint16 rx, Sint16 ry, Uint32 color); + DLLINTERFACE int aaellipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, + Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Filled Ellipse */ + + DLLINTERFACE int filledEllipseColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color); + DLLINTERFACE int filledEllipseRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, + Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a); +/* Filled Pie */ + + DLLINTERFACE int filledpieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, + Sint16 start, Sint16 end, Uint32 color); + DLLINTERFACE int filledpieRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, + Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Polygon */ + + DLLINTERFACE int polygonColor(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, Uint32 color); + DLLINTERFACE int polygonRGBA(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, + int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* AA-Polygon */ + + DLLINTERFACE int aapolygonColor(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, Uint32 color); + DLLINTERFACE int aapolygonRGBA(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, + int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Filled Polygon */ + + DLLINTERFACE int filledPolygonColor(SDL_Surface * dst, Sint16 * vx, Sint16 * vy, int n, int color); + DLLINTERFACE int filledPolygonRGBA(SDL_Surface * dst, Sint16 * vx, + Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* 8x8 Characters/Strings */ + + DLLINTERFACE int characterColor(SDL_Surface * dst, Sint16 x, Sint16 y, char c, Uint32 color); + DLLINTERFACE int characterRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, char c, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + DLLINTERFACE int stringColor(SDL_Surface * dst, Sint16 x, Sint16 y, char *c, Uint32 color); + DLLINTERFACE int stringRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, char *c, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +}; +#endif + +#endif /* _SDL_gfxPrimitives_h */ diff --git a/src/sdl/sdl_gfxprimitives_font.h b/src/sdl/sdl_gfxprimitives_font.h new file mode 100644 index 0000000..9dde032 --- /dev/null +++ b/src/sdl/sdl_gfxprimitives_font.h @@ -0,0 +1,3082 @@ + +/* ---- 8x8 font definition ---- */ + +/* LGPL (c) A. Schiffler */ + +#define GFX_FONTDATAMAX (8*256) + +static unsigned char gfxPrimitivesFontdata[GFX_FONTDATAMAX] = { + + /* + * 0 0x00 '^@' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 1 0x01 '^A' + */ + 0x7e, /* 01111110 */ + 0x81, /* 10000001 */ + 0xa5, /* 10100101 */ + 0x81, /* 10000001 */ + 0xbd, /* 10111101 */ + 0x99, /* 10011001 */ + 0x81, /* 10000001 */ + 0x7e, /* 01111110 */ + + /* + * 2 0x02 '^B' + */ + 0x7e, /* 01111110 */ + 0xff, /* 11111111 */ + 0xdb, /* 11011011 */ + 0xff, /* 11111111 */ + 0xc3, /* 11000011 */ + 0xe7, /* 11100111 */ + 0xff, /* 11111111 */ + 0x7e, /* 01111110 */ + + /* + * 3 0x03 '^C' + */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0x10, /* 00010000 */ + 0x00, /* 00000000 */ + + /* + * 4 0x04 '^D' + */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0x10, /* 00010000 */ + 0x00, /* 00000000 */ + + /* + * 5 0x05 '^E' + */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + + /* + * 6 0x06 '^F' + */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + + /* + * 7 0x07 '^G' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 8 0x08 '^H' + */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xe7, /* 11100111 */ + 0xc3, /* 11000011 */ + 0xc3, /* 11000011 */ + 0xe7, /* 11100111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* + * 9 0x09 '^I' + */ + 0x00, /* 00000000 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x42, /* 01000010 */ + 0x42, /* 01000010 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 10 0x0a '^J' + */ + 0xff, /* 11111111 */ + 0xc3, /* 11000011 */ + 0x99, /* 10011001 */ + 0xbd, /* 10111101 */ + 0xbd, /* 10111101 */ + 0x99, /* 10011001 */ + 0xc3, /* 11000011 */ + 0xff, /* 11111111 */ + + /* + * 11 0x0b '^K' + */ + 0x0f, /* 00001111 */ + 0x07, /* 00000111 */ + 0x0f, /* 00001111 */ + 0x7d, /* 01111101 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x78, /* 01111000 */ + + /* + * 12 0x0c '^L' + */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + + /* + * 13 0x0d '^M' + */ + 0x3f, /* 00111111 */ + 0x33, /* 00110011 */ + 0x3f, /* 00111111 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x70, /* 01110000 */ + 0xf0, /* 11110000 */ + 0xe0, /* 11100000 */ + + /* + * 14 0x0e '^N' + */ + 0x7f, /* 01111111 */ + 0x63, /* 01100011 */ + 0x7f, /* 01111111 */ + 0x63, /* 01100011 */ + 0x63, /* 01100011 */ + 0x67, /* 01100111 */ + 0xe6, /* 11100110 */ + 0xc0, /* 11000000 */ + + /* + * 15 0x0f '^O' + */ + 0x18, /* 00011000 */ + 0xdb, /* 11011011 */ + 0x3c, /* 00111100 */ + 0xe7, /* 11100111 */ + 0xe7, /* 11100111 */ + 0x3c, /* 00111100 */ + 0xdb, /* 11011011 */ + 0x18, /* 00011000 */ + + /* + * 16 0x10 '^P' + */ + 0x80, /* 10000000 */ + 0xe0, /* 11100000 */ + 0xf8, /* 11111000 */ + 0xfe, /* 11111110 */ + 0xf8, /* 11111000 */ + 0xe0, /* 11100000 */ + 0x80, /* 10000000 */ + 0x00, /* 00000000 */ + + /* + * 17 0x11 '^Q' + */ + 0x02, /* 00000010 */ + 0x0e, /* 00001110 */ + 0x3e, /* 00111110 */ + 0xfe, /* 11111110 */ + 0x3e, /* 00111110 */ + 0x0e, /* 00001110 */ + 0x02, /* 00000010 */ + 0x00, /* 00000000 */ + + /* + * 18 0x12 '^R' + */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + + /* + * 19 0x13 '^S' + */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + + /* + * 20 0x14 '^T' + */ + 0x7f, /* 01111111 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7b, /* 01111011 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x00, /* 00000000 */ + + /* + * 21 0x15 '^U' + */ + 0x3e, /* 00111110 */ + 0x61, /* 01100001 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x86, /* 10000110 */ + 0x7c, /* 01111100 */ + + /* + * 22 0x16 '^V' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x7e, /* 01111110 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* + * 23 0x17 '^W' + */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + + /* + * 24 0x18 '^X' + */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 25 0x19 '^Y' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 26 0x1a '^Z' + */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0xfe, /* 11111110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 27 0x1b '^[' + */ + 0x00, /* 00000000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xfe, /* 11111110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 28 0x1c '^\' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 29 0x1d '^]' + */ + 0x00, /* 00000000 */ + 0x24, /* 00100100 */ + 0x66, /* 01100110 */ + 0xff, /* 11111111 */ + 0x66, /* 01100110 */ + 0x24, /* 00100100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 30 0x1e '^^' + */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 31 0x1f '^_' + */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 32 0x20 ' ' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 33 0x21 '!' + */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 34 0x22 '"' + */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x24, /* 00100100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 35 0x23 '#' + */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* + * 36 0x24 '$' + */ + 0x18, /* 00011000 */ + 0x3e, /* 00111110 */ + 0x60, /* 01100000 */ + 0x3c, /* 00111100 */ + 0x06, /* 00000110 */ + 0x7c, /* 01111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 37 0x25 '%' + */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xcc, /* 11001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x66, /* 01100110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 38 0x26 '&' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 39 0x27 ''' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 40 0x28 '(' + */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + + /* + * 41 0x29 ')' + */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + + /* + * 42 0x2a '*' + */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0xff, /* 11111111 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 43 0x2b '+' + */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 44 0x2c ',' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + + /* + * 45 0x2d '-' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 46 0x2e '.' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 47 0x2f '/' + */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + 0x80, /* 10000000 */ + 0x00, /* 00000000 */ + + /* + * 48 0x30 '0' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xd6, /* 11010110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* + * 49 0x31 '1' + */ + 0x18, /* 00011000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* + * 50 0x32 '2' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x06, /* 00000110 */ + 0x1c, /* 00011100 */ + 0x30, /* 00110000 */ + 0x66, /* 01100110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* + * 51 0x33 '3' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x06, /* 00000110 */ + 0x3c, /* 00111100 */ + 0x06, /* 00000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 52 0x34 '4' + */ + 0x1c, /* 00011100 */ + 0x3c, /* 00111100 */ + 0x6c, /* 01101100 */ + 0xcc, /* 11001100 */ + 0xfe, /* 11111110 */ + 0x0c, /* 00001100 */ + 0x1e, /* 00011110 */ + 0x00, /* 00000000 */ + + /* + * 53 0x35 '5' + */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfc, /* 11111100 */ + 0x06, /* 00000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 54 0x36 '6' + */ + 0x38, /* 00111000 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 55 0x37 '7' + */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + + /* + * 56 0x38 '8' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 57 0x39 '9' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x78, /* 01111000 */ + 0x00, /* 00000000 */ + + /* + * 58 0x3a ':' + */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 59 0x3b ';' + */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + + /* + * 60 0x3c '<' + */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x06, /* 00000110 */ + 0x00, /* 00000000 */ + + /* + * 61 0x3d '=' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 62 0x3e '>' + */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0x00, /* 00000000 */ + + /* + * 63 0x3f '?' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 64 0x40 '@' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xde, /* 11011110 */ + 0xde, /* 11011110 */ + 0xde, /* 11011110 */ + 0xc0, /* 11000000 */ + 0x78, /* 01111000 */ + 0x00, /* 00000000 */ + + /* + * 65 0x41 'A' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 66 0x42 'B' + */ + 0xfc, /* 11111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* + * 67 0x43 'C' + */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 68 0x44 'D' + */ + 0xf8, /* 11111000 */ + 0x6c, /* 01101100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x6c, /* 01101100 */ + 0xf8, /* 11111000 */ + 0x00, /* 00000000 */ + + /* + * 69 0x45 'E' + */ + 0xfe, /* 11111110 */ + 0x62, /* 01100010 */ + 0x68, /* 01101000 */ + 0x78, /* 01111000 */ + 0x68, /* 01101000 */ + 0x62, /* 01100010 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* + * 70 0x46 'F' + */ + 0xfe, /* 11111110 */ + 0x62, /* 01100010 */ + 0x68, /* 01101000 */ + 0x78, /* 01111000 */ + 0x68, /* 01101000 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x00, /* 00000000 */ + + /* + * 71 0x47 'G' + */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xce, /* 11001110 */ + 0x66, /* 01100110 */ + 0x3a, /* 00111010 */ + 0x00, /* 00000000 */ + + /* + * 72 0x48 'H' + */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 73 0x49 'I' + */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 74 0x4a 'J' + */ + 0x1e, /* 00011110 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x78, /* 01111000 */ + 0x00, /* 00000000 */ + + /* + * 75 0x4b 'K' + */ + 0xe6, /* 11100110 */ + 0x66, /* 01100110 */ + 0x6c, /* 01101100 */ + 0x78, /* 01111000 */ + 0x6c, /* 01101100 */ + 0x66, /* 01100110 */ + 0xe6, /* 11100110 */ + 0x00, /* 00000000 */ + + /* + * 76 0x4c 'L' + */ + 0xf0, /* 11110000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0x62, /* 01100010 */ + 0x66, /* 01100110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* + * 77 0x4d 'M' + */ + 0xc6, /* 11000110 */ + 0xee, /* 11101110 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 78 0x4e 'N' + */ + 0xc6, /* 11000110 */ + 0xe6, /* 11100110 */ + 0xf6, /* 11110110 */ + 0xde, /* 11011110 */ + 0xce, /* 11001110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 79 0x4f 'O' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 80 0x50 'P' + */ + 0xfc, /* 11111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x00, /* 00000000 */ + + /* + * 81 0x51 'Q' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xce, /* 11001110 */ + 0x7c, /* 01111100 */ + 0x0e, /* 00001110 */ + + /* + * 82 0x52 'R' + */ + 0xfc, /* 11111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0x6c, /* 01101100 */ + 0x66, /* 01100110 */ + 0xe6, /* 11100110 */ + 0x00, /* 00000000 */ + + /* + * 83 0x53 'S' + */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 84 0x54 'T' + */ + 0x7e, /* 01111110 */ + 0x7e, /* 01111110 */ + 0x5a, /* 01011010 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 85 0x55 'U' + */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 86 0x56 'V' + */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* + * 87 0x57 'W' + */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xd6, /* 11010110 */ + 0xd6, /* 11010110 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* + * 88 0x58 'X' + */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 89 0x59 'Y' + */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 90 0x5a 'Z' + */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x8c, /* 10001100 */ + 0x18, /* 00011000 */ + 0x32, /* 00110010 */ + 0x66, /* 01100110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* + * 91 0x5b '[' + */ + 0x3c, /* 00111100 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 92 0x5c '\' + */ + 0xc0, /* 11000000 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x06, /* 00000110 */ + 0x02, /* 00000010 */ + 0x00, /* 00000000 */ + + /* + * 93 0x5d ']' + */ + 0x3c, /* 00111100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 94 0x5e '^' + */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 95 0x5f '_' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + + /* + * 96 0x60 '`' + */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 97 0x61 'a' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 98 0x62 'b' + */ + 0xe0, /* 11100000 */ + 0x60, /* 01100000 */ + 0x7c, /* 01111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + + /* + * 99 0x63 'c' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 100 0x64 'd' + */ + 0x1c, /* 00011100 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 101 0x65 'e' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 102 0x66 'f' + */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x60, /* 01100000 */ + 0xf8, /* 11111000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x00, /* 00000000 */ + + /* + * 103 0x67 'g' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x7c, /* 01111100 */ + 0x0c, /* 00001100 */ + 0xf8, /* 11111000 */ + + /* + * 104 0x68 'h' + */ + 0xe0, /* 11100000 */ + 0x60, /* 01100000 */ + 0x6c, /* 01101100 */ + 0x76, /* 01110110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0xe6, /* 11100110 */ + 0x00, /* 00000000 */ + + /* + * 105 0x69 'i' + */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 106 0x6a 'j' + */ + 0x06, /* 00000110 */ + 0x00, /* 00000000 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + + /* + * 107 0x6b 'k' + */ + 0xe0, /* 11100000 */ + 0x60, /* 01100000 */ + 0x66, /* 01100110 */ + 0x6c, /* 01101100 */ + 0x78, /* 01111000 */ + 0x6c, /* 01101100 */ + 0xe6, /* 11100110 */ + 0x00, /* 00000000 */ + + /* + * 108 0x6c 'l' + */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 109 0x6d 'm' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xec, /* 11101100 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0xd6, /* 11010110 */ + 0xd6, /* 11010110 */ + 0x00, /* 00000000 */ + + /* + * 110 0x6e 'n' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + + /* + * 111 0x6f 'o' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 112 0x70 'p' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + + /* + * 113 0x71 'q' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x7c, /* 01111100 */ + 0x0c, /* 00001100 */ + 0x1e, /* 00011110 */ + + /* + * 114 0x72 'r' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x76, /* 01110110 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x00, /* 00000000 */ + + /* + * 115 0x73 's' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x06, /* 00000110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* + * 116 0x74 't' + */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0xfc, /* 11111100 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x36, /* 00110110 */ + 0x1c, /* 00011100 */ + 0x00, /* 00000000 */ + + /* + * 117 0x75 'u' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 118 0x76 'v' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* + * 119 0x77 'w' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xd6, /* 11010110 */ + 0xd6, /* 11010110 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* + * 120 0x78 'x' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 121 0x79 'y' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0xfc, /* 11111100 */ + + /* + * 122 0x7a 'z' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x4c, /* 01001100 */ + 0x18, /* 00011000 */ + 0x32, /* 00110010 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* + * 123 0x7b '{' + */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x70, /* 01110000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x0e, /* 00001110 */ + 0x00, /* 00000000 */ + + /* + * 124 0x7c '|' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 125 0x7d '}' + */ + 0x70, /* 01110000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* + * 126 0x7e '~' + */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 127 0x7f '' + */ + 0x00, /* 00000000 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* + * 128 0x80 '€' + */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x0c, /* 00001100 */ + 0x78, /* 01111000 */ + + /* + * 129 0x81 '�' + */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 130 0x82 '‚' + */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 131 0x83 'ƒ' + */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 132 0x84 '„' + */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 133 0x85 '…' + */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 134 0x86 '†' + */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 135 0x87 '‡' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x7e, /* 01111110 */ + 0x0c, /* 00001100 */ + 0x38, /* 00111000 */ + + /* + * 136 0x88 'ˆ' + */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 137 0x89 '‰' + */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 138 0x8a 'Š' + */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 139 0x8b '‹' + */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 140 0x8c 'Œ' + */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 141 0x8d '�' + */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 142 0x8e 'Ž' + */ + 0xc6, /* 11000110 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 143 0x8f '�' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 144 0x90 '�' + */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xf8, /* 11111000 */ + 0xc0, /* 11000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* + * 145 0x91 '‘' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0xd8, /* 11011000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* + * 146 0x92 '’' + */ + 0x3e, /* 00111110 */ + 0x6c, /* 01101100 */ + 0xcc, /* 11001100 */ + 0xfe, /* 11111110 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xce, /* 11001110 */ + 0x00, /* 00000000 */ + + /* + * 147 0x93 '“' + */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 148 0x94 '”' + */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 149 0x95 '•' + */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 150 0x96 '–' + */ + 0x78, /* 01111000 */ + 0x84, /* 10000100 */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 151 0x97 '—' + */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 152 0x98 '˜' + */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0xfc, /* 11111100 */ + + /* + * 153 0x99 '™' + */ + 0xc6, /* 11000110 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* + * 154 0x9a 'š' + */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 155 0x9b '›' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 156 0x9c 'œ' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x64, /* 01100100 */ + 0xf0, /* 11110000 */ + 0x60, /* 01100000 */ + 0x66, /* 01100110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* + * 157 0x9d '�' + */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 158 0x9e 'ž' + */ + 0xf8, /* 11111000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xfa, /* 11111010 */ + 0xc6, /* 11000110 */ + 0xcf, /* 11001111 */ + 0xc6, /* 11000110 */ + 0xc7, /* 11000111 */ + + /* + * 159 0x9f 'Ÿ' + */ + 0x0e, /* 00001110 */ + 0x1b, /* 00011011 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* + * 160 0xa0 ' ' + */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 161 0xa1 '¡' + */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 162 0xa2 '¢' + */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* + * 163 0xa3 '£' + */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 164 0xa4 '¤' + */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + + /* + * 165 0xa5 '¥' + */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0xe6, /* 11100110 */ + 0xf6, /* 11110110 */ + 0xde, /* 11011110 */ + 0xce, /* 11001110 */ + 0x00, /* 00000000 */ + + /* + * 166 0xa6 '¦' + */ + 0x3c, /* 00111100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x3e, /* 00111110 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 167 0xa7 '§' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 168 0xa8 '¨' + */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x63, /* 01100011 */ + 0x3e, /* 00111110 */ + 0x00, /* 00000000 */ + + /* + * 169 0xa9 '©' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 170 0xaa 'ª' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 171 0xab '«' + */ + 0x63, /* 01100011 */ + 0xe6, /* 11100110 */ + 0x6c, /* 01101100 */ + 0x7e, /* 01111110 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x0f, /* 00001111 */ + + /* + * 172 0xac '¬' + */ + 0x63, /* 01100011 */ + 0xe6, /* 11100110 */ + 0x6c, /* 01101100 */ + 0x7a, /* 01111010 */ + 0x36, /* 00110110 */ + 0x6a, /* 01101010 */ + 0xdf, /* 11011111 */ + 0x06, /* 00000110 */ + + /* + * 173 0xad '­' + */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 174 0xae '®' + */ + 0x00, /* 00000000 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x66, /* 01100110 */ + 0x33, /* 00110011 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 175 0xaf '¯' + */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0x66, /* 01100110 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 176 0xb0 '°' + */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + + /* + * 177 0xb1 '±' + */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + + /* + * 178 0xb2 '²' + */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + + /* + * 179 0xb3 '³' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 180 0xb4 '´' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 181 0xb5 'µ' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 182 0xb6 '¶' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 183 0xb7 '·' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 184 0xb8 '¸' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 185 0xb9 '¹' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x06, /* 00000110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 186 0xba 'º' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 187 0xbb '»' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x06, /* 00000110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 188 0xbc '¼' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x06, /* 00000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 189 0xbd '½' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 190 0xbe '¾' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 191 0xbf '¿' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 192 0xc0 'À' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 193 0xc1 'Á' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 194 0xc2 'Â' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 195 0xc3 'Ã' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 196 0xc4 'Ä' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 197 0xc5 'Å' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 198 0xc6 'Æ' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 199 0xc7 'Ç' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 200 0xc8 'È' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x30, /* 00110000 */ + 0x3f, /* 00111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 201 0xc9 'É' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3f, /* 00111111 */ + 0x30, /* 00110000 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 202 0xca 'Ê' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf7, /* 11110111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 203 0xcb 'Ë' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xf7, /* 11110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 204 0xcc 'Ì' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x30, /* 00110000 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 205 0xcd 'Í' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 206 0xce 'Î' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf7, /* 11110111 */ + 0x00, /* 00000000 */ + 0xf7, /* 11110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 207 0xcf 'Ï' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 208 0xd0 'Ð' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 209 0xd1 'Ñ' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 210 0xd2 'Ò' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 211 0xd3 'Ó' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x3f, /* 00111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 212 0xd4 'Ô' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 213 0xd5 'Õ' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 214 0xd6 'Ö' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3f, /* 00111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 215 0xd7 '×' + */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xff, /* 11111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* + * 216 0xd8 'Ø' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 217 0xd9 'Ù' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 218 0xda 'Ú' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 219 0xdb 'Û' + */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* + * 220 0xdc 'Ü' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* + * 221 0xdd 'Ý' + */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + + /* + * 222 0xde 'Þ' + */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + + /* + * 223 0xdf 'ß' + */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 224 0xe0 'à' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0xc8, /* 11001000 */ + 0xdc, /* 11011100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* + * 225 0xe1 'á' + */ + 0x78, /* 01111000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xd8, /* 11011000 */ + 0xcc, /* 11001100 */ + 0xc6, /* 11000110 */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + + /* + * 226 0xe2 'â' + */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + + /* + * 227 0xe3 'ã' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* + * 228 0xe4 'ä' + */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* + * 229 0xe5 'å' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* + * 230 0xe6 'æ' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0xc0, /* 11000000 */ + + /* + * 231 0xe7 'ç' + */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* + * 232 0xe8 'è' + */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + + /* + * 233 0xe9 'é' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* + * 234 0xea 'ê' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0xee, /* 11101110 */ + 0x00, /* 00000000 */ + + /* + * 235 0xeb 'ë' + */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x3e, /* 00111110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* + * 236 0xec 'ì' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 237 0xed 'í' + */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x7e, /* 01111110 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7e, /* 01111110 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + + /* + * 238 0xee 'î' + */ + 0x1e, /* 00011110 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0x7e, /* 01111110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x1e, /* 00011110 */ + 0x00, /* 00000000 */ + + /* + * 239 0xef 'ï' + */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* + * 240 0xf0 'ð' + */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 241 0xf1 'ñ' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* + * 242 0xf2 'ò' + */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* + * 243 0xf3 'ó' + */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* + * 244 0xf4 'ô' + */ + 0x0e, /* 00001110 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* + * 245 0xf5 'õ' + */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + + /* + * 246 0xf6 'ö' + */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 247 0xf7 '÷' + */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 248 0xf8 'ø' + */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 249 0xf9 'ù' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 250 0xfa 'ú' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 251 0xfb 'û' + */ + 0x0f, /* 00001111 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0xec, /* 11101100 */ + 0x6c, /* 01101100 */ + 0x3c, /* 00111100 */ + 0x1c, /* 00011100 */ + + /* + * 252 0xfc 'ü' + */ + 0x6c, /* 01101100 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 253 0xfd 'ý' + */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 254 0xfe 'þ' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* + * 255 0xff 'ÿ' + */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + +}; diff --git a/src/sdl/sdlwelldrawing.cxx b/src/sdl/sdlwelldrawing.cxx new file mode 100644 index 0000000..e632682 --- /dev/null +++ b/src/sdl/sdlwelldrawing.cxx @@ -0,0 +1,591 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: sdlwelldrawing.cxx,v 1.4 2003/02/21 11:40:33 leo Exp $ + +/// module description +/// SDL implementation of WellDrawing class - drawing routines for the game. +/// Draw field on pixmap, then maps it to the screen. Uses dirty rectangles +/// algorithm for mapping areas to screen from pixmap + +#include "sdlwelldrawing.h" +#include "sdlwellengine.h" +#include "sdl_gfxprimitives.h" + +//=========================================================================== +/// global SDLWellDrawingEngine() +/// constructor of the class - init's variables. +/// tags SDLWellDrawingEngine +SDLWellDrawingEngine::SDLWellDrawingEngine(SDLWellEngine* myengine) +{ + engine=myengine; + if(engine==0) + engine=static_cast(default_well_engine); + mainw=engine->get_main_window(); + colors=engine->get_colors(); + RGBA=engine->get_RGBA(); +} + +//=========================================================================== +/// global init(int n_fields, int idx, int idy, unsigned il, unsigned ih) +/// init fields - creates x pixmaps and gcs +/// tags SDLWellDrawingEngine +void SDLWellDrawingEngine::init(int inum_fields, int idx, int idy, + unsigned int il, unsigned int ih) +{ + + int i; + SDL_Surface *surface; + + WellDrawingEngine::init(inum_fields,idx,idy,il,ih); + fields=new SDL_Surface*; + + fg_color=colors[GridColor]; + + for(i=0;i<1;i++) + { +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + surface = SDL_CreateRGBSurface(SDL_SWSURFACE, l, h, 32, + 0xff000000, + 0x00ff0000, + 0x0000ff00, + 0x000000ff); +#else + surface = SDL_CreateRGBSurface(SDL_SWSURFACE, l, h, 32, + 0x000000ff, + 0x0000ff00, + 0x00ff0000, + 0xff000000); +#endif + + fields[i]=SDL_DisplayFormat(surface); + SDL_FreeSurface(surface); + if(fields[i]>0) + clear_field(i); + } + bg_color=colors[BackColor]; + fg_color=colors[GridColor]; +} + +//=========================================================================== +/// global draw_square(int color_idx, int i, int j) +/// Draw square (floor polygon) on all fields with given color +/// tags SDLWellDrawingEngine +void SDLWellDrawingEngine::draw_square(int color, int i, int j) +{ + int idx=current_id,sign_x13,sign_y13,sign_x24,sign_y24; + + Uint8 *rcolor=&RGBA[color*4]; + + sign_x13= points[idx].base_points[i+1][j+1].x - + points[idx].base_points[i][j].x; + sign_x13= sign_x13 ? (sign_x13>0 ? 1 : -1) : 0; + + sign_y13= points[idx].base_points[i+1][j+1].y - + points[idx].base_points[i][j].y; + sign_y13= sign_y13 ? (sign_y13>0 ? 1 : -1) : 0; + + sign_x24= points[idx].base_points[i][j+1].x - + points[idx].base_points[i+1][j].x; + sign_x24= sign_x24 ? (sign_x24>0 ? 1 : -1) : 0; + + sign_y24= points[idx].base_points[i][j+1].y - + points[idx].base_points[i+1][j].y; + sign_y24= sign_y24 ? (sign_y24>0 ? 1 : -1) : 0; + + trap_x[0] = points[idx].base_points[i][j].x+sign_x13; + trap_y[0] = points[idx].base_points[i][j].y+sign_y13; + trap_x[1] = points[idx].base_points[i+1][j].x+sign_x24; + trap_y[1] = points[idx].base_points[i+1][j].y+sign_y24; + trap_x[2] = points[idx].base_points[i+1][j+1].x-sign_x13; + trap_y[2] = points[idx].base_points[i+1][j+1].y-sign_y13; + trap_x[3] = points[idx].base_points[i][j+1].x-sign_x24; + trap_y[3] = points[idx].base_points[i][j+1].y-sign_y24; + + filledPolygonRGBA(*fields, trap_x, trap_y, MAX_SIDES, + rcolor[0], + rcolor[1], + rcolor[2], + rcolor[3] + ); + + //Now draw the grid + trap_x[0] = points[idx].base_points[i][j].x; + trap_y[0] = points[idx].base_points[i][j].y; + trap_x[1] = points[idx].base_points[i+1][j].x; + trap_y[1] = points[idx].base_points[i+1][j].y; + trap_x[2] = points[idx].base_points[i+1][j+1].x; + trap_y[2] = points[idx].base_points[i+1][j+1].y; + trap_x[3] = points[idx].base_points[i][j+1].x; + trap_y[3] = points[idx].base_points[i][j+1].y; + + polygonRGBA(*fields, trap_x, trap_y, MAX_SIDES, + RGBA[GridColor2*4], + RGBA[GridColor2*4+1], + RGBA[GridColor2*4+2], + RGBA[GridColor2*4+3] + ); + + new_dirty_rec(delta_x,delta_y); + dirty_add_xy(trap_x[0],trap_y[0]); + dirty_add_xy(trap_x[1],trap_y[1]); + dirty_add_xy(trap_x[2],trap_y[2]); + dirty_add_xy(trap_x[3],trap_y[3]); + finish_dirty_rec(); +} + +//=========================================================================== +/// global draw_trapazoid(int color_idx, int i,int j) +/// draw trapazoid - wall polygon with given color +/// tags SDLWellDrawingEngine +void SDLWellDrawingEngine::draw_trapazoid(int color, int i, int j) +{ + SDL_Surface *win=*fields; + int idx=current_id,sign_x13,sign_y13,sign_x24,sign_y24; + + Uint8 *rcolor=&RGBA[color*4]; + + + sign_x13= points[idx].wall_points[i+1][j+1].x - + points[idx].wall_points[i][j].x; + sign_x13= sign_x13 ? (sign_x13>0 ? 1 : -1) : 0; + + sign_y13= points[idx].wall_points[i+1][j+1].y - + points[idx].wall_points[i][j].y; + sign_y13= sign_y13 ? (sign_y13>0 ? 1 : -1) : 0; + + sign_x24= points[idx].wall_points[i][j+1].x - + points[idx].wall_points[i+1][j].x; + sign_x24= sign_x24 ? (sign_x24>0 ? 1 : -1) : 0; + + sign_y24= points[idx].wall_points[i][j+1].y - + points[idx].wall_points[i+1][j].y; + sign_y24= sign_y24 ? (sign_y24>0 ? 1 : -1) : 0; + + /* + w=i/MASDL_WIDTH; + dbgprintf(("trapazoid [%2d][%2d] = [%d - %d],[%d - %d]\n",i,j, + points[idx].wall_points[i+1][j+1].x, + points[idx].wall_points[i][j].x, + points[idx].wall_points[i+1][j+1].y, + points[idx].wall_points[i][j].y)); + + dbgprintf(("trapazoid2[%2d][%2d] = [%d - %d],[%d - %d]\n",i,j, + points[idx].wall_points[i][j+1].x, + points[idx].wall_points[i+1][j].x, + points[idx].wall_points[i][j+1].y, + points[idx].wall_points[i+1][j].y)); + dbgprintf(("trapazoid [%2d][%2d] = [%d][%d],[%d][%d]\n",i,j, + sign_x13,sign_y13,sign_x24,sign_y24)); + */ + + + trap_x[0] = points[idx].wall_points[i][j].x+sign_x13; + trap_y[0] = points[idx].wall_points[i][j].y+sign_y13; + trap_x[1] = points[idx].wall_points[i+1][j].x+sign_x24; + trap_y[1] = points[idx].wall_points[i+1][j].y+sign_y24; + trap_x[2] = points[idx].wall_points[i+1][j+1].x-sign_x13; + trap_y[2] = points[idx].wall_points[i+1][j+1].y-sign_y13; + trap_x[3] = points[idx].wall_points[i][j+1].x-sign_x24; + trap_y[3] = points[idx].wall_points[i][j+1].y-sign_y24; + filledPolygonRGBA(win, trap_x, trap_y, MAX_SIDES, + rcolor[0], + rcolor[1], + rcolor[2], + rcolor[3] + ); + //Now draw the grid + trap_x[0] = points[idx].wall_points[i][j].x; + trap_y[0] = points[idx].wall_points[i][j].y; + trap_x[1] = points[idx].wall_points[i+1][j].x; + trap_y[1] = points[idx].wall_points[i+1][j].y; + trap_x[2] = points[idx].wall_points[i+1][j+1].x; + trap_y[2] = points[idx].wall_points[i+1][j+1].y; + trap_x[3] = points[idx].wall_points[i][j+1].x; + trap_y[3] = points[idx].wall_points[i][j+1].y; + polygonRGBA(win, trap_x, trap_y, MAX_SIDES, + RGBA[GridColor*4], + RGBA[GridColor*4+1], + RGBA[GridColor*4+2], + RGBA[GridColor*4+3] + ); + + if(idx==current_id) + { + new_dirty_rec(delta_x,delta_y); + dirty_add_xy(trap_x[0],trap_y[0]); + dirty_add_xy(trap_x[1],trap_y[1]); + dirty_add_xy(trap_x[2],trap_y[2]); + dirty_add_xy(trap_x[3],trap_y[3]); + finish_dirty_rec(); + } +} + +//=========================================================================== +/// global draw_grid() +/// draw grid - all wall and floor polygons +/// tags SDLWellDrawingEngine +void SDLWellDrawingEngine::draw_grid() +{ + int idx,i,j; + SDL_Surface* win; + idx=current_id; + + win=*fields; + + for(i=0;iget_object(); + //Here we need to draw dirty rec on the screen -> will be in overloaded childs + from[idx].x=drec.get_src_x(); + from[idx].y=drec.get_src_y(); + from[idx].w=to[idx].w=drec.l; + from[idx].h=to[idx].h=drec.h; + to[idx].x=drec.get_dest_x(); + to[idx].y=drec.get_dest_y(); + + SDL_BlitSurface(*fields, &from[idx], mainw, &to[idx]); + plist->del_self(); + delete plist; + idx++; + } + } while(plist); + + SDL_UpdateRects(mainw, idx, to); + + delete from; + delete to; +} + +//=========================================================================== +/// global key_to_action(void* event) +/// convert keys to actions in the game +/// tags SDLWellDrawingEngine +Actions SDLWellDrawingEngine::key_to_action(void* event) +{ + SDL_Event *ev=(SDL_Event*)event; + switch(ev->key.keysym.sym) + { + case SDLK_KP4: + case SDLK_LEFT: + case SDLK_j: + return RIGHT; + + case SDLK_KP6: + case SDLK_RIGHT: + case SDLK_l: + return LEFT; + + case SDLK_UP: + case SDLK_DOWN: + case SDLK_KP5: + case SDLK_k: + return ROTATE; + + case SDLK_SPACE: + case SDLK_KP0: + return DROP; + + case SDLK_BREAK: + case SDLK_PAUSE: + case SDLK_p: + return PAUSE_GAME; + + case SDLK_F10: + case SDLK_q: + case SDLK_ESCAPE: + return END_GAME; + + case SDLK_KP_MULTIPLY: + return OUTER_ROTATION; + + case SDLK_KP_PLUS: + return LEVEL_UP; + + case SDLK_KP_MINUS: + return LEVEL_DOWN; + + } + return NOTHING; +} + + +//=========================================================================== +/// global draw_line(...) +/// draw line with given coords and color +/// tags SDLWellDrawingEngine +void SDLWellDrawingEngine::draw_line(int x1, int y1, int x2, int y2, int color_idx, + Canvas where) +{ + Uint8 *color=&RGBA[color_idx*4]; + switch(where) + { + case screen: + lineRGBA(mainw,x1,y1,x2,y2, + color[0], + color[1], + color[2], + color[3] + ); + break; + case pixmap: + lineRGBA(*fields,x1,y1,x2,y2, + color[0], + color[1], + color[2], + color[3] + ); + break; + } +} + +//=========================================================================== +/// global draw_rect(...) +/// draw rectangle with given coords and color +/// tags SDLWellDrawingEngine +void SDLWellDrawingEngine::draw_rect(int x1, int y1, + unsigned int il, + unsigned int ih, int color_idx, + Canvas where) +{ + Uint8 *color=&RGBA[color_idx*4]; + switch(where) + { + case screen: + rectangleRGBA(mainw,x1,y1,x1+il-1,y1+ih-1, + color[0], + color[1], + color[2], + color[3] + ); + flush_field(mainw, x1,y1, il, ih); + break; + case pixmap: + rectangleRGBA(*fields,x1,y1,x1+il-1,y1+ih-1, + color[0], + color[1], + color[2], + color[3] + ); + flush_field(*fields, x1,y1, il, ih); + break; + } +} + +//=========================================================================== +/// global fill_rect(...) +/// fill rectangle with given coords and color +/// tags SDLWellDrawingEngine +void SDLWellDrawingEngine::fill_rect(int x1, int y1, + unsigned int il, + unsigned int ih, int color_idx, + Canvas where) +{ + Uint8 *color=&RGBA[color_idx*4]; + switch(where) + { + case screen: + boxRGBA(mainw,x1,y1,x1+il-1,y1+ih-1, + color[0], + color[1], + color[2], + color[3] + ); + flush_field(mainw, x1,y1, il, ih); + break; + case pixmap: + boxRGBA(*fields,x1,y1,x1+il-1,y1+ih-1, + color[0], + color[1], + color[2], + color[3] + ); + flush_field(*fields, x1,y1, il, ih); + break; + } +} + +//=========================================================================== +/// global pixmap_copy(Geo*) +/// copy part of image to the screen +/// tags SDLWellDrawingEngine +void SDLWellDrawingEngine::pixmap_copy(Geo *pgeo) +{ + SDL_Rect src,dest; + if(pgeo->im==imNone) + return; + + src.x=pgeo->fromx; + src.y=pgeo->fromy; + src.w=dest.w=pgeo->l; + src.h=dest.h=pgeo->h; + dest.x=pgeo->tox; + dest.y=pgeo->toy; + + SDL_BlitSurface(engine->get_pixmap_of_image(pgeo->im), + &src, *fields, &dest); + SDL_UpdateRects(*fields, 1, &dest); +} + diff --git a/src/sdl/sdlwelldrawing.h b/src/sdl/sdlwelldrawing.h new file mode 100644 index 0000000..6ab15fb --- /dev/null +++ b/src/sdl/sdlwelldrawing.h @@ -0,0 +1,58 @@ +// docm_prefix(///) +#ifndef SDLWELLDRAWING_H +#define SDLWELLDRAWING_H + +#include "globals.h" +#include "SDL.h" +#include "welldrawing.h" + +class SDLWellEngine; + +struct SDLPoint +{ + int x,y; +}; + +/// module description +/// Definition of the SDLWellDrawingEngine class, +/// public child from WellDrawingEngine -> engine for drawing game field +class SDLWellDrawingEngine:public WellDrawingEngine +{ + protected: + SDLWellEngine *engine; + SDL_Surface **fields; + SDL_Surface *mainw; + Uint32 *colors; + Uint8 *RGBA; + Uint32 bg_color, fg_color; + + Sint16 trap_x[MAX_SIDES]; + Sint16 trap_y[MAX_SIDES]; + + void flush_field(SDL_Surface* win, int ix, int iy, int il, int ih); + + + public: + SDLWellDrawingEngine(SDLWellEngine* myengine); + virtual void init(int,int,int,unsigned int,unsigned int); + virtual void flush_all(); + virtual void flush_dirty(); + virtual void field_sync(); + virtual void draw_grid(); + virtual void draw_square(int color, int i, int j); + virtual void draw_trapazoid(int color, int i, int j); + virtual void sync(); + virtual void clear_field(int i); + virtual Actions key_to_action(void* event); + virtual void draw_line(int x1, int y1, int x2, int y2, int color_idx, + Canvas where=screen); + virtual void draw_rect(int x1, int y1, unsigned int il, + unsigned int ih, int color_idx, + Canvas where=screen); + virtual void fill_rect(int x1, int y1, unsigned int il, + unsigned int ih, int color_idx, + Canvas where=screen); + virtual void pixmap_copy(Geo *pgeo); +}; + +#endif diff --git a/src/sdl/sdlwellengine.cxx b/src/sdl/sdlwellengine.cxx new file mode 100644 index 0000000..bae02e0 --- /dev/null +++ b/src/sdl/sdlwellengine.cxx @@ -0,0 +1,409 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002-2003 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: sdlwellengine.cxx,v 1.5 2003/02/21 11:40:33 leo Exp $ + +/// module description +/// This module contains methods of class SDLWellEngine which implements SDL calls +/// for the game. So this is SDL dependent part. It receives Events, +/// make convertions, many initions and calls. + +#include "version.h" +#include "globals.h" +#include "sdlwellengine.h" +#include "sdlwellimagefont.h" +#include "sdlwellinput.h" +#include "sdlwelldrawing.h" +#include "SDL_image.h" +#include "sdl_gfxprimitives.h" +#include "commonfuncs.h" + +//Colors for welltris pieces and grid (x color names) +static Uint8 game_color_names[MAX_GAME_COLORS][3] = +{ + /* 0 "Red" */ { 255, 0, 0}, + /* 1 "Green" */ { 0,255, 0}, + /* 2 "Blue" */ { 0, 0,255}, + /* 3 "Yellow" */ { 255,255, 0}, + /* 4 "Magenta" */ { 255, 0,255}, + /* 5 "Cyan" */ { 0,255,255}, + /* 6 "FireBrick" */ { 178, 34, 34}, + /* 7 "SpringGreen", */ { 0,255,127}, + /* 8 "CornflowerBlue" */ { 100,149,237}, + /* 9 "Khaki" */ { 240,230,140}, + /*10 "Plum" */ { 221,160,221}, + /*11 "Violet" */ { 238,130,238}, + /*12 "DarkTurquoise" */ { 0,206,209}, + /*13 "Gold" */ { 255,215, 0}, + /*14 "Orchid" */ { 218,112,214}, + /*15 "Turquoise" */ { 64,224,208}, + /*16 "Orange" */ { 255,165, 0}, + /*17 "OrangeRed" */ { 255, 69, 0}, + /*18 "VioletRed" */ { 208, 32,144}, + /*19 "BlueViolet" */ { 138, 43,226}, + /*20 "SeaGreen" */ { 46,139, 87}, + /*21 "Pink" */ { 255,192,203}, + /*22 "ForestGreen" */ { 34,139, 34}, + /*23 "SkyBlue" */ { 135,206,235}, + /*24 "Coral" */ { 255,127, 80}, + /*25 "Wheat" */ { 245,222,179}, + /*26 "GoldenRod" */ { 218,165, 32}, + /*27 "IndianRed" */ { 205, 92, 92}, + /*28 "SpringGreen" */ { 0,255,127}, + /*29 "CornflowerBlue" */ { 100,149,237}, + /*30 "Thistle" */ { 216,191,216}, + /*31 "Aquamarine" */ { 127,255,212}, + /*32 "CadetBlue" */ { 95,158,160}, + /*33 "LightSteelBlue" */ { 176,196,222}, + /*34 "NavyBlue" */ { 0, 0,128}, + /*35 "SteelBlue" */ { 70,130,180}, + /*36 "YellowGreen" */ { 154,205, 50}, + /*37 "DarkViolet" */ { 148, 0,211}, + /*38 "MediumSeaGreen" */ { 60,179,113}, + /*39 "DarkSlateGray" */ { 47, 79, 79}, + /*40 "LightGray" */ { 211,211,211}, + /*41 "MediumVioletRed" */ { 199, 21,133}, + /*42 "Sienna" */ { 160, 82, 45}, + /*43 "MediumAquamarine"*/ { 102,205,170}, + /*44 "MediumBlue" */ { 0, 0,205}, + /*45 "Navy" */ { 0, 0,128}, + /*46 "DarkOliveGreen" */ { 85,107, 47}, + /*47 "DarkGreen" */ { 0,100, 0}, + /*48 "DimGray" */ { 105,105,105}, + /*49 "Tan" */ { 210,180,140}, + /*50 "MediumTurquoise" */ { 72,209,204}, + /*51 "DarkSlateBlue" */ { 72, 61,139}, + /*52 "Maroon" */ { 176, 48, 96}, + /*53 "Gray" */ { 190,190,190}, + /*54 "#303030" */ {0x30,0x30,0x30}, + + /*55 "Black" */ { 0, 0, 0}, + /*56 "#00aa00" */ { 0,0xaa, 0}, + /*56 "#00ee00" */ { 0,0xee, 0}, + /*57 "#aa0000" */ {0xaa, 0, 0}, + /*58 "#aaaaaa" */ {0xaa,0xaa,0xaa}, + /*59 "#cccc00" */ {0xcc,0xcc, 0}, + /*60 "#eeee00" */ {0xee,0xee, 0} +}; + +const unsigned long TIMESTEP=5000l; +const int KEY_TICKS=5; +const int FIRST_KEY_TICKS=25; +//=========================================================================== +/// global new_well_engine(argc,argv) +/// Creates new WellEngine object, SDL realization (create SDLWellEngine) +/// tags new_well_engine +WellEngine* new_well_engine(int argc, char** argv) +{ + return new SDLWellEngine(argc,argv); +} + +//=========================================================================== +/// global SDLWellEngine(argc,argv) +/// Constructor of class that incupsulates work with SDL window +/// This class must always be allocated through 'new' +/// args +/// +argc: number of commanline args +/// +argv: command line args +/// tags SDLWellEngine +SDLWellEngine::SDLWellEngine(int argc, char** argv):WellEngine(argc,argv) +{ + if( SDL_Init(SDL_INIT_VIDEO) < 0 ) + { + fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); + exit(1); + } + init_mainwindow(argc,argv); + init_colors(); + load_images(); + SDL_EnableUNICODE(1); + bg_image=0; +} + +//=========================================================================== +/// global SDLWellEngine(argc,argv) +/// Destructor of class that incupsulates work with SDL window +/// tags SDLWellEngine +SDLWellEngine::~SDLWellEngine() +{ + SDL_Quit(); +} + +//=========================================================================== +/// global init_mainwindow(argc,argv) +/// create main game window and all other stuff around it +/// tags SDLWellEngine +void SDLWellEngine::init_mainwindow(int argc,char **argv) +{ + mainw = SDL_SetVideoMode(mainl, mainh, 16, + SDL_ANYFORMAT); + if( mainw == 0 ) + { + fprintf(stderr, "Unable to set %dx%dx16 video: %s\n",mainl, mainh, + SDL_GetError()); + SDL_Quit(); + exit(1); + } + dbgprintf(("VIDEO_INIT: Set 800x600x%d video mode\n", mainw->format->BitsPerPixel)); +} + +//=========================================================================== +/// global show_main() +/// show main window +/// tags SDLWellEngine +void SDLWellEngine::show_main() +{ + SDL_UpdateRect(mainw, 0,0, mainl, mainh); +} + + +void SDLWellEngine::set_key_event(SDL_Event& event) +{ + key_event=event; + key_event_got=true; + process_event_for_all(wEvent(eKeyPress,&key_event)); + key_ticks=FIRST_KEY_TICKS; +} + +void SDLWellEngine::reset_key_event() +{ + key_event_got=false; +} + +void SDLWellEngine::process_key_event() +{ + if(key_ticks) + { + key_ticks--; + return; + } + process_event_for_all(wEvent(eKeyPress,&key_event)); + key_ticks=KEY_TICKS; +} + + +//=========================================================================== +/// global event_loop() +/// main event loop - process all events and make game moves +/// tags SDLWellEngine +void SDLWellEngine::event_loop() +{ + SDL_Event event; + MouseEvent mev; + done_loop_var=false; + key_event_got=false; + dbgprintf(("Entered in event_loop\n")); + + while(!done_loop_var) + { + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_VIDEOEXPOSE: + dbgprintf(("Got expose event - processing\n")); + process_event_for_all(wEvent(eExpose,&event)); + break; + case SDL_KEYDOWN: + dbgprintf(("The '%s' key was pressed!\n", + SDL_GetKeyName(event.key.keysym.sym))); + set_key_event(event); + key_event=event; + key_event_got=true; + break; + + case SDL_KEYUP: + reset_key_event(); + break; + + case SDL_MOUSEMOTION: + mev.mx=event.motion.x; + mev.my=event.motion.y; + mev.bstate=event.motion.state==SDL_BUTTON_LEFT ? But1Press : But2Press; + process_event_for_all(wEvent(eMouseMove,&mev)); + dbgprintf(("Mouse moved by to (%d,%d) with state: %d\n", + event.motion.x, event.motion.y, event.motion.state)); + break; + case SDL_MOUSEBUTTONDOWN: + dbgprintf(("MouseButtonPress event\n")); + mev.mx=event.button.x; + mev.my=event.button.y; + mev.bstate=event.button.button==SDL_BUTTON_LEFT ? But1Press : But2Press; + process_event_for_all(wEvent(eMousePress,&mev)); + break; + case SDL_QUIT: + done_loop_var=true; + } + } + if(key_event_got) + process_key_event(); + udelay(TIMESTEP); + process_time_event(); + } +} + + +//=========================================================================== +/// global wait_for_timers() +/// calculate delay and wait for events and timers +/// tags SDLWellEngine +int SDLWellEngine::wait_for_timers() +{ + return 0; +} + +//=========================================================================== +/// global load_image(Images id, char* name) +/// Load image into memory and register it with given id for use +/// tags SDLWellEngine +bool SDLWellEngine::load_image(Images id, char* name) +{ + char buf[L_MAXPATH]; + + if(id>=MAX_IMAGES) + return false; + + find_full_path_for_file(name,buf); + pics[id]=IMG_Load(buf); + images[id].id=id; + dbgprintf(("Loaded image: %s\n",buf)); + return true; +} + + +//=========================================================================== +/// global set_main_background_image(Images id) +/// set image with given id to background of main window +/// tags SDLWellEngine +void SDLWellEngine::set_main_background_image(Images id) +{ + SDL_Rect dest; + if(images[id].id!=imNone) + { + dest.x = 0; + dest.y = 0; + dest.w = pics[id]->w; + dest.h = pics[id]->h; + SDL_BlitSurface(pics[id], 0, mainw, &dest); + /* Update the changed portion of the screen */ + SDL_UpdateRects(mainw, 1, &dest); + bg_image=pics[id]; + } +} + +//=========================================================================== +/// local init_colors() +/// allocate all nessesary colors +/// tags SDLWellEngine +void SDLWellEngine::init_colors() +{ + int i; + for(i=0;iformat, + game_color_names[i][0], + game_color_names[i][1], + game_color_names[i][2], 255); + game_RGBA[i*4+0]=game_color_names[i][0]; + game_RGBA[i*4+1]=game_color_names[i][1]; + game_RGBA[i*4+2]=game_color_names[i][2]; + game_RGBA[i*4+3]=255; + } +} + + +//=========================================================================== +/// global new_well_image_font() +/// creates image font object - version for SDL Window +/// tags SDLWellEngine +WellImageFont* SDLWellEngine::new_well_image_font(Images id, + unsigned int ifl, + unsigned int ifh, + int idx, int idy) +{ + return new SDLWellImageFont(id,ifl,ifh,idx,idy); +} + +//=========================================================================== +/// global new_well_input(char*) +/// creates new input object - version for SDL Window +/// tags SDLWellEngine +WellInput* SDLWellEngine::new_well_input(char* name) +{ + return new SDLWellInput(name); +} + +//=========================================================================== +/// global new_well_drawing_engine() +/// creates drawing engine for well board - version for SDL Window +/// tags SDLWellEngine +WellDrawingEngine* SDLWellEngine::new_well_drawing_engine() +{ + return new SDLWellDrawingEngine(this); +} + +//=========================================================================== +/// global udelay(int msec) +/// Portable delay :) +/// tags XWellEngine +void SDLWellEngine::udelay(int msec) +{ + SDL_Delay(msec/1000); +} + +//=========================================================================== +/// global screen_copy(Geo*) +/// copy part of image to the screen +/// tags SDLWellEngine +void SDLWellEngine::screen_copy(Geo *pgeo) +{ + SDL_Rect src,dest; + if(pgeo->im==imNone) + { + screen_clear(pgeo); + return; + } + src.x=pgeo->fromx; + src.y=pgeo->fromy; + src.w=dest.w=pgeo->l; + src.h=dest.h=pgeo->h; + dest.x=pgeo->tox; + dest.y=pgeo->toy; + + SDL_BlitSurface(pics[pgeo->im], + &src, mainw, &dest); + SDL_UpdateRects(mainw, 1, &dest); +} + +//=========================================================================== +/// global screen_clear(Geo*) +/// clear part of screen +/// tags SDLWellEngine +void SDLWellEngine::screen_clear(Geo *pgeo) +{ + SDL_Rect dest; + dest.x=pgeo->tox; + dest.y=pgeo->toy; + dest.w=pgeo->l; + dest.h=pgeo->h; + + if(!bg_image) + SDL_FillRect(mainw, &dest, game_colors[BackColor]); + else + SDL_BlitSurface(bg_image, &dest, mainw, &dest); + + SDL_UpdateRects(mainw, 1, &dest); +} + diff --git a/src/sdl/sdlwellengine.h b/src/sdl/sdlwellengine.h new file mode 100644 index 0000000..9a21d65 --- /dev/null +++ b/src/sdl/sdlwellengine.h @@ -0,0 +1,56 @@ +#ifndef SDLWELLENGINE_H +#define SDLWELLENGINE_H + +#include "globals.h" +#include "welltris.h" + +#include "SDL.h" + +#include "wellengine.h" + +class SDLWellEngine:public WellEngine +{ + protected: + SDL_Surface *mainw; + SDL_Surface *pics[MAX_IMAGES]; + Uint32 game_colors[MAX_GAME_COLORS]; + Uint8 game_RGBA[MAX_GAME_COLORS*4]; + SDL_Surface *bg_image; + + SDL_Event key_event; + bool key_event_got; + int key_ticks; + + virtual void init_mainwindow(int,char**); + virtual int wait_for_timers(); + + virtual void init_colors(); + void set_key_event(SDL_Event&); + void reset_key_event(); + void process_key_event(); + + public: + SDLWellEngine(int argc,char** argv); + ~SDLWellEngine(); + virtual void show_main(); + virtual void event_loop(); + virtual bool load_image(Images id, char* name); + virtual void set_main_background_image(Images id); + virtual WellImageFont* new_well_image_font(Images id, + unsigned int ifl, + unsigned int ifh, + int idx, int idy); + virtual WellInput* new_well_input(char*); + virtual WellDrawingEngine* new_well_drawing_engine(); + + SDL_Surface* get_pixmap_of_image(Images id) { return pics[id];}; + SDL_Surface* get_main_window() { return mainw;}; + Uint32* get_colors() { return game_colors;}; + Uint8* get_RGBA() { return game_RGBA;}; + + virtual void udelay(int msec); + virtual void screen_copy(Geo*); + virtual void screen_clear(Geo*); +}; + +#endif diff --git a/src/sdl/sdlwellimagefont.cxx b/src/sdl/sdlwellimagefont.cxx new file mode 100644 index 0000000..010c334 --- /dev/null +++ b/src/sdl/sdlwellimagefont.cxx @@ -0,0 +1,97 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002-2003 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: sdlwellimagefont.cxx,v 1.2 2003/02/20 15:09:41 leo Exp $ + +/// module description +/// SDL version of imagefont - displays text with SDL calls, work with pixmaps +/// loaded thought XWellEngine class + +#include "sdlwellimagefont.h" + +//=========================================================================== +/// global WellImageFont(Images id, unsigned int ifl, unsigned int ifh, int idx, int idy) +/// Constructor of base draw text class +/// tags WellImageFont +SDLWellImageFont::SDLWellImageFont(Images id, unsigned int ifl, unsigned int ifh, + int idx, int idy): + WellImageFont(id,ifl,ifh,idx,idy) +{ + engine=(SDLWellEngine*) default_well_engine; + font_surf=engine->get_pixmap_of_image(id); + mainw=engine->get_main_window(); +} + +//=========================================================================== +/// global clear_region() +/// clear region on screen for making output +/// tags SDLWellImageFont +void SDLWellImageFont::clear_region() +{ + SDL_Rect dest; + dest.x = screen_x; + dest.y = screen_y; + dest.w = screen_l; + dest.h = screen_h; + SDL_FillRect(mainw, &dest, 0); + SDL_UpdateRects(mainw, 1, &dest); +} + +//=========================================================================== +/// global clear_region() +/// clear region on screen for making output +/// tags SDLWellImageFont +void SDLWellImageFont::clear_region(Colors idx) +{ + SDL_Rect dest; + Uint32 *cols=engine->get_colors(); + + dest.x = screen_x; + dest.y = screen_y; + dest.w = screen_l; + dest.h = screen_h; + + SDL_FillRect(mainw, &dest, cols[idx]); + SDL_UpdateRects(mainw, 1, &dest); +} + +//=========================================================================== +/// global draw_symbol(...) +/// draw one symbol from font image to screen +/// tags SDLWellImageFont +void SDLWellImageFont::draw_symbol(int ix, int iy, + unsigned int il, + unsigned int ih, + char symb) +{ + SDL_Rect src,dest; + + if(symb<=32 || symb>=127) + return; + symb-=33; //Translate to our indexation + + dest.x = ix; + dest.y = iy; + dest.w = il; + dest.h = ih; + src.x = dx; + src.y = dy+(int)symb*font_h; + src.w = il; + src.h = ih; + SDL_BlitSurface(font_surf, &src, mainw, &dest); + /* Update the changed portion of the screen */ + SDL_UpdateRects(mainw, 1, &dest); +} + diff --git a/src/sdl/sdlwellimagefont.h b/src/sdl/sdlwellimagefont.h new file mode 100644 index 0000000..b4769d3 --- /dev/null +++ b/src/sdl/sdlwellimagefont.h @@ -0,0 +1,25 @@ +#ifndef SDLWELLIMAGEFONT_H +#define SDLWELLIMAGEFONT_H + +#include "wellimagefont.h" +#include "sdlwellengine.h" + +class SDLWellImageFont: public WellImageFont +{ + protected: + SDLWellEngine *engine; + SDL_Surface *font_surf; + SDL_Surface *mainw; + virtual void draw_symbol(int ix, int iy, + unsigned int il, + unsigned int ih, + char symb); + public: + SDLWellImageFont(Images id, unsigned int ifl, unsigned int ifh, int idx, int idy); + virtual void clear_region(); + virtual void clear_region(Colors); +}; + +#endif + + diff --git a/src/sdl/sdlwellinput.cxx b/src/sdl/sdlwellinput.cxx new file mode 100644 index 0000000..9a299a4 --- /dev/null +++ b/src/sdl/sdlwellinput.cxx @@ -0,0 +1,137 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002-2003 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: sdlwellinput.cxx,v 1.2 2003/02/20 15:09:41 leo Exp $ + +/// module description +/// SDL implementation of WellInput class - make input text from user +/// display it through WellImageFont, convert SDL Key event to symbols + +#include "sdlwellinput.h" +#include "sdl_gfxprimitives.h" +//=========================================================================== +/// global SDLWellInput(char*) +/// constructor - fill name and get geometry +/// tags SDLWellInput +SDLWellInput::SDLWellInput(char* iname) : WellInput(iname) +{ + engine=(SDLWellEngine*) default_well_engine; + mainw=engine->get_main_window(); +} + +//=========================================================================== +/// global process_event(wEvent) +/// stub that process events +/// tags SDLWellInput +bool SDLWellInput::process_event(wEvent ev) +{ + SDL_Event *xev=(SDL_Event*)ev.data; + switch(ev.type) + { + case eKeyPress: + process_key(xev); + return false; + + } + return true; +} + +//=========================================================================== +/// global draw_text() +/// draw text on the screen +/// tags SDLWellInput +void SDLWellInput::draw_text() +{ + fnt->draw_text(buf,buflen,BackColor); + show_cursor(); +} + + +//=========================================================================== +/// global show_cursor() +/// draw cursor on the screen +/// tags SDLWellInput +void SDLWellInput::show_cursor() +{ + SDL_Rect dest; + Uint32 *colors=engine->get_colors(); + + dest.x = geo[1].tox+buflen*FONT2_L; + dest.y = geo[1].toy; + dest.w = FONT2_L; + dest.h = FONT2_H; + + + SDL_FillRect(mainw, &dest, colors[BonusColor2]); + SDL_UpdateRects(mainw, 1, &dest); +} + + +//=========================================================================== +/// global hide_cursor() +/// hide cursor on the screen +/// tags SDLWellInput +void SDLWellInput::hide_cursor() +{ + SDL_Rect dest; + Uint32 *colors=engine->get_colors(); + + dest.x = geo[1].tox+buflen*FONT2_L; + dest.y = geo[1].toy; + dest.w = FONT2_L; + dest.h = FONT2_H; + + SDL_FillRect(mainw, &dest, colors[BackColor]); + SDL_UpdateRects(mainw, 1, &dest); +} + + +//=========================================================================== +/// global process_key(SDLEvent) +/// draw text on the screen +/// tags SDLWellInput + +void SDLWellInput::process_key(SDL_Event *xev) +{ + switch(xev->key.keysym.sym) + { + case SDLK_RETURN: + if(buflen) + object_on_enter.call(wEvent(aInputDone,this)); + break; + + case SDLK_DELETE: + case SDLK_BACKSPACE: + if(buflen>0) + { + hide_cursor(); + buflen--; + buf[buflen]=0; + draw_text(); + } + break; + default: + if(buflenkey.keysym.unicode>=32 && + xev->key.keysym.unicode<128) + { + hide_cursor(); + buf[buflen++]=(char)xev->key.keysym.unicode; + buf[buflen]=0; + draw_text(); + } + } +} + diff --git a/src/sdl/sdlwellinput.h b/src/sdl/sdlwellinput.h new file mode 100644 index 0000000..5baef79 --- /dev/null +++ b/src/sdl/sdlwellinput.h @@ -0,0 +1,25 @@ +#ifndef SDLWELLINPUT_H +#define SDLWELLINPUT_H + +#include "wellinput.h" +#include "sdlwellengine.h" + +class SDLWellInput:public WellInput +{ + SDLWellEngine *engine; + SDL_Surface *mainw; + + virtual void draw_text(); + void process_key(SDL_Event *xev); + void show_cursor(); + void hide_cursor(); + + public: + SDLWellInput(char *iname); + + virtual bool process_event(wEvent); + +}; + + +#endif diff --git a/src/wellclass.cxx b/src/wellclass.cxx new file mode 100644 index 0000000..7f92ce9 --- /dev/null +++ b/src/wellclass.cxx @@ -0,0 +1,1569 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +/* +# Original algorithm with polyominoes by +# +# David A. Bagley, bagleyd@bigfoot.com +# +# Q. Alex Zhao, azhao@cc.gatech.edu +# +$Id: wellclass.cxx,v 1.3 2003/02/21 11:40:33 leo Exp $ + +*/ + +/// module description +/// Main class that is the game itself - contains game board, generate figures +/// drop it to the field, and interacts with the user. + +#include "wellclass.h" +#include "wellengine.h" +#include "welldrawing.h" +#include "commonfuncs.h" + +static int speeds[NUM_LEVELS] = { + 100, 92, 84, 76, 68, 60, 53, 46, 39, 32, 26, 20, 15, 11, 8, 5, 3, 1, 0}; + +//=========================================================================== +/// global WellBase() +/// Constructor of base class - loads polyominoes and init structs +/// tags WellBase +WellBase::WellBase() : WellObject() +{ + int turn_style, number_polyominoes; + + dre=0; + + level=0; + rows=score=0; + pause=steps_to_rotate=0; + player_name[0]=0; + + set_default_options(); + + SRAND(time(NULL)); + read_polyominoes(); + + turn_style = tris[squares - MIN_SQUARES].mode[diagonal].turn_style; + if (turn_style < 0 || turn_style >= MAX_TYPES) + { + fprintf(stderr, "Welltris: corrupted input file %s\n", + POLYOMINOFILE); + fprintf(stderr, "\tturn_style = %d.\n", turn_style); + exit(1); + } + number_polyominoes = + tris[squares - MIN_SQUARES].mode[diagonal].number[mixed][turn_style]; + if (number_polyominoes <= 0 || number_polyominoes > MAX_START_POLYOMINOES) + { + fprintf(stderr, "Welltris: corrupted input file %s\n", + POLYOMINOFILE); + fprintf(stderr, "\tnumber_polyominoes = %d.\n", + number_polyominoes); + exit(1); + } + geo=get_geo_by_name("the_game"); +} + +//=========================================================================== +/// global new_game() +/// set params for new game +/// tags WellBase +void WellBase::new_game() +{ + int i,j; + for (j = 0; j < MAX_DEPTH; j++) + for (i = 0; i < MAX_PERIMETER; i++) + { + wall[j][i].pmid = EMPTY; + wall[j][i].cid = 0; + } + for (j = 0; j < MAX_WIDTH; j++) + for (i = 0; i < MAX_WIDTH; i++) + { + base[j][i].pmid = EMPTY; + base[j][i].cid = 0; + } + for (i = 0; i < MAX_SIDES; i++) + frozen_wall[i] = 0; + + dre->set_inner_alpha(30); + dre->set_outer_alpha(0); + dre->set_field_sizes(20,20,14,18); + dre->calc_grid_points(); + dre->set_field_id(0); + + rows=score=0; + + if(rotation) + steps_to_rotate=level; + else + steps_to_rotate=0; + + new_level_calc(); + + new_thing(); + check_freeze(); + new_thing(); + + player_score=new Score; + player_score->set_player(player_name); + player_score->squares=squares; + player_score->set_params(score,rows,level); + player_score->next_piece=showNext; + player_score->rotation=rotation; + player_score->mixed=mixed; +} + +//=========================================================================== +/// global init(WellEngine*) +/// init class and other related stuff +/// tags WellBase +void WellBase::init(WellEngine* we) +{ + //Additional init's such as read defaults.... + dbgprintf(("WellBase: game board size: %dx%d\n",VIEW_L,VIEW_H)); + //And Draw Engine inits + if(dre==0) + dre=we->new_well_drawing_engine(); + dre->init(NUM_ROT_STEPS,VIEW_X,VIEW_Y,VIEW_L,VIEW_H); + + txt_score=we->new_well_image_font(imFont1,FONT2_L,FONT2_H,FONT2_DX,FONT2_DY); + txt_score->set_screen_region(SCORE_REG_X,SCORE_REG_Y, + SCORE_REG_L,SCORE_REG_H); + + txt_lines=we->new_well_image_font(imFont1,FONT1_L,FONT1_H,FONT1_DX,FONT1_DY); + txt_lines->set_screen_region(LINES_REG_X,LINES_REG_Y, + LINES_REG_L,LINES_REG_H); + + txt_levelup=we->new_well_image_font(imFont1,FONT1_L,FONT1_H,FONT1_DX,FONT1_DY); + txt_levelup->set_screen_region(LEVUP_REG_X,LEVUP_REG_Y, + LEVUP_REG_L,LEVUP_REG_H); + + txt_level=we->new_well_image_font(imFont1,FONT1_L,FONT1_H,FONT1_DX,FONT1_DY); + txt_level->set_screen_region(LEVEL_REG_X,LEVEL_REG_Y, + LEVEL_REG_L,LEVEL_REG_H); + + txt_first=we->new_well_image_font(imFont1,FONT1_L,FONT1_H,FONT1_DX,FONT1_DY); + txt_first->set_screen_region(CHAL1_REG_X,CHAL1_REG_Y, + CHAL_REG_L,CHAL_REG_H); + + txt_second=we->new_well_image_font(imFont1,FONT1_L,FONT1_H,FONT1_DX,FONT1_DY); + txt_second->set_screen_region(CHAL2_REG_X,CHAL2_REG_Y, + CHAL_REG_L,CHAL_REG_H); + + txt_third=we->new_well_image_font(imFont1,FONT1_L,FONT1_H,FONT1_DX,FONT1_DY); + txt_third->set_screen_region(CHAL3_REG_X,CHAL3_REG_Y, + CHAL_REG_L,CHAL_REG_H); + +} + + +//=========================================================================== +/// global new_level_calc() +/// calculate params for new level +/// tags WellBase +void WellBase::new_level_calc() +{ + rows_levelup=THRESHOLD(level); + if(shown) + { + if(rotation) + make_rotation(); + default_well_engine->del_timer(this); + default_well_engine->add_timer(this,speeds[level]); + } +} + +//========================================================================== +/// global set_default_option() +/// set options needed by the game to its default values +/// tags WellBase +void WellBase::set_default_options() +{ + bonusNow=false; + showNext=true; + beep=false; + diagonal=false; + mixed=true; + bonus=true; + grid=true; + cw=true; + gradualAppear=false; + squares=4; + rotation=true; +} + +//=========================================================================== +/// global read_polyominoes() +/// reading polyominoes (our game figures) info from file +/// tags WellBase +void WellBase::read_polyominoes() +{ + char fname[L_MAXPATH]; + int c, i, j, k, sq, polyomino, sum, start, n, size, height, diag, + game, toss = 0; + int counter[MAX_SQUARES - MIN_SQUARES + 1]; + int start_counter[MAX_SQUARES - MIN_SQUARES + 1][MAX_MODES][MAX_TYPES]; + FILE *fp; + + find_full_path_for_file(POLYOMINOFILE,fname,ReadOnly); + + for (sq = 0; sq <= MAX_SQUARES - MIN_SQUARES; sq++) + { + counter[sq] = 0; + for (polyomino = 0; polyomino < MAX_POLYOMINOES; polyomino++) + for (j = 0; j < MAX_SQUARES; j++) + for (i = 0; i < MAX_SQUARES; i++) + tris[sq].polyomino[polyomino].shape[j][i] = 0; + for (j = 0; j < MAX_TYPES; j++) + { + for (polyomino = 0; polyomino < MAX_START_POLYOMINOES; polyomino++) + { + tris[sq].mode[NODIAG].start[polyomino][j] = 0; + tris[sq].mode[DIAGONAL].start[polyomino][j] = 0; + } + start_counter[sq][NODIAG][j] = 0; + start_counter[sq][DIAGONAL][j] = 0; + tris[sq].mode[NODIAG].number[NOMIX][j] = 0; + tris[sq].mode[DIAGONAL].number[NOMIX][j] = 0; + tris[sq].mode[NODIAG].number[MIXED][j] = 0; + tris[sq].mode[DIAGONAL].number[MIXED][j] = 0; + } + tris[sq].mode[NODIAG].turn_style = NONE; + tris[sq].mode[DIAGONAL].turn_style = NONE; + } + if ((fp = fopen(fname, "r")) == (FILE *)NULL) + { + (void) fprintf(stderr, "Can not open input file, %s\n.", POLYOMINOFILE); + exit(1); + } + else + { + while ((c = getc(fp)) != EOF) + { + if (c == '/') + { + while ((c = getc(fp)) != '/') {} + c = getc(fp); + } + if (c == '+') + { + (void) fscanf(fp, "%d", &k); + sq = k - MIN_SQUARES; + for (i = 0; i < MAX_TYPES; i++) + { + (void) fscanf(fp, "%d", &k); + tris[sq].mode[NODIAG].number[NOMIX][i] = k; + } + (void) fscanf(fp, "%d", &k); + tris[sq].mode[NODIAG].turn_style = k; + (void) fscanf(fp, "%d", &k); + tris[sq].diagonal_switch = k; + if (tris[sq].diagonal_switch == true) + { + for (i = 0; i < MAX_TYPES; i++) + { + (void) fscanf(fp, "%d", &k); + tris[sq].mode[DIAGONAL].number[NOMIX][i] = k; + } + (void) fscanf(fp, "%d", &k); + tris[sq].mode[DIAGONAL].turn_style = k; + } + c = getc(fp); + } + if (c == '*') + { + (void) fscanf (fp, "%d", &size); + c = getc(fp); + } + if (c == '~') /* Useful for debugging Things */ + { + (void) fscanf (fp, "%d", &toss); + c = getc(fp); + } + if (c == '#') + { + (void) fscanf(fp, "%d", &k); + sq = k - MIN_SQUARES; + (void) fscanf(fp, "%d", &n); + if (tris[sq].diagonal_switch == true) + (void) fscanf(fp, "%d", &n); + for (polyomino = 0; polyomino <= toss; polyomino++) + while ((c = getc(fp)) != EOF && c != '\n'); + for (polyomino = 0; polyomino < n - toss; polyomino++) + { + sum = polyomino + counter[sq]; + /* This is only there to "read" input file */ + (void) fscanf(fp, "%d", &k); + (void) fscanf(fp, "%d", &k); + tris[sq].polyomino[sum].rotation = + k + counter[sq] - toss; + (void) fscanf(fp, "%d", &k); + tris[sq].polyomino[sum].reflection = + k + counter[sq] - toss; + for (game = JUMPIN; game <= GRADUAL; game++) + { + (void) fscanf(fp, "%d", &height); + if (!gradualAppear && game == JUMPIN) + tris[sq].polyomino[sum].start_height = height; + else if (gradualAppear && game == GRADUAL) + tris[sq].polyomino[sum].start_height = height; + for (diag = NODIAG; diag <= tris[sq].diagonal_switch; diag++) + { + (void) fscanf(fp, "%d", &start); + if (game == JUMPIN) + { + if (sq == 0 || + tris[sq - 1].mode[diag].turn_style == NONE) + { + i = start_counter[sq][diag][NONE]; + tris[sq].mode[diag].start[i][NONE] = sum; + start_counter[sq][diag][NONE]++; + } + if ((sq == 0 || + tris[sq - 1].mode[diag].turn_style < ALL) && + start != NONE) + { + i = start_counter[sq][diag][NOREFL]; + tris[sq].mode[diag].start[i][NOREFL] = sum; + start_counter[sq][diag][NOREFL]++; + } + if (start == ALL) + { + i= start_counter[sq][diag][ALL]; + tris[sq].mode[diag].start[i][ALL] = sum; + start_counter[sq][diag][ALL]++; + } + } + } + } + tris[sq].polyomino[sum].size = size; + for (j = 0; j < size; j++) + for (i = 0; i < size; i++) + { + (void) fscanf(fp, "%d", &k); + tris[sq].polyomino[sum].shape[j][i] = k; + } + } + counter[sq] += n - toss; + toss = 0; + } + } + (void) fclose(fp); + for (i = 0; i <= MAX_SQUARES - MIN_SQUARES; i++) + for (j = 0; j < MAX_TYPES; j++) + for (k = 0; k <= i; k++) + { + tris[i].mode[NODIAG].number[MIXED][j] += + tris[k].mode[NODIAG].number[NOMIX][j]; + if (tris[i].diagonal_switch == true) + /*since k & i are not independent*/ + tris[i].mode[DIAGONAL].number[MIXED][j] += + tris[k].mode[DIAGONAL].number[NOMIX][j]; + } + } +} + + +//=========================================================================== +/// global show() +/// install itself in lists for proper processing events, draw itself. +/// tags WellBase +void WellBase::show() +{ + default_well_engine->set_main_background_image(imBoardBG); + dbgprintf(("WellBase registering event handlers\n")); + shown=true; + default_well_engine->add_timer(this,speeds[level]); + default_well_engine->add_object(this); + dre->clear_field(0); + draw_field(); + draw_thing(); + + redraw_all(); +} + +//=========================================================================== +/// global hide() +/// unregister itself from any events +/// tags WellBase +void WellBase::hide() +{ + shown=false; + dbgprintf(("WellBase unregistering from engine\n")); + default_well_engine->del_timer(this); + default_well_engine->del_object(this); +} + +//=========================================================================== +/// global new_thing() +/// Generate new figure random gen for field +/// tags WellBase +void WellBase::new_thing() +{ + curThing = nextThing; + nextThing.random_number = LRAND(); + nextThing.random_rotation = NRAND(MAX_SIDES); + nextThing.random_reflection = NRAND(2); + nextThing.bonus = bonusNow; + bonusNow = false; + redo_next(); +} + +//=========================================================================== +/// global redo_next() +/// fill nextThing vars with data from polyomino +/// tags WellBase +void WellBase::redo_next() +{ + int turn_style = tris[squares - MIN_SQUARES].mode[diagonal].turn_style; + int next_start, i; + + nextThing.squares = squares - MIN_SQUARES + nextThing.bonus; + nextThing.squares = nextThing.squares > MAX_SQUARES - MIN_SQUARES ? + MAX_SQUARES - MIN_SQUARES: nextThing.squares; + next_start = nextThing.random_number % tris[nextThing.squares]. + mode[diagonal].number[(nextThing.bonus) ? NOMIX : mixed][turn_style]; + nextThing.color_number = next_start; + dbgprintf(("NEXT COLOR number is %d\n",next_start)); + if (mixed && !nextThing.bonus) + { + nextThing.squares = 0; + while (next_start >= + tris[nextThing.squares].mode[diagonal].number[NOMIX][turn_style]) + { + next_start -= + tris[nextThing.squares].mode[diagonal].number[NOMIX][turn_style]; + nextThing.squares++; + } + } + nextThing.polyomino_number = + tris[nextThing.squares].mode[diagonal].start[next_start][turn_style]; + if (tris[nextThing.squares].mode[diagonal].turn_style > NONE) + for (i = 0; i < nextThing.random_rotation; i++) + nextThing.polyomino_number = tris[nextThing.squares].polyomino + [nextThing.polyomino_number].rotation; + if (tris[nextThing.squares].mode[diagonal].turn_style == ALL) + for (i = 0; i < nextThing.random_reflection; i++) + nextThing.polyomino_number = tris[nextThing.squares].polyomino + [nextThing.polyomino_number].reflection; + nextThing.size = + tris[nextThing.squares].polyomino[nextThing.polyomino_number].size; + nextThing.ypos = -tris[nextThing.squares].polyomino + [nextThing.polyomino_number].start_height; +} + + +//=========================================================================== +/// global put_box() +/// Putting figure into game field +/// tags WellBase +void WellBase::put_box() +{ + int i, j, xi, yj; + int x = curThing.xpos, y = curThing.ypos; + + for (i = 0; i < curThing.size; i++) + for (j = 0; j < curThing.size; j++) + if ((y + j >= 0) && tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]) { + xi = (x + i) % MAX_PERIMETER; + yj = y + j; + if (yj < MAX_DEPTH) { // Draw on the wall of glass + wall[yj][xi].pmid = tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]; + wall[yj][xi].cid = curThing.color_number; + frozen_wall[xi / MAX_WIDTH] = MAX_SIDES; + } else { // Draw on the floor (base) + int base_i, base_j; + wall_to_base(&base_i, &base_j, xi, yj); + base[base_j][base_i].pmid = tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]; + base[base_j][base_i].cid = curThing.color_number; + } + } +} + + +//=========================================================================== +/// global overlapping() +/// check overlapping our figure in current position with another ones +/// on game field +/// tags WellBase +bool WellBase::overlapping() +{ + int i, j, xi, yj; + int x = curThing.xpos, y = curThing.ypos; + + for (i = 0; i < curThing.size; i++) + for (j = 0; j < curThing.size; j++) + if (tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]) { + xi = (x + i) % MAX_PERIMETER; + yj = y + j; + if (yj < MAX_DEPTH) { + if (frozen_wall[xi / MAX_WIDTH]) + return true; + if (gradualAppear) { +/* This method one can turn polyomino to an area above of screen, also + part of the polyomino may not be visible initially */ + if ((yj >= 0) && (wall[yj][xi].pmid >= 0)) + return true; + } else { +/* This method does not allow turning polyomino to an area above screen */ + if ((yj < 0) || (wall[yj][xi].pmid >= 0)) + return true; + } + } + else if (yj < MAX_DEPTH + MAX_WIDTH) { + int base_i, base_j; + wall_to_base(&base_i, &base_j, xi, yj); + if (base[base_j][base_i].pmid >= 0) + return true; + } + else + return true; + } + + return false; +} + +//=========================================================================== +/// global wall_to_base(int* base_x,int* base_y,int wall_x,int wall_y) +/// Translate wall coordinates to floor (base) one. +/// tags WellBase +void WellBase::wall_to_base(int* base_x,int* base_y,int wall_x,int wall_y) +{ + switch (wall_x / MAX_WIDTH) + { + case 0: + *base_x = wall_x; + *base_y = wall_y - MAX_DEPTH; + break; + case 1: + *base_x = MAX_WIDTH - 1 + MAX_DEPTH - wall_y; + *base_y = wall_x - MAX_WIDTH; + break; + case 2: + *base_x = MAX_PERIMETER - 1 - MAX_WIDTH - wall_x; + *base_y = MAX_WIDTH - 1 + MAX_DEPTH - wall_y; + break; + case 3: + *base_x = wall_y - MAX_DEPTH; + *base_y = MAX_PERIMETER - 1 - wall_x; + break; + default: + (void) fprintf (stderr, "wall_to_base kinds range 0-3, got %d.\n", + wall_x / MAX_WIDTH); + exit(-1); + } +} + +//=========================================================================== +/// global at_bottom() +/// Do we at bottom of the glass? (any piece of our figure) +/// tags WellBase +bool WellBase::at_bottom() +{ + int i, j, xi, yj; + int x = curThing.xpos, y = curThing.ypos; + + for (i = 0; i < curThing.size; i++) + for (j = 0; j < curThing.size; j++) + if (tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]) { + xi = (x + i) % MAX_PERIMETER; + yj = y + j; + if (yj < -1) + return false; + if (yj < MAX_DEPTH - 1) { + if (frozen_wall[xi / MAX_WIDTH]) + return true; + if (wall[yj + 1][xi].pmid >= 0) + return true; + } + else if (yj < MAX_DEPTH + MAX_WIDTH - 1) { + int base_i, base_j; + wall_to_base(&base_i, &base_j, xi, yj + 1); + if (base[base_j][base_i].pmid >= 0) + return true; + } + else + return true; + } + + return false; +} + +//=========================================================================== +/// global at_base_fully() +/// Do we fully on the floor? (all pieces of our figure) +/// tags WellBase +bool WellBase::at_base_fully() +{ + int i, j; + + for (i = 0; i < curThing.size; i++) + for (j = 0; j < curThing.size; j++) + if (curThing.ypos + j < MAX_DEPTH && tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]) + return false; + return true; +} + +//=========================================================================== +/// global at_base_partially() +/// Do we on the floor? (at least one of our piece) +/// tags WellBase +bool WellBase::at_base_partially() +{ + int i, j; + + for (i = 0; i < curThing.size; i++) + for (j = 0; j < curThing.size; j++) + if (curThing.ypos + j >= MAX_DEPTH && tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]) + return true; + return false; +} + +//=========================================================================== +/// global wall_change(thing_t old,thing_t new_t) +/// Do we change the wall from last position? +/// tags WellBase +bool WellBase::wall_change(thing_t old,thing_t new_t) +{ + int w = -1, i, j; + int x = curThing.xpos; + + for (i = 0; i < old.size; i++) + for (j = 0; j < old.size; j++) + if (tris[old.squares].polyomino[old.polyomino_number].shape[j][i]) { + if (w == -1) + w = ((x + i) % MAX_PERIMETER) / MAX_WIDTH; + else if (w != ((x + i) % MAX_PERIMETER) / MAX_WIDTH) + return true; + } + for (i = 0; i < new_t.size; i++) + for (j = 0; j < new_t.size; j++) + if (tris[new_t.squares].polyomino[new_t.polyomino_number].shape[j][i]) + if (w != ((x + i) % MAX_PERIMETER) / MAX_WIDTH) + return true; + return false; +} + + +//=========================================================================== +/// global try_move(Actions move) +/// Trying to move/rotate/fall our figure according to the given move action +/// tags WellBase +void WellBase::try_move(Actions move) +{ + thing_t old; + int i; + bool skip = false; + + old = curThing; + + switch (move) { + case FALL: + curThing.ypos ++; + break; + + case DROP: + do { + curThing.ypos ++; + score += level; + } while (!overlapping()); + curThing.ypos --; + break; + + case LEFT: + curThing.xpos = (curThing.xpos + MAX_PERIMETER - 1) % MAX_PERIMETER; + if (at_base_fully() || (at_base_partially() && wall_change(old, curThing))) + skip = true; + break; + + case RIGHT: + curThing.xpos = (curThing.xpos + 1) % MAX_PERIMETER; + if (at_base_fully() || (at_base_partially() && wall_change(old, curThing))) + skip = true; + break; + + case ROTATE: + if (tris[squares - MIN_SQUARES].mode[diagonal].turn_style > NONE) + { + if (cw) + for (i = 0; i < MAX_SIDES - 1; i++) + curThing.polyomino_number = tris[curThing.squares].polyomino + [curThing.polyomino_number].rotation; + else /* ccw */ + curThing.polyomino_number = tris[curThing.squares].polyomino + [curThing.polyomino_number].rotation; + curThing.xpos = old.xpos; + curThing.ypos = old.ypos; + if (at_base_partially() && wall_change(old, curThing)) + skip = true; + } + break; + + case REFLECT: /* reflect on y axis */ + if (tris[squares - MIN_SQUARES].mode[diagonal].turn_style == ALL) + { + curThing.polyomino_number = tris[curThing.squares].polyomino + [curThing.polyomino_number].reflection; + curThing.xpos = old.xpos; + curThing.ypos = old.ypos; + if (at_base_partially() && wall_change(old, curThing)) + skip = true; + } + break; + default: + skip=true; + break; + } + + if (!skip && !overlapping()) + draw_thing_diff(&old); + else + curThing = old; +} + +//=========================================================================== +/// global draw_box(int color,int i,int j) +/// Draw our box (piece of figure) on our virtual square (walls + floor) +/// tags WellBase +void WellBase::draw_box(int color,int i,int j) +{ + if (j < MAX_DEPTH) { //Draw trapazoid on the wall + dre->draw_trapazoid(color, i, j); + } + else { // Draw square on the floor + int base_i, base_j; + wall_to_base(&base_i, &base_j, i, j); + dre->draw_square(color, base_i, base_j); + } +} + +//=========================================================================== +/// global draw_thing() +/// for all squares in figure do draw_box -> draw whole figure on the field +/// tags WellBase +void WellBase::draw_thing() +{ + int i, j, xi; + + for (i = 0; i < curThing.size; i++) + for (j = 0; j < curThing.size; j++) + if (tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]) { + xi = (curThing.xpos + i) % MAX_PERIMETER; + draw_box(curThing.color_number,xi, curThing.ypos + j); + } +} + +//=========================================================================== +/// global draw_thing_diff(thing_t* old) +/// Make diff between old and new position on figure and Draw its +/// actually Draw new one and clear empty old pieces :) +/// tags WellBase +void WellBase::draw_thing_diff(thing_t* old) +{ + int i, j, ox, oy; + + for (i = 0; i < curThing.size; i++) + for (j = 0; j < curThing.size; j++) + if ((curThing.ypos + j >= 0) && tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[j][i]) + { + draw_box(curThing.color_number, + (curThing.xpos + i) % MAX_PERIMETER, curThing.ypos + j); + } + + for (i = 0; i < curThing.size; i++) + for (j = 0; j < curThing.size; j++) + { + ox = (old->xpos + i - curThing.xpos + MAX_PERIMETER) % MAX_PERIMETER; + oy = old->ypos + j - curThing.ypos; + if (tris[old->squares].polyomino[old->polyomino_number].shape[j][i] && + ((ox >= curThing.size) || (oy < 0) || (oy >= curThing.size) || + !tris[curThing.squares].polyomino + [curThing.polyomino_number].shape[oy][ox])) + { + draw_box(BackColor,(old->xpos + i) % MAX_PERIMETER, old->ypos + j); + } + } +} + +//=========================================================================== +/// global fill_lines() +/// Fill all glass with random squares. Just for test only +/// tags WellBase +void WellBase::fill_lines() +{ + int i, j; + int turn_style = tris[squares - MIN_SQUARES].mode[diagonal].turn_style; + + for (j = 0; j < MAX_DEPTH + MAX_WIDTH; j++) + for (i = 0; i < MAX_PERIMETER; i++) + { + draw_box(NRAND(tris[squares - MIN_SQUARES].mode + [diagonal].number[mixed][turn_style]), + i, j); + } +} + +//=========================================================================== +/// global freeze_wall(int w) +/// Freeze wall - make some blinks while freezing :) +/// tags WellBase +void WellBase::freeze_wall(int w) +{ + int i, j; + + for (j = 0; j < MAX_DEPTH; j++) + for (i = 0; i < MAX_WIDTH; i++) + { + if (wall[j][i+w*MAX_WIDTH].pmid < 0) + dre->draw_trapazoid(FreezeColor, w * MAX_WIDTH + i, j); + } + dre->sync(); + udelay(FLUSH_DELAY); + for (j = 0; j < MAX_DEPTH; j++) + for (i = 0; i < MAX_WIDTH; i++) + { + if (wall[j][i+w*MAX_WIDTH].pmid < 0) + dre->draw_trapazoid (BackColor, w * MAX_WIDTH + i, j); + } + dre->sync(); + udelay(FLUSH_DELAY); + for (j = 0; j < MAX_DEPTH; j++) + for (i = 0; i < MAX_WIDTH; i++) + { + if (wall[j][i+w*MAX_WIDTH].pmid < 0) + dre->draw_trapazoid (FreezeColor, w * MAX_WIDTH + i, j); + } + if (beep) + dre->bell(BVOLUME); + dre->sync(); +} + +//=========================================================================== +/// global defreeze_wall(int w) +/// Return wall to normal state +/// tags WellBase +void WellBase::defreeze_wall(int w) +{ + int i, j; + + for (j = 0; j < MAX_DEPTH; j++) + for (i = 0; i < MAX_WIDTH; i++) + { + if (wall[j][i+w*MAX_WIDTH].pmid < 0) + dre->draw_trapazoid (BackColor, w * MAX_WIDTH + i, j); + } + if (beep) + dre->bell(BVOLUME); + dre->sync(); +} + +void WellBase::udelay(int msec) +{ + default_well_engine->udelay(msec); +} + +//=========================================================================== +/// global draw_field() +/// Draw field with squares and frozen walls +/// tags WellBase +void WellBase::draw_field() +{ + int i, j; + + for (i = 0; i < MAX_PERIMETER; i++) + for (j = 0; j < MAX_DEPTH; j++) + { + if (wall[j][i].pmid >= 0) + dre->draw_trapazoid(wall[j][i].cid, i, j); + else + { + if (frozen_wall[i / MAX_WIDTH]) + dre->draw_trapazoid(FreezeColor, i, j); + else + dre->draw_trapazoid(BackColor, i, j); + } + } + for (i = 0; i < MAX_WIDTH; i++) + for (j = 0; j < MAX_WIDTH; j++) + if (base[j][i].pmid >= 0) + dre->draw_square(base[j][i].cid, i, j); + else + dre->draw_square(BackColor, i, j); + dre->clear_dirty_list(); + dre->field_sync(); +} + +//=========================================================================== +/// global draw_next() +/// Draw next figure (cheating?) +/// Currently not implemented +/// tags WellBase +void WellBase::draw_next() +{ + int x, y; + int i, j; + + Colors color= nextThing.bonus ? BonusColor : GridColor; + Colors color2= nextThing.bonus ? BonusColor2 : GridColor2; + + dbgprintf(("Next color: %d, size: %d\n",nextThing.color_number, + nextThing.size)); + x=NEXT_CENTER_X - nextThing.size*(NEXT_BOX_SIZE+2)/2; + y=NEXT_CENTER_Y - nextThing.size*(NEXT_BOX_SIZE+2)/2; + + for (i = 0; i < nextThing.size; i++) + for (j = 0; j < nextThing.size; j++) + if (tris[nextThing.squares].polyomino + [nextThing.polyomino_number].shape[j][i]) + { + dre->draw_rect(x+ (NEXT_BOX_SIZE+2)*i, y+ (NEXT_BOX_SIZE+2)*j, + NEXT_BOX_SIZE, NEXT_BOX_SIZE, color); + dre->draw_rect(x+ (NEXT_BOX_SIZE+2)*i +1, y+ (NEXT_BOX_SIZE+2)*j +1, + NEXT_BOX_SIZE-2, NEXT_BOX_SIZE-2, color2); + } + dre->sync(); +} + +//=========================================================================== +/// global clear_next() +/// Clear next figure +/// Currently not implemented +/// tags WellBase +void WellBase::clear_next() +{ + dre->fill_rect(NEXT_CENTER_X-NEXT_X_SIZE/2+1,NEXT_CENTER_Y-NEXT_Y_SIZE/2+1, + NEXT_X_SIZE-1,NEXT_Y_SIZE-1,BackColor); +} + +//=========================================================================== +/// global draw_status() +/// draw status of the game, i.e. scores, lines... +/// Currently not implemented +/// tags WellBase +void WellBase::draw_status() +{ + int delta_score; + Score *pscore2=0,*pscore1=0; + char buf[L_MAXPATH]; + char buf2[PLAYER_NAME_LEN]; + + if(!shown) + return; + + dbgprintf(("score: %d, lines: %d, level %d, levelup at: +%d\n", + score, rows, level, rows_levelup - rows)); + sprintf(buf,"%d",score); + txt_score->set_text(buf); + txt_score->draw_text(RightJust); + sprintf(buf,"%d",rows); + txt_lines->set_text(buf); + txt_lines->draw_text(RightJust); + sprintf(buf,"+%d",rows_levelup - rows + 1); + txt_levelup->set_text(buf); + txt_levelup->draw_text(RightJust); + sprintf(buf,"%d",level); + txt_level->set_text(buf); + txt_level->draw_text(RightJust); + dbgprintf(("score done\n")); + pscore2=default_top_nine->find_challenger(player_score); + if(pscore2) + pscore1=default_top_nine->find_challenger(pscore2); + + do { + if(pscore1) + { + delta_score=pscore1->score - player_score->score; + delta_score= delta_score>=100000 ? 99999 : delta_score; + strncpy(buf2,pscore1->player,CHAL_NAME_LEN); + buf2[CHAL_NAME_LEN]=0; + sprintf(buf,"%d.%-9s+%05d",pscore1->place,buf2, + delta_score); + dbgprintf(("draw_status: %s\n",buf)); + txt_first->set_text(buf); + txt_first->draw_text(); + + strncpy(buf2,pscore2->player,CHAL_NAME_LEN); + buf2[CHAL_NAME_LEN]=0; + delta_score=pscore2->score - player_score->score; + delta_score= delta_score>=100000 ? 99999 : delta_score; + sprintf(buf,"%d.%-9s+%05d",pscore2->place,buf2, + delta_score); + txt_second->set_text(buf); + txt_second->draw_text(); + + sprintf(buf,"%d.You are here",pscore2->place+1); + txt_third->set_text(buf); + txt_third->draw_text(); + break; + } + if(pscore2) + { + strncpy(buf2,pscore2->player,CHAL_NAME_LEN); + buf2[CHAL_NAME_LEN]=0; + delta_score=pscore2->score - player_score->score; + delta_score= delta_score>=100000 ? 99999 : delta_score; + sprintf(buf,"%d.%-9s+%05d",pscore2->place,buf2, + delta_score); + txt_first->set_text(buf); + txt_first->draw_text(); + + sprintf(buf,"%d.You are here",pscore2->place+1); + txt_second->set_text(buf); + txt_second->draw_text(); + + txt_third->clear_region(); + break; + } + sprintf(buf,"%d.You are here",1); + txt_first->set_text(buf); + txt_first->draw_text(); + + txt_second->clear_region(); + + txt_third->clear_region(); + } while(0); + + if(rotation) + default_well_engine->screen_copy(&geo[GEO_ROT_IDX]); + if(showNext) + default_well_engine->screen_copy(&geo[GEO_NEXT_IDX]); + if(mixed) + default_well_engine->screen_copy(&geo[GEO_MIXED_IDX]); + dre->sync(); +} + +//=========================================================================== +/// global draw_grid() +/// draw grid of the field +/// tags WellBase +void WellBase::draw_grid() +{ + dre->draw_grid(); +} + +//=========================================================================== +/// global drop_wall(int wall_num) +/// Drop all squres on the wall to the floor after row is cleared +/// tags WellBase +void WellBase::drop_wall(int w) +{ + int i, j, k, l, fits, lines, base_x, base_y; + lines = 0; + for (j = MAX_DEPTH - 1; j >= 0 && lines == 0; j--) + for (i = 0; i < MAX_WIDTH; i++) + if (wall[j][w * MAX_WIDTH + i].pmid != EMPTY) + lines = MAX_DEPTH - j; + if (lines > 0) { + fits = true; + j = 0; + while (j < (MAX_WIDTH / 2 + lines - 1) && fits) { + j++; + for (l = MAX_DEPTH - j; l < MAX_DEPTH; l++) + for (i = 0; i < MAX_WIDTH; i++) + if (wall[l][w * MAX_WIDTH + i].pmid != EMPTY) { + wall_to_base(&base_x, &base_y, + w * MAX_WIDTH + i, l + j); + if (base[base_y][base_x].pmid != EMPTY) + fits = false; + } + } + if (!fits) + j--; + if (j > 0) + { + for (l = MAX_DEPTH - 1; l >= 0; l--) + for (i = 0; i < MAX_WIDTH; i++) + if (wall[l][w * MAX_WIDTH + i].pmid != EMPTY) { + k = w * MAX_WIDTH + i; + if (l + j >= MAX_DEPTH) { + wall_to_base(&base_x, &base_y, k, l + j); + base[base_y][base_x] = wall[l][k]; + wall[l][k].pmid = EMPTY; + dre->draw_trapazoid(BackColor, k, l); + dre->draw_square(wall[l][k].cid, base_x, base_y); + } else { + wall[l + j][k] = wall[l][k]; + wall[l][k].pmid = EMPTY; + dre->draw_trapazoid(BackColor, k, l); + dre->draw_trapazoid(wall[l][k].cid, k, l + j); + } + dre->sync(); + } + if (beep) + dre->bell(BVOLUME); + dre->sync(); + } + } +} + +//=========================================================================== +/// global all_frozen() +/// True if all walls are frozen -> end of the game +/// tags WellBase +bool WellBase::all_frozen() +{ + int w; + + for (w = 0; w < MAX_SIDES; w++) + if (frozen_wall[w] == MAX_SIDES) { + freeze_wall(w); + } + for (w = 0; w < MAX_SIDES; w++) + if (frozen_wall[w] == 0) + return false; + return true; +} + +//=========================================================================== +/// global check_freeze() +/// Check frozen walls - decrease frozen counter and do defreeze +// and dropwall +/// tags WellBase +void WellBase::check_freeze() +{ + int w; + bool all_frozen=true; + + for (w = 0; w < MAX_SIDES; w++) { + if (frozen_wall[w] == 0) + { + all_frozen=false; + drop_wall(w); + } + else + { + frozen_wall[w]--; + if (frozen_wall[w] == 0) + { + defreeze_wall(w); + drop_wall(w); + all_frozen=false; + } + } + } + + if(all_frozen) + { + dbgprintf(("check_freeze - all frozen - doing game_over\n")); + throw aGameOver; + } + + /* not all frozen else this is an infinite loop */ + /* curThing.xpos = (MAX_WIDTH - curThing.size) / 2; */ + curThing.xpos = NRAND(MAX_WIDTH - curThing.size + 1); + do { + w = NRAND(MAX_SIDES); + } while (frozen_wall[w]); //Hmm, very strange method of choosing the wall??? + curThing.xpos += w * MAX_WIDTH; +} + +//=========================================================================== +/// global check_lines() +/// Checking for full lines on the floor and deleting it - make free space +/// tags WellBase +int WellBase::check_lines() +{ + int lSet[2][MAX_WIDTH], nset[2]; + int i, j, k; + + nset[0] = nset[1] = 0; + + //First check horizontal lines, increase nset[0] and lSet[0][line] + for (j = 0; j < MAX_WIDTH; j++) + { + lSet[0][j] = 0; + for (i = 0; i < MAX_WIDTH; i++) + if (base[j][i].pmid >= 0) + lSet[0][j] ++; + if (lSet[0][j] == MAX_WIDTH) + nset[0] ++; + } + //Then the same for vertical ones + for (i = 0; i < MAX_WIDTH; i++) + { + lSet[1][i] = 0; + for (j = 0; j < MAX_WIDTH; j++) + if (base[j][i].pmid >= 0) + lSet[1][i] ++; + if (lSet[1][i] == MAX_WIDTH) + nset[1] ++; + } + if (nset[0] || nset[1]) //If we have full lines + { + // Now flashing full lines awhile + for (k = 0; k < NUM_FLASHES; k++) + { + int color; + color=(k%2) ? BackColor : FlashColor; + for (j = 0; j < MAX_WIDTH; j++) + { + if (lSet[0][j] == MAX_WIDTH) + { + for (i = 0; i < MAX_WIDTH; i++) + dre->draw_square(color, i, j); + } + if (lSet[1][j] == MAX_WIDTH) + { + for (i = 0; i < MAX_WIDTH; i++) + dre->draw_square(color, j, i); + } + } + dre->flush_dirty(); + dre->sync(); + udelay(FLUSH_DELAY/2); + } + + if (nset[0] > 0) //Now delete full horizontal lines + for (j = 0; j < MAX_WIDTH; j++) + if (lSet[0][j] == MAX_WIDTH) + { + if (j < MAX_WIDTH / 2) + //If upper part of field then move other lines down to center + for (i = 0; i < MAX_WIDTH; i++) + { + for (k = j; k > 0; k--) + base[k][i] = base[k - 1][i]; + base[0][i].pmid = EMPTY; + } + else //else move them up + { + for (i = 0; i < MAX_WIDTH; i++) + { + for (k = j; k < MAX_WIDTH - 1; k++) + base[k][i] = base[k + 1][i]; + base[MAX_WIDTH - 1][i].pmid = EMPTY; + } + for (k = j; k < MAX_WIDTH - 1; k++) + //Fixing lSet position of moved lines + lSet[0][k]=lSet[0][k+1]; + lSet[0][MAX_WIDTH-1]=0; + j--; //Fixing index + } + } + if (nset[1] > 0) //Do the same for vertical lines + for (i = 0; i < MAX_WIDTH; i++) + if (lSet[1][i] == MAX_WIDTH) + { + if (i < MAX_WIDTH / 2) + for (j = 0; j < MAX_WIDTH; j++) + { + for (k = i; k > 0; k--) + base[j][k] = base[j][k - 1]; + base[j][0].pmid = EMPTY; + } + else + { + for (j = 0; j < MAX_WIDTH; j++) + { + for (k = i; k < MAX_WIDTH - 1; k++) + base[j][k] = base[j][k + 1]; + base[j][MAX_WIDTH - 1].pmid = EMPTY; + } + for (k = i; k < MAX_WIDTH - 1; k++) + lSet[1][k]=lSet[1][k+1]; + lSet[1][MAX_WIDTH-1]=0; + i--; + } + } + + //Now reDraw new field + for (j = 0; j < MAX_WIDTH; j++) + for (i = 0; i < MAX_WIDTH; i++) + { + if (base[j][i].pmid >= 0) + dre->draw_square(base[j][i].cid, i, j); + else + dre->draw_square(BackColor, i, j); + } + //All done, beeping... + if (beep) + dre->bell(BVOLUME); + dre->flush_dirty(); + dre->sync(); + } + + return (nset[0] + nset[1]); +} + + +//=========================================================================== +/// global check_update_lines() +/// Calculating statistics ans SCORES! :) And redraw status +/// tags WellBase +void WellBase::check_update_lines() +{ + int lines,mult; + int oldrows=rows; + lines = check_lines(); + score += lines + !gradualAppear + !grid; + mult= showNext ? 5 : 7; + mult += (rotation ? 1 : 0); + score += mult * level * level * lines * lines * lines * + squares * squares * (bonus + diagonal + 1) / (16 * (1 + mixed)); + rows += lines; + player_score->set_params(score,rows,level); + if (rows > rows_levelup) + { + level++; + new_level_calc(); + if (bonus) + bonusNow = true; + player_score->set_params(score,rows,level); + draw_status(); + } else + if(oldrows!=rows) + draw_status(); +} + +//=========================================================================== +/// global move_one_step(Actions move) +/// Move figure one step down/left/right +/// tags WellBase +bool WellBase::move_one_step(Actions move) +{ + if ((move == DROP) || ((move == FALL) && at_bottom())) { + try_move(move); + put_box(); + check_update_lines(); + new_thing(); + if (showNext) { + clear_next(); + draw_next(); + } + dre->sync(); /* discard all events */ + if (all_frozen()) + throw aGameOver; + check_freeze(); + if (overlapping()) + throw aGameOver; + check_update_lines(); + draw_thing(); + return true; + } else { + try_move(move); + if (rows > THRESHOLD(level)) { + level++; + draw_status(); + if (bonus) + bonusNow = true; + } + } + return false; +} + +//=========================================================================== +/// global game_over() +/// game is over :( you are looser +/// tags WellBase +void WellBase::game_over() +{ + dbgprintf(("WellBase::game_over() called\n")); + hide(); + player_score->calc_play_time(); + player_score=default_top_nine->try_add_to_table(player_score); + delete player_score; + game_over_object.call(wEvent(aGameOver,this)); +} + +//=========================================================================== +/// global redraw_all() +/// redraw all game +/// tags WellBase +void WellBase::redraw_all() +{ + if(!shown) + return; + + draw_status(); + dre->flush_all(); + clear_next(); + if(showNext) + draw_next(); + dre->flush_all(); + + while(steps_to_rotate>0) + { + make_rotation(); + steps_to_rotate--; + udelay(FLUSH_DELAY/10); + } + + dre->sync(); +} + +//=========================================================================== +/// global make_pause() +/// set/uset game pause +/// tags WellBase +void WellBase::make_pause() +{ + pause^=1; + if(pause) + { + default_well_engine->del_timer(this); + dre->clear_field(0); + dre->pixmap_copy(&geo[GEO_PAUSE_IDX]); + dre->flush_all(); + dre->sync(); + } else + { + default_well_engine->add_timer(this,speeds[level]); + dre->clear_field(0); + draw_field(); + draw_thing(); + redraw_all(); + } +} + +//=========================================================================== +/// global make_rotation() +/// rotate field step by step +/// tags WellBase +void WellBase::make_rotation() +{ + dre->outer_rotation(); + dre->clear_field(0); + draw_field(); + draw_thing(); + dre->flush_all(); + dre->sync(); +} + +//=========================================================================== +/// global process_event() +/// process all events for this game object +/// return false if we don't want to process this event for other objects +/// tags WellBase +bool WellBase::process_event(wEvent ev) +{ + Actions action; + + switch(ev.type) + { + case eTimeOut: + dbgprintf(("WellBase got time out event\n")); + try + { + move_one_step(FALL); + dre->flush_dirty(); + } + catch(EvType) + { + game_over(); + return false; + } + break; + + case eExpose: + dbgprintf(("WellBase got expose event\n")); + redraw_all(); + break; + + case eFocusOut: + if(!pause) + make_pause(); + return false; + + case eKeyPress: + action=dre->key_to_action(ev.data); + try + { + return process_action(action); + } + catch(EvType) + { + game_over(); + return false; + } + + case eDelete: + hide(); + break; + + case aIntroExit: + new_game(); + show(); + break; + } + return true; +} + +//=========================================================================== +/// global process_action(Actions) +/// process actions - moves/drops/other +/// tags WellBase +bool WellBase::process_action(Actions action) +{ + switch(action) + { + case LEFT: + case RIGHT: + case ROTATE: + case FALL: + case DROP: + if(pause) + return false; + move_one_step(action); + dre->flush_dirty(); + return false; + + case PAUSE_GAME: + make_pause(); + return false; + + case OUTER_ROTATION: + if(pause) + return false; + make_rotation(); + return false; + + case END_GAME: + game_over(); + return false; + + case LEVEL_UP: + if(pause) + return false; + if(level+10) + { + level--; + new_level_calc(); + draw_status(); + } + return false; + } + return true; +} diff --git a/src/welldrawing.cxx b/src/welldrawing.cxx new file mode 100644 index 0000000..74e59e2 --- /dev/null +++ b/src/welldrawing.cxx @@ -0,0 +1,220 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: welldrawing.cxx,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ +#include "globals.h" +#include "welldrawing.h" + +//=========================================================================== +/// global init(int n_fields, int dx, int dy, unsigned l, unsigned h) +/// init indexes and allocate FieldPoints +/// tags WellDrawingEngine +void WellDrawingEngine::init(int inum_fields, int idx, int idy, + unsigned int il, unsigned int ih) +{ + l=il;h=ih; + delta_x=idx; + delta_y=idy; + current_id=0; + num_fields=inum_fields; + points=new FieldPoints[num_fields]; + inner_max_alpha=0.0; + f_step=1; +} + + +//=========================================================================== +/// global flush_dirty() +/// pseudo function that need flush dirty rec to the screen, +/// here it only delete dirty rect from queue +/// tags WellDrawingEngine +void WellDrawingEngine::flush_dirty() +{ + DirtyList *plist; + do + { + plist=dirty_list.get_next(); + if(plist) + { + //Here we need to draw dirty rec on the screen -> will be in overloaded childs + + plist->del_self(); + delete plist; + } + } while(plist); + +} + + +void WellDrawingEngine::draw_square(int color, int x, int y) +{ + +} + +void WellDrawingEngine::draw_trapazoid(int color, int x, int y) +{ + +} + +void WellDrawingEngine::sync() +{ + +} + +void WellDrawingEngine::flush_all() +{ + +} + +void WellDrawingEngine::bell(int) +{ + +} + + +//=========================================================================== +/// global outer_rotation() +/// make shift current field id -> switch to next field -> rotate it +/// tags WellDrawingEngine +void WellDrawingEngine::outer_rotation() +{ + current_id+=f_step; + if(current_id>=num_fields) + { + f_step*=-1; + current_id+=(f_step+f_step); + } + if(current_id<0) + { + f_step*=-1; + current_id+=(f_step+f_step); + } +} + + +//=========================================================================== +/// global set_field_sizes(int dx, int dy, int wall_delta, int base_delta) +/// set and calculate base vars +/// tags WellDrawingEngine +void WellDrawingEngine::set_field_sizes(int idx, int idy, + int ipix_wall_delta, + int ipix_base_delta) +{ + pix_dx=idx; + pix_dy=idy; + pix_wall_delta=ipix_wall_delta; + pix_base_delta=ipix_base_delta; + pix_base_width=pix_base_delta*MAX_WIDTH; + pix_max_delta=pix_wall_delta*MAX_DEPTH; + pix_max_width=pix_base_width + 2*pix_max_delta; +} + +//=========================================================================== +/// global calc_grid_points() +/// calculate all points for each field, rotate it with inner and +/// outer alpha angle +/// tags WellDrawingEngine +void WellDrawingEngine::calc_grid_points() +{ + int gi,i,j,w,x,y,n; + float alpha; + center_x=pix_dx+pix_max_width/2; + center_y=pix_dy+pix_max_width/2; + for(n=0;n x=%4d, y=%4d\n",i,j,x,y)); + x+=pix_dx; + y+=pix_dy; + alpha= + inner_max_alpha*float(j)/float(MAX_DEPTH)*float(n)/float(num_fields-1)+ + float(n)*outer_max_alpha/float(num_fields-1); + + if(alpha!=0.0) //lets make rotation + { + points[n].wall_points[gi][j].x=int( + float((x-center_x))*cos(alpha) - + float((y-center_y))*sin(alpha) + + center_x); + + points[n].wall_points[gi][j].y=int( + float((x-center_x))*sin(alpha) + + float((y-center_y))*cos(alpha) + + center_y); + + } else + { + points[n].wall_points[gi][j].x=x; + points[n].wall_points[gi][j].y=y; + } + } + for(j=0;jget_object(); + obj.ticks_left--; + if(obj.ticks_left<=0) + { + processed=true; + obj.restart_ticks(); + if(!obj.obj->process_event(wEvent(eTimeOut))) + //if we return false -> don't process any objects + break; + } + ptimelist=ptimelist->get_next(); + } + return processed; +} + +//=========================================================================== +/// global add_timer(WellObject*, int N_ticks) +/// add object to time list for ticking every N_ticks +/// tags WellEngine +bool WellEngine::add_timer(WellObject* wo, int ticks) +{ + TimeObject obj(wo,ticks); + TimeList *ptobject=new TimeList(obj); + timelist.add(ptobject); + return true; +} + +//=========================================================================== +/// global del_timer(WellObject*) +/// delete object from time list +/// tags WellEngine +bool WellEngine::del_timer(WellObject* wo) +{ + TimeObject obj(wo); + TimeList *plist=timelist.del(obj); + if(plist) + { + delete plist; + return true; + } + return false; +} + +//=========================================================================== +/// global new_well_drawing_engine() +/// creates drawing engine for well board - must be overloaded in childs +/// tags WellEngine +WellDrawingEngine* WellEngine::new_well_drawing_engine() +{ + return 0; +} + + +//=========================================================================== +/// global process_event_for_all(wEvent) +/// go throuht the list of objects, and call process_event for each +/// if object return false -> break the loop +/// tags WellEngine +bool WellEngine::process_event_for_all(wEvent ev) +{ + bool processed=true; + ObjectList* plist=objectlist.get_next(); + while(plist) + { + if(!plist->get_object()->process_event(ev)) + //if we return false -> don't process any objects + return false; + plist=plist->get_next(); + } + return processed; +} + +//=========================================================================== +/// global add_object(WellObject*) +/// add object to list of objects that want events +/// tags WellEngine +bool WellEngine::add_object(WellObject* wo) +{ + ObjectList *ptobject=new ObjectList(wo); + objectlist.add(ptobject); + return true; +} + +//=========================================================================== +/// global del_object(WellObject*, int N_ticks) +/// delete object from list of objects that want events +/// tags WellEngine +bool WellEngine::del_object(WellObject* wo) +{ + ObjectList *plist=objectlist.del(wo); + if(plist) + { + delete plist; + return true; + } + return false; +} + +//=========================================================================== +/// global clear_objectlist() +/// clear all list of objects +/// tags WellEngine +void WellEngine::clear_objectlist() +{ + ObjectList *plist; + do + { + plist=objectlist.get_next(); + if(plist) + { + plist->del_self(); + delete plist; + } + } while(plist); +} + +//=========================================================================== +/// global load_images() +/// load all images for the game +/// tags WellEngine +void WellEngine::load_images() +{ + fprintf(stderr, "Loading resources.."); + load_image(imBoardBG, "board2.gif"); + fprintf(stderr, ".."); + load_image(imFont1, "font2.gif"); + fprintf(stderr, ".."); + load_image(imIntroBG, "wellintro.gif"); + fprintf(stderr, ".."); + load_image(imScoreBG, "topnine.gif"); + fprintf(stderr, ".."); + load_image(imCuts, "wellcuts.gif"); + fprintf(stderr, "..done\n"); +} + +//=========================================================================== +/// global new_well_intro() +/// creates new introduction object - version for SDL Window +/// tags WellEngine +WellIntro* WellEngine::new_well_intro() +{ + return new WellIntro; +} + +//=========================================================================== +/// global new_well_top_nine() +/// creates new top nine object +/// tags WellEngine +WellTopNine* WellEngine::new_well_top_nine() +{ + return new WellTopNine; +} + + +//=========================================================================== +/// global new_well_key(char*) +/// creates new key object +/// tags WellEngine +WellKey* WellEngine::new_well_key(char* name) +{ + return new WellKey(name); +} + +//=========================================================================== +/// global new_well_switch(char*) +/// creates new switch object +/// tags WellEngine +WellSwitch* WellEngine::new_well_switch(char* name) +{ + return new WellSwitch(name); +} + + +//=========================================================================== +/// global new_well_base() +/// creates new game object +/// tags WellEngine +WellBase* WellEngine::new_well_base() +{ + return new WellBase; +} + + + + + diff --git a/src/wellimagefont.cxx b/src/wellimagefont.cxx new file mode 100644 index 0000000..5850f3b --- /dev/null +++ b/src/wellimagefont.cxx @@ -0,0 +1,141 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: wellimagefont.cxx,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ + +#include "wellimagefont.h" + +//=========================================================================== +/// global WellImageFont(Images id, unsigned int ifl, unsigned int ifh, int idx, int idy) +/// Constructor of base draw text class +/// tags WellImageFont +WellImageFont::WellImageFont(Images id, unsigned int ifl, unsigned int ifh, + int idx, int idy) +{ + font_id=id; + font_l=ifl; + font_h=ifh; + dx=idx; + dy=idy; + text_l=0; +} + +//=========================================================================== +/// global set_font(...) +/// setting font params +/// tags WellImageFont +void WellImageFont::set_font(unsigned int ifl, unsigned int ifh, + int idx, int idy) +{ + font_l=ifl; + font_h=ifh; + dx=idx; + dy=idy; +} + +//=========================================================================== +/// global set_text(char*) +/// setting text for output +/// tags WellImageFont +void WellImageFont::set_text(char* itext) +{ + strcpy(text,itext); + text_l=strlen(text); +} + + +//=========================================================================== +/// global set_screen_region(int ix, int iy, int il, int ih) +/// setting text for output +/// tags WellImageFont +void WellImageFont::set_screen_region(int ix, int iy, int il, int ih) +{ + screen_x=ix; + screen_y=iy; + screen_l=il; + screen_h=ih; +} + + +//=========================================================================== +/// global draw_text(Justify just) +/// draw text with given justification +/// tags WellImageFont +void WellImageFont::draw_text(Justify just) +{ + draw_text(text,text_l,just); +} + +//=========================================================================== +/// global draw_text(char *text, int text_l, Justify just) +/// draw text with given justification +/// tags WellImageFont +void WellImageFont::draw_text(char* txt, int txt_l, Justify just) +{ + int i,draw_x; + unsigned int draw_h; + + clear_region(); + if(txt_l<=0) + return; + + switch(just) + { + case LeftJust: + draw_x=screen_x; + break; + case RightJust: + draw_x=screen_x+screen_l-txt_l*font_l; + break; + case CenterJust: + draw_x=screen_x+(screen_l-txt_l*font_l)/2; + break; + } + draw_h=(screen_hnew_well_image_font(imFont1,FONT2_L,FONT2_H, + FONT2_DX,FONT2_DY); + fnt->set_screen_region(geo[1].tox, geo[1].toy, geo[1].l, geo[1].h); +} + + +//=========================================================================== +/// global process_event(wEvent) +/// stub that process events +/// tags WellInput +bool WellInput::process_event(wEvent ev) +{ + switch(ev.type) + { + case eKeyPress: + dbgprintf(("WellInput - done\n")); + object_on_enter.call(wEvent(aInputDone,this)); + return false; + + } + return true; +} + +//=========================================================================== +/// global highlight(int mx, int my) +/// highlights key +/// tags WellInput +void WellInput::set_text(char* txt) +{ + if(txt) + { + strcpy(buf,txt); + buflen=strlen(buf); + if(buflen>maxlen) + buflen=maxlen; + buf[buflen]=0; + pos=buflen; + } else + { + buflen=pos=0; + buf[buflen]=0; + } +} + + +//=========================================================================== +/// global draw_text() +/// draw text on the screen +/// tags WellInput +void WellInput::draw_text() +{ + fnt->draw_text(buf,buflen,BackColor); +} + +//=========================================================================== +/// global show() +/// show object +/// tags WellInput +void WellInput::show() +{ + shown=true; + redraw(); + default_well_engine->add_object(this); +} + +//=========================================================================== +/// global redraw() +/// redraw object +/// tags WellInput +void WellInput::redraw() +{ + if(shown) + { + default_well_engine->screen_copy(&geo[0]); + draw_text(); + } +} + +//=========================================================================== +/// global hide() +/// hide object +/// tags WellInput +void WellInput::hide() +{ + shown=false; + default_well_engine->screen_clear(&geo[0]); + default_well_engine->del_object(this); +} + + diff --git a/src/wellintro.cxx b/src/wellintro.cxx new file mode 100644 index 0000000..0b86e6b --- /dev/null +++ b/src/wellintro.cxx @@ -0,0 +1,472 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: wellintro.cxx,v 1.3 2003/02/27 08:27:51 leo Exp $ + +/// module description +/// WellIntro class - implements Introduction screen with options switches +/// new game, top nine and exit keys + +#include "wellclass.h" +#include "wellintro.h" +#include "wellengine.h" +#include "welltopnine.h" +#include "version.h" + +//=========================================================================== +/// global WellIntro() +/// constructor - fill table +/// tags WellIntro +WellIntro::WellIntro() : WellObject() +{ + int i; + char buf[L_MAXPATH]; + start_level=0; + txt_level=default_well_engine->new_well_image_font(imFont1,FONT3_L,FONT3_H, + FONT3_DX,FONT3_DY); + txt_level->set_screen_region(674,403,34,20); + + key_exit=default_well_engine->new_well_key("intro_key_exit"); + key_new_game=default_well_engine->new_well_key("intro_key_new_game"); + key_top_nine=default_well_engine->new_well_key("intro_key_top_nine"); + key_plus=default_well_engine->new_well_key("intro_key_plus"); + key_minus=default_well_engine->new_well_key("intro_key_minus"); + + key_exit->set_object_on_press(ObjectCaller(this,&WellObject::hide_by_call)); + key_new_game->set_object_on_press(ObjectCaller(this,&WellObject::hide_by_call)); + key_top_nine->set_object_on_press(ObjectCaller(this,&WellObject::hide_by_call)); + key_plus->set_object_on_press(ObjectCaller(this,&WellObject::process_event)); + key_minus->set_object_on_press(ObjectCaller(this,&WellObject::process_event)); + + sw_rotation=default_well_engine->new_well_switch("intro_sw_rotation"); + sw_rotation->set_object_on_switch(ObjectCaller(this, + &WellObject::process_event)); + sw_next_piece=default_well_engine->new_well_switch("intro_sw_next"); + sw_next_piece->set_object_on_switch(ObjectCaller(this, + &WellObject::process_event)); + sw_mixed=default_well_engine->new_well_switch("intro_sw_mixed"); + sw_mixed->set_object_on_switch(ObjectCaller(this, + &WellObject::process_event)); + for(i=0;inew_well_switch(buf); + sw_squares[i]->set_object_on_switch(ObjectCaller(this, + &WellObject::process_event)); + sw_squares[i]->set_mode(OnlySet); + } + + inp_player=default_well_engine->new_well_input("intro_inp_player"); + inp_player->set_object_on_enter(ObjectCaller(this, + &WellObject::hide_by_call)); + inp_player->set_max_len(PLAYER_NAME_LEN-1); +} + + +//=========================================================================== +/// global process_event(wEvent) +/// stub that process events +/// tags WellIntro +bool WellIntro::process_event(wEvent ev) +{ + int i; + WellObject* wo=(WellObject*)ev.data; + + switch(ev.type) + { + case eExpose: + redraw(); + break; + case eKeyPress: + hide_by_call(wEvent(aKeyPressed,key_new_game)); + return false; + + case aKeyPressed: + if(wo==key_plus && start_level+10) + { + start_level--; + draw_start_level(); + return true; + } + break; + + case aSwitchChanged: + if(wo==sw_rotation) + { + well->set_rotation(sw_rotation->get_value()); + break; + } + if(wo==sw_next_piece) + { + well->set_next_piece(sw_next_piece->get_value()); + break; + } + if(wo==sw_mixed) + { + well->set_mixed(sw_mixed->get_value()); + break; + } + for(i=0;iset_squares(MIN_SQUARES+i); + } else + sw_squares[i]->set_value(false); + break; + } + return true; +} + +//=========================================================================== +/// global show() +/// show object +/// tags WellIntro +void WellIntro::show() +{ + + dbgprintf(("WellIntro::show() called\n")); + default_well_engine->set_main_background_image(imIntroBG); + default_well_engine->add_object(this); + key_exit->show(); + key_new_game->show(); + key_top_nine->show(); + key_plus->show(); + key_minus->show(); + sw_rotation->show(); + sw_next_piece->show(); + sw_mixed->show(); + for(int i=0;ishow(); + draw_start_level(); + shown=true; +} + +//=========================================================================== +/// global hide() +/// hide object (empty) +/// tags WellIntro +void WellIntro::hide() +{ + if(shown) + { + shown=false; + default_well_engine->del_object(this); + key_exit->hide(); + key_new_game->hide(); + key_top_nine->hide(); + key_plus->hide(); + key_minus->hide(); + sw_rotation->hide(); + sw_next_piece->hide(); + sw_mixed->hide(); + for(int i=0;ihide(); + } +} + + +//=========================================================================== +/// global hide_by_call() +/// hide object +/// tags WellIntro +bool WellIntro::hide_by_call(wEvent ev) +{ + WellObject* wo=(WellObject*)ev.data; + + hide(); + + put_all_to_game(); + save_options(); + + if(wo==inp_player) + { + inp_player->hide(); + return object_on_new_game.call(wEvent(aIntroExit,this)); + } + + if(wo==key_exit) + { + default_well_engine->done_loop(); + return true; + } + + if(wo==key_new_game) + { + inp_player->show(); + } + + if(wo==key_top_nine) + { + return object_on_top_nine.call(wEvent(aIntroExit,this)); + } + + return true; +} + + +//=========================================================================== +/// global draw_start_level() +/// draw start level on the screen +/// tags WellIntro +void WellIntro::draw_start_level() +{ + char buf[L_MAXPATH]; + sprintf(buf,"%02d",start_level); + txt_level->set_text(buf); + txt_level->draw_text(); + well->set_level(start_level); +} + + +//=========================================================================== +/// global redraw() +/// redraw all scene object +/// tags WellIntro +void WellIntro::redraw() +{ + draw_start_level(); + key_exit->redraw(); + key_new_game->redraw(); + key_top_nine->redraw(); + key_plus->redraw(); + key_minus->redraw(); + sw_rotation->redraw(); + sw_next_piece->redraw(); + sw_mixed->redraw(); + for(int i=0;iredraw(); +} + +//=========================================================================== +/// global put_all_to_game() +/// put all values to the game +/// tags WellIntro +void WellIntro::put_all_to_game() +{ + int i; + well->set_rotation(sw_rotation->get_value()); + well->set_mixed(sw_mixed->get_value()); + well->set_next_piece(sw_next_piece->get_value()); + well->set_level(start_level); + for(i=0;iget_value()) + { + well->set_squares(i+MIN_SQUARES); + default_top_nine->set_page(i+1); + dbgprintf(("Set top_nine page to %d\n",i+1)); + } + well->set_player_name(inp_player->get_text()); +} + + +//=========================================================================== +/// global load_defaults() +/// set default values and try to load it from file +/// tags WellIntro +void WellIntro::load_defaults() +{ + sw_rotation->set_value(true); + sw_mixed->set_value(true); + sw_next_piece->set_value(true); + start_level=0; + sw_squares[4-MIN_SQUARES]->set_value(true); + inp_player->set_text(getenv("USER")); + + load_options(); + + put_all_to_game(); +} + +//=========================================================================== +/// global set_well_base(WellBase*) +/// set pointer to the game object, loads and set default values +/// tags WellIntro +void WellIntro::set_well_base(WellBase* o) +{ + well=o; + load_defaults(); +} + +//=========================================================================== +/// global save_options() +/// save options to file +/// tags WellIntro +void WellIntro::save_options() +{ + int i; + char fname[L_MAXPATH]; + FILE *fp; +#ifndef WIN32 + sprintf(fname,"%s/%s",getenv("HOME"),XWELL_DIR); + mkdir(fname,0755); + sprintf(fname,"%s/%s/%s",getenv("HOME"),XWELL_DIR,RC_FILE); +#else + sprintf(fname,"data\\%s", RC_FILE); +#endif + fp=fopen(fname, "w"); + if(fp==0) + { + fprintf(stderr,"Error in opening resource file for writing:\n\t%s\n", + strerror(errno)); + return; + } + + fprintf(fp,"#--------------- Options file for xwelltris %s ----------------#\n",VERSION); + fprintf(fp,"#This file generated automatically, so don't edit it by hands\n\n"); + fprintf(fp, "last_player: %s\n",inp_player->get_text()); + if(sw_rotation->get_value()) + fprintf(fp,"use_rotation: yes\n"); + else + fprintf(fp,"use_rotation: no\n"); + + if(sw_mixed->get_value()) + fprintf(fp,"use_mixed: yes\n"); + else + fprintf(fp,"use_mixed: no\n"); + + if(sw_next_piece->get_value()) + fprintf(fp,"use_next_piece: yes\n"); + else + fprintf(fp,"use_next_piece: no\n"); + + fprintf(fp, "start_level: %d\n",start_level); + + for(i=0;iget_value()) + break; + fprintf(fp, "tris_squares: %d\n", i+MIN_SQUARES); + fprintf(fp,"#------------------ End of file ---------------------#\n"); + + fclose(fp); +} + +//=========================================================================== +/// global load_options() +/// load options from file +/// tags WellIntro +void WellIntro::load_options() +{ + int i,n; + char fname[L_MAXPATH]; + char buf[L_MAXPATH]; + char tok[L_MAXPATH], *pbuf; + FILE* fp; +#ifndef WIN32 + sprintf(fname,"%s/%s/%s",getenv("HOME"),XWELL_DIR,RC_FILE); +#else + sprintf(fname,"data\\%s",RC_FILE); +#endif + fp=fopen(fname, "r"); + if(fp==0) + return; + + while(fgets(buf,L_MAXPATH-1,fp)) + { + if(buf[0]=='#') + continue; + + pbuf=get_next_token(buf,tok); + if(!strcmp(tok,"use_rotation")) + { + get_next_token(pbuf,tok); + if(!strcmp(tok,"yes")) + sw_rotation->set_value(true); + else + sw_rotation->set_value(false); + continue; + } + + if(!strcmp(tok,"use_mixed")) + { + get_next_token(pbuf,tok); + if(!strcmp(tok,"yes")) + sw_mixed->set_value(true); + else + sw_mixed->set_value(false); + continue; + } + + if(!strcmp(tok,"use_next_piece")) + { + get_next_token(pbuf,tok); + if(!strcmp(tok,"yes")) + sw_next_piece->set_value(true); + else + sw_next_piece->set_value(false); + continue; + } + + if(!strcmp(tok,"last_player")) + { + get_next_token(pbuf,tok); + inp_player->set_text(tok); + continue; + } + + if(!strcmp(tok,"start_level")) + { + get_next_token(pbuf,tok); + start_level=atoi(tok); + if(start_level<0 || start_level>=NUM_LEVELS) + start_level=0; + continue; + } + + if(!strcmp(tok,"tris_squares")) + { + get_next_token(pbuf,tok); + n=atoi(tok); + n-=MIN_SQUARES; + if(n<0 || n>=TOTAL_SQUARES) + n=0; + for(i=0;iset_value(n==i ? true : false); + continue; + } + } + fclose(fp); +} + +//=========================================================================== +/// global get_next_token(char* from, char* to) +/// cut buffer by tokens +/// tags WellIntro +char* WellIntro::get_next_token(char* from, char* to) +{ + int delta=0; + char *orig_to=to; + *to=0; + if(*from==':') + from++; + while(*from==' ') + from++; + while(*from!=0 && *from!=':' && *from!='\n' && *from!='\r' && *from!=0) + *to++=*from++; + while(to!=orig_to && *to==' ') + { + to--; + delta=1; + } + to+=delta; + *to=0; + return from; +} + diff --git a/src/wellkey.cxx b/src/wellkey.cxx new file mode 100644 index 0000000..5e6074b --- /dev/null +++ b/src/wellkey.cxx @@ -0,0 +1,145 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: wellkey.cxx,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ + +/// module description +/// WellKey class implements key (or button) GUI element. It draw key with +/// given images (uses geometry module) then catches mouse events and calls +/// ObjectCaller on press. + +#include "globals.h" +#include "wellkey.h" +#include "wellengine.h" + +//////////////////////////////WellKey class/////////////////////////////// + +//=========================================================================== +/// global WellKey(char*) +/// constructor - fill name and get geometry +/// tags WellKey +WellKey::WellKey(char* iname) : WellObject() +{ + strncpy(object_name,iname,GEO_NAME); + object_name[GEO_NAME]=0; + geo=get_geo_by_name(object_name); +} + + +//=========================================================================== +/// global process_event(wEvent) +/// stub that process events +/// tags WellKey +bool WellKey::process_event(wEvent ev) +{ + MouseEvent *pmev; + switch(ev.type) + { + case eKeyPress: + dbgprintf(("WellKey - pressed\n")); + object_on_press.call(wEvent(aKeyPressed,this)); + return false; + + case eMousePress: + pmev=(MouseEvent*)ev.data; + return !press(pmev->mx,pmev->my); + + case eMouseMove: + pmev=(MouseEvent*)ev.data; + return !highlight(pmev->mx,pmev->my); + + } + return true; +} + +//=========================================================================== +/// global highlight(int mx, int my) +/// highlights key +/// tags WellKey +bool WellKey::highlight(int mx, int my) +{ + if(mx>=geo[1].tox && my>=geo[1].toy && + mxscreen_copy(&geo[1]); //highlighted state + return true; + } + } else + { + if(highlighted) + { + highlighted=false; + dbgprintf(("WellKey DEhighlighted via mouse\n")); + default_well_engine->screen_copy(&geo[0]); //normal state + return true; + } + } + return false; +} + +//=========================================================================== +/// global press(int mx, int my) +/// press key and call object +/// tags WellKey +bool WellKey::press(int mx, int my) +{ + if(mx>=geo[2].tox && my>=geo[2].toy && + mxscreen_copy(&geo[2]); //highlighted state + object_on_press.call(wEvent(aKeyPressed,this)); + return true; + } + return false; +} + +//=========================================================================== +/// global show() +/// show object +/// tags WellKey +void WellKey::show() +{ + shown=true; + redraw(); + default_well_engine->add_object(this); +} + +//=========================================================================== +/// global redraw() +/// redraw object +/// tags WellKey +void WellKey::redraw() +{ + if(shown) + default_well_engine->screen_copy(&geo[0]); +} + +//=========================================================================== +/// global hide() +/// hide object +/// tags WellKey +void WellKey::hide() +{ + shown=false; + default_well_engine->screen_clear(&geo[0]); + default_well_engine->del_object(this); +} + + diff --git a/src/wellsimpledraw.cxx b/src/wellsimpledraw.cxx new file mode 100644 index 0000000..8496ce5 --- /dev/null +++ b/src/wellsimpledraw.cxx @@ -0,0 +1,113 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: wellsimpledraw.cxx,v 1.2 2003/02/19 09:51:39 leo Exp $ + +/// module description +/// WellSimpleDrawing - class that implements simple drawing algorithm +/// with dirty rectangles + +#include "wellsimpledraw.h" + +//=========================================================================== +/// global WellSimpleDraw() +/// constructor of the class - init's variables. +/// tags WellSimpleDraw +WellSimpleDraw::WellSimpleDraw() +{ + max_dirties=0; +} + +//=========================================================================== +/// global ~WellSimpleDraw() +/// destructor of the class. +/// tags WellSimpleDraw +WellSimpleDraw::~WellSimpleDraw() +{ + clear_dirty_list(); +} + +//=========================================================================== +/// global new_dirty_rec(int dx, int dy) +/// create new dirty rec and remember delta position for main screen +/// tags WellSimpleDraw +void WellSimpleDraw::new_dirty_rec(int dx, int dy) +{ + current_dirty.delta_x=dx; + current_dirty.delta_y=dy; + max_x=max_y=-1; + min_x=min_y=99999; //Hope we will never have screen bigger :) +} + +//=========================================================================== +/// global dirty_add_xy(int x, int y) +/// we add dot to current dirty rec - need detect max and min corners +/// tags WellSimpleDraw +void WellSimpleDraw::dirty_add_xy(int x, int y) +{ + if(xmax_x) + max_x=x; + if(ymax_y) + max_y=y; +} + +//=========================================================================== +/// global finish_dirty_rec() +/// finish dots definition of current dirty rec - add it to the dirty queue +/// tags WellSimpleDraw +void WellSimpleDraw::finish_dirty_rec() +{ + current_dirty.x=min_x; + current_dirty.y=min_y; + current_dirty.l=max_x-min_x+1; + current_dirty.h=max_y-min_y+1; + DirtyList *plist=new DirtyList(current_dirty); + dirty_list.add(plist); + max_dirties++; +} + +//=========================================================================== +/// global clear_dirty_list() +/// clear all the list and free allocated memory +/// tags WellSimpleDraw +void WellSimpleDraw::clear_dirty_list() +{ + DirtyList *plist; + do + { + plist=dirty_list.get_next(); + if(plist) + { + plist->del_self(); + delete plist; + } + } while(plist); + max_dirties=0; +} + +//=========================================================================== +/// global dirty_add_rec(DirtyRect r) +/// directly add the whole rec to the dirty queue +/// tags WellSimpleDraw +void WellSimpleDraw::dirty_add_rec(DirtyRect r) +{ + DirtyList *plist=new DirtyList(r); + dirty_list.add(plist); + max_dirties++; +} diff --git a/src/wellswitch.cxx b/src/wellswitch.cxx new file mode 100644 index 0000000..b5b0d6d --- /dev/null +++ b/src/wellswitch.cxx @@ -0,0 +1,157 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: wellswitch.cxx,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ + +/// module description +/// WellSwitch class implements Switch GUI element, it can be set or reset, +/// uses for switching options + +#include "globals.h" +#include "wellswitch.h" +#include "wellengine.h" + +//////////////////////////////WellSwitch class/////////////////////////////// + +//=========================================================================== +/// global WellSwitch(char*) +/// constructor - fill name and get geometry +/// tags WellSwitch +WellSwitch::WellSwitch(char* iname) : WellObject() +{ + strncpy(object_name,iname,GEO_NAME); + object_name[GEO_NAME]=0; + geo=get_geo_by_name(object_name); + value=false; + mode=SetReset; +} + + +//=========================================================================== +/// global process_event(wEvent) +/// stub that process events +/// tags WellSwitch +bool WellSwitch::process_event(wEvent ev) +{ + MouseEvent *pmev; + switch(ev.type) + { + case eMousePress: + pmev=(MouseEvent*)ev.data; + return !press(pmev->mx,pmev->my); + + case eMouseMove: + pmev=(MouseEvent*)ev.data; + return !highlight(pmev->mx,pmev->my); + + } + return true; +} + +//=========================================================================== +/// global highlight(int mx, int my) +/// highlights key +/// tags WellSwitch +bool WellSwitch::highlight(int mx, int my) +{ + if(mx>=geo[1].tox && my>=geo[1].toy && + mxscreen_copy(&geo[1]); //highlighted state + return true; + } + } else + { + if(highlighted) + { + highlighted=false; + dbgprintf(("WellSwitch DEhighlighted via mouse\n")); + redraw(); + return true; + } + } + return false; +} + +//=========================================================================== +/// global press(int mx, int my) +/// press key and call object +/// tags WellSwitch +bool WellSwitch::press(int mx, int my) +{ + if(mx>=geo[1].tox && my>=geo[1].toy && + mxadd_object(this); +} + +//=========================================================================== +/// global redraw() +/// redraw object +/// tags WellSwitch +void WellSwitch::redraw() +{ + if(shown) + { + default_well_engine->screen_copy(&geo[0]); //normal state + if(value) + default_well_engine->screen_copy(&geo[2]); //value state + else + default_well_engine->screen_clear(&geo[2]); //value state + } +} + +//=========================================================================== +/// global hide() +/// hide object +/// tags WellSwitch +void WellSwitch::hide() +{ + shown=false; + default_well_engine->screen_clear(&geo[0]); + default_well_engine->del_object(this); +} + + diff --git a/src/welltopnine.cxx b/src/welltopnine.cxx new file mode 100644 index 0000000..218f038 --- /dev/null +++ b/src/welltopnine.cxx @@ -0,0 +1,487 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: welltopnine.cxx,v 1.3 2003/02/23 06:33:40 leo Exp $ +#include "welltopnine.h" +#include "wellengine.h" +#include "commonfuncs.h" + +WellTopNine *default_top_nine; + +//=========================================================================== +/// global Score() +/// constructor, set all to zeros and current date +/// tags Score +Score::Score() +{ + player[0]=date_time[0]=0; + level=score=lines=squares=play_time=0; + mixed=rotation=next_piece=false; + set_current_time(); +} + +//=========================================================================== +/// global get_next_token(char* from, char* to) +/// cut buffer by tokens +/// tags Score +char* Score::get_next_token(char* from, char* to) +{ + int delta=0; + char *orig_to=to; + *to=0; + if(*from==';') + from++; + while(*from==' ') + from++; + while(*from!=0 && *from!=';' && *from!='\n' && *from!='\r' && *from!=0) + *to++=*from++; + while(to!=orig_to && *to==' ') + { + to--; + delta=1; + } + to+=delta; + *to=0; + return from; +} + +//=========================================================================== +/// global save(FILE*) +/// save score_line to file +/// tags Score +void Score::save(FILE* fp) +{ + fprintf(fp,"%d;%-12s;%s;%8d;%5d;%2d;%d;%d;%d;%d\n", + squares,player,date_time,score,lines,level, + mixed ? 1 : 0, rotation ? 1 : 0,play_time, + next_piece ? 1 : 0); +} + +//=========================================================================== +/// global load(FILE*) +/// load score_line from file +/// tags Score +bool Score::load(FILE* fp) +{ + char buf[L_MAXPATH]; + char *ptr=buf; + char token[L_MAXPATH]; + while(1) + { + if(fgets(buf,L_MAXPATH-1,fp)==0) + return false; + if(buf[0]=='#') //Skipping comments + continue; + + //squares + ptr=get_next_token(ptr,token); + squares=atoi(token); + //player + ptr=get_next_token(ptr,token); + strncpy(player,token,PLAYER_NAME_LEN-1); + player[PLAYER_NAME_LEN-1]=0; + //date_time + ptr=get_next_token(ptr,token); + strncpy(date_time,token,L_DATE-1); + date_time[L_DATE-1]=0; + //score + ptr=get_next_token(ptr,token); + score=atoi(token); + //lines + ptr=get_next_token(ptr,token); + lines=atoi(token); + //level + ptr=get_next_token(ptr,token); + level=atoi(token); + //mixed + ptr=get_next_token(ptr,token); + mixed= atoi(token) ? true : false; + //rotation + ptr=get_next_token(ptr,token); + rotation= atoi(token) ? true : false; + //play_time + ptr=get_next_token(ptr,token); + play_time=atoi(token); + //rotation + ptr=get_next_token(ptr,token); + next_piece= atoi(token) ? true : false; + break; + } + dbgprintf(("scores: %d;%s;%s;%8d;%5d;%2d;%d;%d\n", + squares,player,date_time,score,lines,level, + mixed ? 1 : 0, rotation ? 1 : 0)); + return true; +} + +//=========================================================================== +/// global set_current_time() +/// set current date and time to date (format YYYY-MM-DD HH:MI) +/// tags Score +void Score::set_current_time() +{ + struct tm *time_str; + time(&start_t); + time_str=localtime(&start_t); + strftime(date_time,L_DATE,"%Y-%m-%d",time_str); +} + +//=========================================================================== +/// global calc_play_time() +/// calculate playing time from start_t till now +/// tags Score +void Score::calc_play_time() +{ + time_t now_t; + time(&now_t); + play_time=now_t - start_t; +} + +//=========================================================================== +/// global set_player(char* pl) +/// set player name +/// tags Score +void Score::set_player(char* name) +{ + if(name) + strncpy(player,name,PLAYER_NAME_LEN); + else + strcpy(player,"unknown"); + player[PLAYER_NAME_LEN-1]=0; +} + +//////////////////////////ScoreTable struct methods///////////////////////// + + + +//=========================================================================== +/// global ScoreTable() +/// constructor of scoretable +/// tags ScoreTable +ScoreTable::ScoreTable() +{ + int i; + for(i=0;iplace=i+1; + } +} + +//=========================================================================== +/// global ~ScoreTable() +/// destructor of scoretable +/// tags ScoreTable +ScoreTable::~ScoreTable() +{ + int i; + for(i=0;iplace=i+1; + + for(j=0;jscorescore) + { + ptr=table[i]; + table[i]=table[j]; + table[j]=ptr; + + table[j]->place=j+1; + table[i]->place=i+1; + } +} + +//=========================================================================== +/// global save(FILE* fp) +/// save table to give file descr +/// tags ScoreTable +void ScoreTable::save(FILE* fp) +{ + int i; + for(i=0;isave(fp); +} + +//=========================================================================== +/// global set_squares(int isquare) +/// set squares to given number +/// tags ScoreTable +void ScoreTable::set_squares(int isquares) +{ + int i; + for(i=0;isquares=isquares; +} + +//=========================================================================== +/// global set_and_get(int idx,Score*) +/// set new Score and get old one. If new == 0 just return old +/// tags ScoreTable +Score* ScoreTable::set_and_get(int idx, Score* new_one) +{ + Score *old_one; + if(idx<0 || idx>=TOP_NINE) + return new_one; + + old_one=table[idx]; + if(new_one) + { + table[idx]=new_one; + table[idx]->place=idx+1; + } + return old_one; +} + + + + +//////////////////////////////WellTopNine class/////////////////////////////// + + + +//=========================================================================== +/// global WellTopNine() +/// constructor - fill table +/// tags WellTopNine +WellTopNine::WellTopNine() : WellObject() +{ + int i; + current_score=0; + page=3; + + geo=get_geo_by_name("top_nine_elements"); + + for(i=0;inew_well_image_font(imFont1, + FONT3_L,FONT3_H, + FONT3_DX,FONT3_DY); + text_lines[i]->set_screen_region(TOPNINE_TXT_X, + TOPNINE_TXT_Y + i*TOPNINE_TXT_STEPY, + TOPNINE_TXT_L,TOPNINE_TXT_H); + } + key_exit=default_well_engine->new_well_key("top_key_exit"); + key_exit->set_object_on_press(ObjectCaller(this,&WellObject::hide_by_call)); +} + +//=========================================================================== +/// global save_scores() +/// save score table to file +/// tags WellTopNine +bool WellTopNine::save_scores() +{ + int i; + char fname[L_MAXPATH]; + + if(!find_full_path_for_file(SCOREFILE,fname,ReadWrite)) + { +#ifndef WIN32 + sprintf(fname, "%s/.xwelltris",getenv("HOME")); + mkdir(fname,0755); + strcat(fname,"/"); + strcat(fname,SCOREFILE); +#endif + } + + FILE* fp=fopen(fname,"w"); + if(!fp) + { + fprintf(stderr,"PANIC: can't save scores file: %s - %s\n", + fname,strerror(errno)); + return false; + } + for(i=0;iload(fp)) + { + i=pscore->squares-1; + pscore=tables[i].set_and_get(idx[i],pscore); + idx[i]++; + } + fclose(fp); + + for(i=0;isquares-1; + current_score=new_one; + if(tables[page].table[TOP_NINE-1]->score < new_one->score) + { + pscore=tables[page].table[TOP_NINE-1]; + tables[page].table[TOP_NINE-1]=new_one; + tables[page].sort_by_score(); + return pscore; + } + return new_one; +} + +//=========================================================================== +/// global find_challenger(Score* me) +/// Find challenger, whose score > than mine +// return 0 if you are the first +/// tags WellTopNine +Score* WellTopNine::find_challenger(Score* me) +{ + int i; + ScoreTable *pcur; + + if(me==0) + return 0; + pcur= &tables[me->squares-1]; + for(i=TOP_NINE-1;i>=0;i--) + if(pcur->table[i]->score > me->score) + return pcur->table[i]; + return 0; +} + + +//=========================================================================== +/// global process_event(wEvent) +/// stub that process events (empty here) +/// tags WellTopNine +bool WellTopNine::process_event(wEvent) +{ + return true; +} + +//=========================================================================== +/// global show() +/// stub that show object (empty) +/// tags WellTopNine +void WellTopNine::show() +{ + key_exit->show(); + default_well_engine->set_main_background_image(imScoreBG); + default_well_engine->add_object(this); + redraw_table(); + shown=true; + save_scores(); +} + +//=========================================================================== +/// global hide() +/// stub that hide object (empty) +/// tags WellTopNine +void WellTopNine::hide() +{ + shown=false; + default_well_engine->del_object(this); + key_exit->hide(); + object_on_exit.call(wEvent(aEmpty,this)); +} + +//=========================================================================== +/// global redraw_table() +/// redraw all data for score table according to current_score and page +/// tags WellTopNine +void WellTopNine::redraw_table() +{ + int i,j; + char buf[L_MAXPATH]; + Score *pscore; + + for(i=0;iplace,pscore->player,pscore->date_time, + pscore->score,pscore->lines,pscore->level); + if(pscore!=current_score) + { + text_lines[i]->set_font(FONT3_L,FONT3_H, + FONT3_DX,FONT3_DY); + text_lines[i]->set_screen_region(TOPNINE_TXT_X, + TOPNINE_TXT_Y + i*TOPNINE_TXT_STEPY, + TOPNINE_TXT_L,TOPNINE_TXT_H); + } else + { + dbgprintf(("Highlighting item %d\n",i)); + text_lines[i]->set_font(FONT5_L,FONT5_H, + FONT5_DX,FONT5_DY); + text_lines[i]->set_screen_region(TOPNINE_TXT_X, + TOPNINE_TXT_Y + i*TOPNINE_TXT_STEPY, + TOPNINE_TXT_L,TOPNINE_TXT_H); + } + text_lines[i]->set_text(buf); + text_lines[i]->draw_text(); + for(j=0;j<3;j++) + { + geo[j].toy=TOPNINE_TXT_Y + i*TOPNINE_TXT_STEPY - 2; + } + if(pscore->rotation) + default_well_engine->screen_copy(&geo[0]); + if(pscore->next_piece) + default_well_engine->screen_copy(&geo[1]); + if(pscore->mixed) + default_well_engine->screen_copy(&geo[2]); + } +} diff --git a/src/x11/xheaders.h b/src/x11/xheaders.h new file mode 100644 index 0000000..37883b2 --- /dev/null +++ b/src/x11/xheaders.h @@ -0,0 +1,9 @@ + +#include +#include +#include +#include +#include + + + diff --git a/src/x11/xwelldrawing.cxx b/src/x11/xwelldrawing.cxx new file mode 100644 index 0000000..30ecae4 --- /dev/null +++ b/src/x11/xwelldrawing.cxx @@ -0,0 +1,457 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: xwelldrawing.cxx,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ + +/// module description +/// X11 implementation of WellDrawing class - drawing routines for the game. +/// Draw field on pixmap, then maps it to the screen. Uses dirty rectangles +/// algorithm for mapping areas to screen from pixmap + +#include "xwelldrawing.h" +#include "xwellengine.h" + +//=========================================================================== +/// global XWellDrawingEngine() +/// constructor of the class - init's variables. +/// tags XWellDrawingEngine +XWellDrawingEngine::XWellDrawingEngine(XWellEngine* myengine) +{ + xengine=myengine; + if(xengine==0) + xengine=static_cast(default_well_engine); + mainw=xengine->get_main_window(); + colors=xengine->get_colors(); + scr=DefaultScreen(disp); +} + +//=========================================================================== +/// global init(int n_fields, int idx, int idy, unsigned il, unsigned ih) +/// init fields - creates x pixmaps and gcs +/// tags XWellDrawingEngine +void XWellDrawingEngine::init(int inum_fields, int idx, int idy, + unsigned int il, unsigned int ih) +{ + int i; + WellDrawingEngine::init(inum_fields,idx,idy,il,ih); + fields=new Pixmap; + gcs=new GC; + maingc=XCreateGC(disp,mainw,0,0); + XSetBackground(disp,maingc,colors[BackColor]); + XSetForeground(disp,maingc,colors[GridColor]); + XSetGraphicsExposures(disp,maingc,False); + + for(i=0;i<1;i++) + { + fields[i]=XCreatePixmap(disp,mainw,l,h,DefaultDepth(disp,scr)); + if(fields[i]>0) + { + gcs[i]=XCreateGC(disp,fields[i],0,0); + XSetBackground(disp,gcs[i],colors[FreezeColor]); + clear_field(i); + } + } +} + +//=========================================================================== +/// global draw_square(int color_idx, int i, int j) +/// Draw square (floor polygon) on all fields with given color +/// tags XWellDrawingEngine +void XWellDrawingEngine::draw_square(int color, int i, int j) +{ + int idx=current_id,sign_x13,sign_y13,sign_x24,sign_y24; + + XSetForeground(disp,*gcs,colors[color]); + + sign_x13= points[idx].base_points[i+1][j+1].x - + points[idx].base_points[i][j].x; + sign_x13= sign_x13 ? (sign_x13>0 ? 1 : -1) : 0; + + sign_y13= points[idx].base_points[i+1][j+1].y - + points[idx].base_points[i][j].y; + sign_y13= sign_y13 ? (sign_y13>0 ? 1 : -1) : 0; + + sign_x24= points[idx].base_points[i][j+1].x - + points[idx].base_points[i+1][j].x; + sign_x24= sign_x24 ? (sign_x24>0 ? 1 : -1) : 0; + + sign_y24= points[idx].base_points[i][j+1].y - + points[idx].base_points[i+1][j].y; + sign_y24= sign_y24 ? (sign_y24>0 ? 1 : -1) : 0; + + trapazoid_list[0].x = points[idx].base_points[i][j].x+sign_x13; + trapazoid_list[0].y = points[idx].base_points[i][j].y+sign_y13; + trapazoid_list[1].x = points[idx].base_points[i+1][j].x+sign_x24; + trapazoid_list[1].y = points[idx].base_points[i+1][j].y+sign_y24; + trapazoid_list[2].x = points[idx].base_points[i+1][j+1].x-sign_x13; + trapazoid_list[2].y = points[idx].base_points[i+1][j+1].y-sign_y13; + trapazoid_list[3].x = points[idx].base_points[i][j+1].x-sign_x24; + trapazoid_list[3].y = points[idx].base_points[i][j+1].y-sign_y24; + XFillPolygon (disp, *fields, *gcs, trapazoid_list, MAX_SIDES, + Convex, CoordModeOrigin); + //Now draw the grid + trapazoid_list[0].x = points[idx].base_points[i][j].x; + trapazoid_list[0].y = points[idx].base_points[i][j].y; + trapazoid_list[1].x = points[idx].base_points[i+1][j].x; + trapazoid_list[1].y = points[idx].base_points[i+1][j].y; + trapazoid_list[2].x = points[idx].base_points[i+1][j+1].x; + trapazoid_list[2].y = points[idx].base_points[i+1][j+1].y; + trapazoid_list[3].x = points[idx].base_points[i][j+1].x; + trapazoid_list[3].y = points[idx].base_points[i][j+1].y; + XSetForeground(disp,*gcs,colors[GridColor2]); + XDrawLines(disp, *fields, *gcs, trapazoid_list, MAX_SIDES, CoordModeOrigin); + + new_dirty_rec(delta_x,delta_y); + dirty_add_xy(trapazoid_list[0].x,trapazoid_list[0].y); + dirty_add_xy(trapazoid_list[1].x,trapazoid_list[1].y); + dirty_add_xy(trapazoid_list[2].x,trapazoid_list[2].y); + dirty_add_xy(trapazoid_list[3].x,trapazoid_list[3].y); + finish_dirty_rec(); +} + +//=========================================================================== +/// global draw_trapazoid(int color_idx, int i,int j) +/// draw trapazoid - wall polygon with given color +/// tags XWellDrawingEngine +void XWellDrawingEngine::draw_trapazoid(int color, int i, int j) +{ + Window win; + GC gc; + int idx=current_id,w,sign_x13,sign_y13,sign_x24,sign_y24; + + unsigned long rcolor=colors[color]; + + win=*fields; + gc=*gcs; + XSetForeground(disp,gc,rcolor); + + sign_x13= points[idx].wall_points[i+1][j+1].x - + points[idx].wall_points[i][j].x; + sign_x13= sign_x13 ? (sign_x13>0 ? 1 : -1) : 0; + + sign_y13= points[idx].wall_points[i+1][j+1].y - + points[idx].wall_points[i][j].y; + sign_y13= sign_y13 ? (sign_y13>0 ? 1 : -1) : 0; + + sign_x24= points[idx].wall_points[i][j+1].x - + points[idx].wall_points[i+1][j].x; + sign_x24= sign_x24 ? (sign_x24>0 ? 1 : -1) : 0; + + sign_y24= points[idx].wall_points[i][j+1].y - + points[idx].wall_points[i+1][j].y; + sign_y24= sign_y24 ? (sign_y24>0 ? 1 : -1) : 0; + + /* + w=i/MAX_WIDTH; + dbgprintf(("trapazoid [%2d][%2d] = [%d - %d],[%d - %d]\n",i,j, + points[idx].wall_points[i+1][j+1].x, + points[idx].wall_points[i][j].x, + points[idx].wall_points[i+1][j+1].y, + points[idx].wall_points[i][j].y)); + + dbgprintf(("trapazoid2[%2d][%2d] = [%d - %d],[%d - %d]\n",i,j, + points[idx].wall_points[i][j+1].x, + points[idx].wall_points[i+1][j].x, + points[idx].wall_points[i][j+1].y, + points[idx].wall_points[i+1][j].y)); + dbgprintf(("trapazoid [%2d][%2d] = [%d][%d],[%d][%d]\n",i,j, + sign_x13,sign_y13,sign_x24,sign_y24)); + */ + + + trapazoid_list[0].x = points[idx].wall_points[i][j].x+sign_x13; + trapazoid_list[0].y = points[idx].wall_points[i][j].y+sign_y13; + trapazoid_list[1].x = points[idx].wall_points[i+1][j].x+sign_x24; + trapazoid_list[1].y = points[idx].wall_points[i+1][j].y+sign_y24; + trapazoid_list[2].x = points[idx].wall_points[i+1][j+1].x-sign_x13; + trapazoid_list[2].y = points[idx].wall_points[i+1][j+1].y-sign_y13; + trapazoid_list[3].x = points[idx].wall_points[i][j+1].x-sign_x24; + trapazoid_list[3].y = points[idx].wall_points[i][j+1].y-sign_y24; + XFillPolygon (disp, win, gc, trapazoid_list, MAX_SIDES, + Convex, CoordModeOrigin); + //Now draw the grid + trapazoid_list[0].x = points[idx].wall_points[i][j].x; + trapazoid_list[0].y = points[idx].wall_points[i][j].y; + trapazoid_list[1].x = points[idx].wall_points[i+1][j].x; + trapazoid_list[1].y = points[idx].wall_points[i+1][j].y; + trapazoid_list[2].x = points[idx].wall_points[i+1][j+1].x; + trapazoid_list[2].y = points[idx].wall_points[i+1][j+1].y; + trapazoid_list[3].x = points[idx].wall_points[i][j+1].x; + trapazoid_list[3].y = points[idx].wall_points[i][j+1].y; + XSetForeground(disp,gc,colors[GridColor]); + XDrawLines(disp, win, gc, trapazoid_list, MAX_SIDES, CoordModeOrigin); + if(idx==current_id) + { + new_dirty_rec(delta_x,delta_y); + dirty_add_xy(trapazoid_list[0].x,trapazoid_list[0].y); + dirty_add_xy(trapazoid_list[1].x,trapazoid_list[1].y); + dirty_add_xy(trapazoid_list[2].x,trapazoid_list[2].y); + dirty_add_xy(trapazoid_list[3].x,trapazoid_list[3].y); + finish_dirty_rec(); + } +} + +//=========================================================================== +/// global draw_grid() +/// draw grid - all wall and floor polygons +/// tags XWellDrawingEngine +void XWellDrawingEngine::draw_grid() +{ + int idx,i,j,k; + Window win; + GC gc; + idx=current_id; + + gc=*gcs; + win=*fields; + XSetForeground(disp,gc,colors[GridColor]); + for(i=0;iget_object(); + //Here we need to draw dirty rec on the screen -> will be in overloaded childs + XCopyArea(disp,win,mainw,maingc,drec.get_src_x(),drec.get_src_y(), + drec.l,drec.h, + drec.get_dest_x(),drec.get_dest_y()); + + plist->del_self(); + delete plist; + } + } while(plist); + XFlush(disp); +} + +//=========================================================================== +/// global key_to_action(void* event) +/// convert keys to actions in the game +/// tags XWellDrawingEngine +Actions XWellDrawingEngine::key_to_action(void* event) +{ + XEvent *ev=(XEvent*)event; + KeySym ks; + + ks=XLookupKeysym(&ev->xkey, 0); + switch(ks) + { + case XK_KP_Left: + case XK_KP_4: + case XK_Left: + case XK_j: + case XK_J: + return RIGHT; + + case XK_KP_Right: + case XK_KP_6: + case XK_Right: + case XK_l: + case XK_L: + return LEFT; + + case XK_Up: + case XK_Down: + case XK_KP_Begin: + case XK_KP_5: + case XK_k: + case XK_K: + return ROTATE; + + case XK_space: + case XK_KP_0: + case XK_KP_Insert: + return DROP; + + case XK_Pause: + case XK_p: + case XK_P: + return PAUSE_GAME; + + case XK_F10: + case XK_q: + case XK_Q: + case XK_Escape: + return END_GAME; + + case XK_KP_Multiply: + return OUTER_ROTATION; + + case XK_KP_Add: + return LEVEL_UP; + + case XK_KP_Subtract: + return LEVEL_DOWN; + + } + + return NOTHING; +} + + +//=========================================================================== +/// global draw_line(...) +/// draw line with given coords and color +/// tags XWellDrawingEngine +void XWellDrawingEngine::draw_line(int x1, int y1, int x2, int y2, int color_idx, + Canvas where) +{ + switch(where) + { + case screen: + XSetForeground(disp,maingc,colors[color_idx]); + XDrawLine(disp,mainw,maingc,x1,y1,x2,y2); + break; + case pixmap: + XSetForeground(disp,*gcs,colors[color_idx]); + XDrawLine(disp,*fields,*gcs,x1,y1,x2,y2); + break; + } +} + +//=========================================================================== +/// global draw_rect(...) +/// draw rectangle with given coords and color +/// tags XWellDrawingEngine +void XWellDrawingEngine::draw_rect(int x1, int y1, + unsigned int il, + unsigned int ih, int color_idx, + Canvas where) +{ + switch(where) + { + case screen: + XSetForeground(disp,maingc,colors[color_idx]); + XDrawRectangle(disp,mainw,maingc,x1,y1,il,ih); + break; + case pixmap: + XSetForeground(disp,*gcs,colors[color_idx]); + XDrawRectangle(disp,*fields,*gcs,x1,y1,il,ih); + break; + } +} + +//=========================================================================== +/// global fill_rect(...) +/// fill rectangle with given coords and color +/// tags XWellDrawingEngine +void XWellDrawingEngine::fill_rect(int x1, int y1, + unsigned int il, + unsigned int ih, int color_idx, + Canvas where) +{ + switch(where) + { + case screen: + XSetForeground(disp,maingc,colors[color_idx]); + XFillRectangle(disp,mainw,maingc,x1,y1,il,ih); + break; + case pixmap: + XSetForeground(disp,*gcs,colors[color_idx]); + XFillRectangle(disp,*fields,*gcs,x1,y1,il,ih); + break; + } +} + +//=========================================================================== +/// global pixmap_copy(Geo*) +/// copy part of image to the screen +/// tags XWellDrawingEngine +void XWellDrawingEngine::pixmap_copy(Geo *pgeo) +{ + if(pgeo->im==imNone) + return; + XCopyArea(disp,xengine->get_pixmap_of_image(pgeo->im),*fields,*gcs, + pgeo->fromx,pgeo->fromy,pgeo->l,pgeo->h, + pgeo->tox,pgeo->toy); +} + diff --git a/src/x11/xwelldrawing.h b/src/x11/xwelldrawing.h new file mode 100644 index 0000000..370ec57 --- /dev/null +++ b/src/x11/xwelldrawing.h @@ -0,0 +1,50 @@ +// docm_prefix(///) +#ifndef XWELLDRAWING_H +#define XWELLDRAWING_H + +#include "globals.h" + +#include "xheaders.h" + +#include "welldrawing.h" + +class XWellEngine; + +/// module description +/// Definition of the XWellDrawingEngine class, +/// public child from WellDrawingEngine -> engine for drawing game field +class XWellDrawingEngine:public WellDrawingEngine +{ + protected: + XWellEngine *xengine; + Pixmap *fields; + GC *gcs,maingc; + Window mainw; + unsigned long *colors; + int scr; + XPoint trapazoid_list[MAX_SIDES]; + + + public: + XWellDrawingEngine(XWellEngine* myengine); + virtual void init(int,int,int,unsigned int,unsigned int); + virtual void flush_all(); + virtual void flush_dirty(); + virtual void draw_grid(); + virtual void draw_square(int color, int i, int j); + virtual void draw_trapazoid(int color, int i, int j); + virtual void sync(); + virtual void clear_field(int i); + virtual Actions key_to_action(void* event); + virtual void draw_line(int x1, int y1, int x2, int y2, int color_idx, + Canvas where=screen); + virtual void draw_rect(int x1, int y1, unsigned int il, + unsigned int ih, int color_idx, + Canvas where=screen); + virtual void fill_rect(int x1, int y1, unsigned int il, + unsigned int ih, int color_idx, + Canvas where=screen); + virtual void pixmap_copy(Geo *pgeo); +}; + +#endif diff --git a/src/x11/xwellengine.cxx b/src/x11/xwellengine.cxx new file mode 100644 index 0000000..9e2c987 --- /dev/null +++ b/src/x11/xwellengine.cxx @@ -0,0 +1,598 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: xwellengine.cxx,v 1.3 2003/02/20 15:09:41 leo Exp $ + +/// module description +/// This module contains methods of class XWellEngine which implements X11 calls +/// for the game. So this is X11 dependent part. It receives XEvents, +/// make convertions, many initions and calls. + + +#include "version.h" +#include "globals.h" +#include "xwellengine.h" +#include "xwellinput.h" +#include "image/image.h" +#include "bilist.h" +#include "commonfuncs.h" +#include "wellclass.h" + +Display *disp; +Colormap defcmp; + +const unsigned long TIMESTEP=10000l; + +//Colors for welltris pieces and grid (x color names) +static char *game_color_names[MAX_GAME_COLORS] = +{ + /* 0*/ "Red", + /* 1*/ "Green", + /* 2*/ "Blue", + /* 3*/ "Yellow", + /* 4*/ "Magenta", + /* 5*/ "Cyan", + /* 6*/ "FireBrick", + /* 7*/ "SpringGreen", + /* 8*/ "CornflowerBlue", + /* 9*/ "Khaki", + /*10*/ "Plum", + /*11*/ "Violet", + /*12*/ "DarkTurquoise", + /*13*/ "Gold", + /*14*/ "Orchid", + /*15*/ "Turquoise", + /*16*/ "Orange", + /*17*/ "OrangeRed", + /*18*/ "VioletRed", + /*19*/ "BlueViolet", + /*20*/ "SeaGreen", + /*21*/ "Pink", + /*22*/ "ForestGreen", + /*23*/ "SkyBlue", + /*24*/ "Coral", + /*25*/ "Wheat", + /*26*/ "GoldenRod", + /*27*/ "IndianRed", + /*28*/ "SpringGreen", + /*29*/ "CornflowerBlue", + /*30*/ "Thistle", + /*31*/ "Aquamarine", + /*32*/ "CadetBlue", + /*33*/ "LightSteelBlue", + /*34*/ "NavyBlue", + /*35*/ "SteelBlue", + /*36*/ "YellowGreen", + /*37*/ "DarkViolet", + /*38*/ "MediumSeaGreen", + /*39*/ "DarkSlateGray", + /*40*/ "LightGray", + /*41*/ "MediumVioletRed", + /*42*/ "Sienna", + /*43*/ "MediumAquamarine", + /*44*/ "MediumBlue", + /*45*/ "Navy", + /*46*/ "DarkOliveGreen", + /*47*/ "DarkGreen", + /*48*/ "DimGray", + /*49*/ "Tan", + /*50*/ "MediumTurquoise", + /*51*/ "DarkSlateBlue", + /*52*/ "Maroon", + /*53*/ "Gray", + /*54*/ "#303030", + + /*55*/ "Black", + /*56*/ "#00aa00", + /*56*/ "#00ee00", + /*57*/ "#aa0000", + /*58*/ "#aaaaaa", + /*59*/ "#cccc00", + /*60*/ "#eeee00" +}; + + +//=========================================================================== +/// global new_well_engine(argc,argv) +/// Creates new WellEngine object, X11 realization (create XWellEngine) +/// tags new_well_engine +WellEngine* new_well_engine(int argc, char** argv) +{ + return new XWellEngine(argc,argv); +} + +//=========================================================================== +/// global XWellEngine(argc,argv) +/// Constructor of class that incupsulates work with X window +/// This class must always be allocated through 'new' +/// args +/// +argc: number of commanline args +/// +argv: command line args +/// tags XWellEngine +XWellEngine::XWellEngine(int argc, char** argv):WellEngine(argc,argv) +{ + int i; + char *dispchr=0; + for(i=1;iflags=(USSize | PSize | PMinSize | PMaxSize); + pxsh->height=mainh; + pxsh->width=mainl; + pxsh->min_width=pxsh->width; + pxsh->min_height=pxsh->height; + pxsh->max_width=pxsh->width; + pxsh->max_height=pxsh->height; + + mainw=XCreateSimpleWindow(disp,DefaultRootWindow(disp), + 0,0,pxsh->width,pxsh->height, + 0,whitepixel,blackpixel); + if((pch=XAllocClassHint())==NULL) + { + fprintf(stderr,"xwelltris: Error allocating ClassHint\n"); + exit(1); + } + pch->res_name="xwelltris"; + pch->res_class="XWELLTRIS"; + if(XStringListToTextProperty(&winname,1,&wname)==0) + { + fprintf(stderr,"xwelltris: Error creating TextProperty\n"); + exit(1); + } + if(XStringListToTextProperty(&pch->res_name,1,&iname)==0) + { + fprintf(stderr,"xwelltris: Error creating TextProperty\n"); + exit(1); + } + if((pxwmh=XAllocWMHints())==NULL) + { + fprintf(stderr,"welltris: Error allocating WMHints\n"); + exit(0); + } + pxwmh->flags=(InputHint|StateHint); + pxwmh->input=True; + pxwmh->initial_state=NormalState; + XSetWMProperties(disp,mainw,&wname,&iname,argv,argc,pxsh,pxwmh,pch); + + gcv.foreground=whitepixel; + gcv.background=blackpixel; + maingc=XCreateGC(disp,mainw,(GCForeground | GCBackground),&gcv); + xswa.colormap=defcmp; + xswa.bit_gravity=CenterGravity; + XChangeWindowAttributes(disp,mainw,(CWColormap | CWBitGravity),&xswa); + XSelectInput(disp,mainw, + ExposureMask | + FocusChangeMask | + StructureNotifyMask | + KeyPressMask | + ButtonPressMask | + PointerMotionMask | + ButtonReleaseMask | + FocusChangeMask); + wmDeleteWindow = XInternAtom(disp, "WM_DELETE_WINDOW", False); + XSetWMProtocols(disp, mainw, &wmDeleteWindow, 1); + XSetGraphicsExposures(disp,maingc,False); +} + +//=========================================================================== +/// global show_main() +/// show main window +/// tags XWellEngine +void XWellEngine::show_main() +{ + XMapRaised(disp,mainw); + XFlush(disp); +} + +//=========================================================================== +/// global load_image(Images id, char* name) +/// Load image into memory and register it with given id for use +/// tags XWellEngine +bool XWellEngine::load_image(Images id, char* name) +{ + char buf[L_MAXPATH]; + + if(id>=MAX_IMAGES) + return false; + + find_full_path_for_file(name,buf); + image_pixmaps[id]=LoadPixmap(buf,F_AUTO,images[id].l,images[id].h,CMP_OWN); + images[id].id=id; + return true; +} + + +//=========================================================================== +/// global screen_copy(Geo*) +/// copy part of image to the screen +/// tags XWellEngine +void XWellEngine::screen_copy(Geo *pgeo) +{ + if(pgeo->im==imNone) + { + screen_clear(pgeo); + return; + } + XCopyArea(disp,image_pixmaps[pgeo->im],mainw,maingc, + pgeo->fromx,pgeo->fromy,pgeo->l,pgeo->h, + pgeo->tox,pgeo->toy); +} + +//=========================================================================== +/// global screen_clear(Geo*) +/// clear part of screen +/// tags XWellEngine +void XWellEngine::screen_clear(Geo *pgeo) +{ + + XClearArea(disp,mainw,pgeo->tox,pgeo->toy,pgeo->l,pgeo->h,False); +} + +//=========================================================================== +/// global set_main_background_image(Images id) +/// set image with given id to background of main window +/// tags XWellEngine +void XWellEngine::set_main_background_image(Images id) +{ + if(images[id].id!=imNone) + { + XSetWindowBackgroundPixmap(disp,mainw, image_pixmaps[id]); + XClearWindow(disp,mainw); + } +} + + +//=========================================================================== +/// global event_loop() +/// main event loop - process all events and make game moves +/// tags XWellEngine +void XWellEngine::event_loop() +{ + MouseEvent mev; + struct timezone tzone; + int count=0; + done_loop_var=false; + dbgprintf(("Entered in event_loop\n")); + + gettimeofday(&now, &tzone); + gettimeofday(&nexttime, &tzone); + + while(!done_loop_var) + { + if(wait_for_timers()==0) //Time out + { + process_time_event(); + } + + if(XPending(disp)) + { + dbgprintf(("Got xevent: %d for window 0x%x\n",xev.type,xev.xany.window)); + XNextEvent(disp,&xev); + switch(xev.type) + { + case Expose: + dbgprintf(("Expose event\n")); + process_event_for_all(wEvent(eExpose,&xev)); + break; + + case KeyPress: + dbgprintf(("KeyPressed event\n")); + process_event_for_all(wEvent(eKeyPress,&xev)); + break; + + case ButtonPress: + dbgprintf(("MouseButtonPress event\n")); + mev.mx=xev.xbutton.x; + mev.my=xev.xbutton.y; + mev.bstate=xev.xbutton.button==Button1 ? But1Press : But2Press; + process_event_for_all(wEvent(eMousePress,&mev)); + break; + + case MotionNotify: + dbgprintf(("MouseMotion event\n")); + mev.mx=xev.xmotion.x; + mev.my=xev.xmotion.y; + mev.bstate=xev.xbutton.button==Button1 ? But1Press : But2Press; + process_event_for_all(wEvent(eMouseMove,&mev)); + break; + + case ClientMessage: + dbgprintf(("ClientMessage event\n")); + if (xev.xclient.format == 32 && + xev.xclient.data.l[0] == wmDeleteWindow) + { + dbgprintf(("Got WM_DELETE_WINDOW\n")); + process_event_for_all(wEvent(eDelete)); + done_loop_var=true; + } + break; + + case FocusOut: + dbgprintf(("FocusOut event\n")); + process_event_for_all(wEvent(eFocusOut)); + break; + + } + } + } + dbgprintf(("Exiting from event_loop\n")); +} + +//=========================================================================== +/// global wait_for_timers() +/// calculate delay and wait for events and timers +/// tags XWellEngine +int XWellEngine::wait_for_timers() +{ + struct timeval delayt; + struct timezone tzone; + int ret=0; + fd_set writefd, exceptfd, readfd; + + FD_ZERO(&writefd); + FD_ZERO(&exceptfd); + FD_ZERO(&readfd); + FD_SET(xcon, &readfd); + + gettimeofday(&now, &tzone); + delayt.tv_sec = nexttime.tv_sec - now.tv_sec; + delayt.tv_usec = nexttime.tv_usec - now.tv_usec; + correct_to_real_time(delayt); + if (((long) delayt.tv_sec > 0) || + (((long) delayt.tv_sec == 0) && + ((long) delayt.tv_usec > 0))) + { + ret=select(xcon + 1, &readfd, &writefd, &exceptfd, &delayt); + } + if(ret==0) //Timed out + gettimeofday(&now, &tzone); + nexttime.tv_sec=now.tv_sec; + nexttime.tv_usec=now.tv_usec + TIMESTEP; + correct_to_real_time(nexttime); + + return ret; +} + +//=========================================================================== +/// global correct_to_real_time(struct timeval&) +/// corrects timval to real values +/// tags XWellEngine +void XWellEngine::correct_to_real_time(struct timeval& tv) +{ + while (tv.tv_usec < 0) + { + tv.tv_sec --; + tv.tv_usec += MILLION; + } + while (tv.tv_usec >= MILLION) + { + tv.tv_sec ++; + tv.tv_usec -= MILLION; + } +} + + +//=========================================================================== +/// global udelay(int msec) +/// Unix portable delay :) +/// tags XWellEngine +void XWellEngine::udelay(int msec) +{ + struct timeval tout; + tout.tv_sec=0; + tout.tv_usec=msec; + select(0,0,0,0,&tout); +} + + + +//=========================================================================== +/// local init_colors() +/// allocate all nessesary colors +/// tags XWellEngine +void XWellEngine::init_colors() +{ + XColor tmp; + int i; + + colormap=im_get_colormap(); + + if(!colormap) + colormap=defcmp; + else + XSetWindowColormap(disp,mainw,colormap); + + for(i=COLOR_DELTA;iget_pixmap_of_image(id); + mainw=xengine->get_main_window(); + maingc=xengine->get_main_gc(); +} + +//=========================================================================== +/// global clear_region() +/// clear region on screen for making output +/// tags XWellImageFont +void XWellImageFont::clear_region() +{ + XClearArea(disp,mainw,screen_x,screen_y,screen_l,screen_h,False); +} + +//=========================================================================== +/// global clear_region() +/// clear region on screen for making output +/// tags XWellImageFont +void XWellImageFont::clear_region(Colors idx) +{ + unsigned long *cols=xengine->get_colors(); + XSetForeground(disp,maingc,cols[idx]); + XFillRectangle(disp,mainw,maingc,screen_x,screen_y,screen_l,screen_h); +} + +//=========================================================================== +/// global draw_symbol(...) +/// draw one symbol from font image to screen +/// tags XWellImageFont +void XWellImageFont::draw_symbol(int ix, int iy, + unsigned int il, + unsigned int ih, + char symb) +{ + if(symb<=32 || symb>=127) + return; + symb-=33; //Translate to our indexation + XCopyArea(disp,font_pixmap,mainw,maingc, + dx,dy+(int)symb*font_h, + il,ih,ix,iy); +} + diff --git a/src/x11/xwellimagefont.h b/src/x11/xwellimagefont.h new file mode 100644 index 0000000..28a9bd2 --- /dev/null +++ b/src/x11/xwellimagefont.h @@ -0,0 +1,26 @@ +#ifndef XWELLIMAGEFONT_H +#define XWELLIMAGEFONT_H + +#include "wellimagefont.h" +#include "xwellengine.h" + +class XWellImageFont: public WellImageFont +{ + protected: + Pixmap font_pixmap; + XWellEngine *xengine; + Window mainw; + GC maingc; + virtual void draw_symbol(int ix, int iy, + unsigned int il, + unsigned int ih, + char symb); + public: + XWellImageFont(Images id, unsigned int ifl, unsigned int ifh, int idx, int idy); + virtual void clear_region(); + virtual void clear_region(Colors); +}; + +#endif + + diff --git a/src/x11/xwellinput.cxx b/src/x11/xwellinput.cxx new file mode 100644 index 0000000..9d07d40 --- /dev/null +++ b/src/x11/xwellinput.cxx @@ -0,0 +1,101 @@ +// docm_prefix(///) +/**************************************************************************** +* Copyright (C) 2002 by Leo Khramov +* email: leo@xnc.dubna.su +* +* 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. + ****************************************************************************/ +// $Id: xwellinput.cxx,v 1.1.1.1 2003/01/04 11:37:22 leo Exp $ + +/// module description +/// X11 implementation of WellInput class - make input text from user +/// display it through WellImageFont, convert X11 Key event to symbols + +#include "xwellinput.h" +#include "xwellengine.h" + +//=========================================================================== +/// global XWellInput(char*) +/// constructor - fill name and get geometry +/// tags XWellInput +XWellInput::XWellInput(char* iname) : WellInput(iname) +{ + xengine=(XWellEngine*) default_well_engine; + mainw=xengine->get_main_window(); + maingc=xengine->get_main_gc(); +} + +//=========================================================================== +/// global process_event(wEvent) +/// stub that process events +/// tags XWellInput +bool XWellInput::process_event(wEvent ev) +{ + XEvent *xev=(XEvent*)ev.data; + switch(ev.type) + { + case eKeyPress: + process_key(xev); + return false; + + } + return true; +} + +//=========================================================================== +/// global draw_text() +/// draw text on the screen +/// tags XWellInput +void XWellInput::draw_text() +{ + unsigned long *colors=xengine->get_colors(); + fnt->draw_text(buf,buflen,BackColor); + XSetForeground(disp,maingc,colors[BonusColor2]); + XFillRectangle(disp,mainw,maingc,geo[1].tox+buflen*FONT2_L,geo[1].toy, + FONT2_L,FONT2_H); +} + +//=========================================================================== +/// global process_key(XEvent) +/// draw text on the screen +/// tags XWellInput +void XWellInput::process_key(XEvent *xev) +{ + KeySym ks; + XComposeStatus cs; + + char sym[4]=""; + XLookupString(&xev->xkey, sym, 4, &ks, &cs); + switch(ks) + { + case XK_Return: + if(buflen) + object_on_enter.call(wEvent(aInputDone,this)); + break; + + case XK_Delete: + case XK_BackSpace: + if(buflen>0) + { + buflen--; + buf[buflen]=0; + draw_text(); + } + break; + default: + if(buflen=32 && sym[0]<127) + { + buf[buflen++]=sym[0]; + buf[buflen]=0; + draw_text(); + } + } +} diff --git a/src/x11/xwellinput.h b/src/x11/xwellinput.h new file mode 100644 index 0000000..3ccc787 --- /dev/null +++ b/src/x11/xwellinput.h @@ -0,0 +1,24 @@ +#ifndef XWELLINPUT_H +#define XWELLINPUT_H + +#include "wellinput.h" +#include "xheaders.h" +#include "xwellengine.h" + +class XWellInput:public WellInput +{ + XWellEngine *xengine; + Window mainw; + GC maingc; + + virtual void draw_text(); + void process_key(XEvent *xev); + public: + XWellInput(char *iname); + + virtual bool process_event(wEvent); + +}; + + +#endif -- 2.11.4.GIT