Initial commit of early-clip branch of flam3 into google code.

git-svn-id: https://flam3.googlecode.com/svn/trunk@3 77852712-ef1d-11de-8684-7d64432d61a3
This commit is contained in:
Erik Reckase 2010-04-19 19:52:20 +00:00 committed by Scott Draves
parent 238395d551
commit 0b31b96c55
53 changed files with 68382 additions and 0 deletions

674
src/COPYING Normal file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. 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
them 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 prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. 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.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU 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 that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
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.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
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.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 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, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program 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, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU 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 Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

674
src/COPYING.txt Normal file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. 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
them 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 prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. 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.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU 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 that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
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.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
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.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 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, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program 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, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU 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 Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

37
src/Makefile.am Normal file
View File

@ -0,0 +1,37 @@
AUTOMAKE_OPTIONS = foreign no-dependencies
SVN_DEF = -D'SVN_REV="$(shell svnversion -n .)"'
AM_CFLAGS = -g -O3 -std=gnu99 -ffast-math -DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" $(SVN_DEF)
ACLOCAL_AMFLAGS = -I m4
man1_MANS = flam3-animate.man flam3-genome.man flam3-render.man flam3-convert.man
bin_PROGRAMS = flam3-animate flam3-genome flam3-render flam3-convert
lib_LTLIBRARIES = libflam3.la
include_HEADERS = flam3.h isaac.h isaacs.h
libflam3_la_SOURCES = flam3.c filters.c parser.c variations.c interpolation.c palettes.c jpeg.c png.c isaac.c
libflam3_la_LDFLAGS = -no-undefined -ljpeg -lpng -lz -lpthread
flam3_genome_SOURCES = flam3-genome.c docstring.c
flam3_genome_LDADD = libflam3.la -lm
flam3_animate_SOURCES = flam3-animate.c docstring.c
flam3_animate_LDADD = libflam3.la -lm
flam3_render_SOURCES = flam3-render.c docstring.c
flam3_render_LDADD = libflam3.la -lm
flam3_convert_SOURCES = flam3-convert.c docstring.c
flam3_convert_LDADD = libflam3.la -lm
pkgdata_DATA = flam3-palettes.xml
EXTRA_DIST = rect.c flam3.h palettes.h variations.h interpolation.h parser.h \
private.h isaac.h isaacs.h img.h test.flam3 vidres.flam3 \
flam3.dsw render.dsp animate.dsp genome.dsp convert.dsp \
mkinstalldirs README.txt COPYING.txt flam3-palettes.xml \
flam3-animate.man flam3-render.man flam3-genome.man flam3-convert.man
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = flam3.pc

816
src/Makefile.in Normal file
View File

@ -0,0 +1,816 @@
# Makefile.in generated by automake 1.10.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
bin_PROGRAMS = flam3-animate$(EXEEXT) flam3-genome$(EXEEXT) \
flam3-render$(EXEEXT) flam3-convert$(EXEEXT)
subdir = .
DIST_COMMON = $(am__configure_deps) $(include_HEADERS) \
$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/config.h.in $(srcdir)/flam3.pc.in \
$(top_srcdir)/configure COPYING config.guess config.sub \
install-sh ltmain.sh missing mkinstalldirs
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
$(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno config.status.lineno
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES = flam3.pc
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" \
"$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(includedir)"
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libflam3_la_LIBADD =
am_libflam3_la_OBJECTS = flam3.lo filters.lo parser.lo variations.lo \
interpolation.lo palettes.lo jpeg.lo png.lo isaac.lo
libflam3_la_OBJECTS = $(am_libflam3_la_OBJECTS)
libflam3_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libflam3_la_LDFLAGS) $(LDFLAGS) -o $@
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(bin_PROGRAMS)
am_flam3_animate_OBJECTS = flam3-animate.$(OBJEXT) docstring.$(OBJEXT)
flam3_animate_OBJECTS = $(am_flam3_animate_OBJECTS)
flam3_animate_DEPENDENCIES = libflam3.la
am_flam3_convert_OBJECTS = flam3-convert.$(OBJEXT) docstring.$(OBJEXT)
flam3_convert_OBJECTS = $(am_flam3_convert_OBJECTS)
flam3_convert_DEPENDENCIES = libflam3.la
am_flam3_genome_OBJECTS = flam3-genome.$(OBJEXT) docstring.$(OBJEXT)
flam3_genome_OBJECTS = $(am_flam3_genome_OBJECTS)
flam3_genome_DEPENDENCIES = libflam3.la
am_flam3_render_OBJECTS = flam3-render.$(OBJEXT) docstring.$(OBJEXT)
flam3_render_OBJECTS = $(am_flam3_render_OBJECTS)
flam3_render_DEPENDENCIES = libflam3.la
DEFAULT_INCLUDES = -I.@am__isrc@
depcomp =
am__depfiles_maybe =
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(libflam3_la_SOURCES) $(flam3_animate_SOURCES) \
$(flam3_convert_SOURCES) $(flam3_genome_SOURCES) \
$(flam3_render_SOURCES)
DIST_SOURCES = $(libflam3_la_SOURCES) $(flam3_animate_SOURCES) \
$(flam3_convert_SOURCES) $(flam3_genome_SOURCES) \
$(flam3_render_SOURCES)
man1dir = $(mandir)/man1
NROFF = nroff
MANS = $(man1_MANS)
pkgconfigDATA_INSTALL = $(INSTALL_DATA)
pkgdataDATA_INSTALL = $(INSTALL_DATA)
DATA = $(pkgconfig_DATA) $(pkgdata_DATA)
includeHEADERS_INSTALL = $(INSTALL_HEADER)
HEADERS = $(include_HEADERS)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
{ test ! -d $(distdir) \
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -fr $(distdir); }; }
DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
XML2_CONFIG = @XML2_CONFIG@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign no-dependencies
SVN_DEF = -D'SVN_REV="$(shell svnversion -n .)"'
AM_CFLAGS = -g -O3 -std=gnu99 -ffast-math -DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" $(SVN_DEF)
ACLOCAL_AMFLAGS = -I m4
man1_MANS = flam3-animate.man flam3-genome.man flam3-render.man flam3-convert.man
lib_LTLIBRARIES = libflam3.la
include_HEADERS = flam3.h isaac.h isaacs.h
libflam3_la_SOURCES = flam3.c filters.c parser.c variations.c interpolation.c palettes.c jpeg.c png.c isaac.c
libflam3_la_LDFLAGS = -no-undefined -ljpeg -lpng -lz -lpthread
flam3_genome_SOURCES = flam3-genome.c docstring.c
flam3_genome_LDADD = libflam3.la -lm
flam3_animate_SOURCES = flam3-animate.c docstring.c
flam3_animate_LDADD = libflam3.la -lm
flam3_render_SOURCES = flam3-render.c docstring.c
flam3_render_LDADD = libflam3.la -lm
flam3_convert_SOURCES = flam3-convert.c docstring.c
flam3_convert_LDADD = libflam3.la -lm
pkgdata_DATA = flam3-palettes.xml
EXTRA_DIST = rect.c flam3.h palettes.h variations.h interpolation.h parser.h \
private.h isaac.h isaacs.h img.h test.flam3 vidres.flam3 \
flam3.dsw render.dsp animate.dsp genome.dsp convert.dsp \
mkinstalldirs README.txt COPYING.txt flam3-palettes.xml \
flam3-animate.man flam3-render.man flam3-genome.man flam3-convert.man
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = flam3.pc
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
am--refresh:
@:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
cd $(srcdir) && $(AUTOMAKE) --foreign \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --foreign Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
echo ' $(SHELL) ./config.status'; \
$(SHELL) ./config.status;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(top_srcdir)/configure: $(am__configure_deps)
cd $(srcdir) && $(AUTOCONF)
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
config.h: stamp-h1
@if test ! -f $@; then \
rm -f stamp-h1; \
$(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
else :; fi
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
@rm -f stamp-h1
cd $(top_builddir) && $(SHELL) ./config.status config.h
$(srcdir)/config.h.in: $(am__configure_deps)
cd $(top_srcdir) && $(AUTOHEADER)
rm -f stamp-h1
touch $@
distclean-hdr:
-rm -f config.h stamp-h1
flam3.pc: $(top_builddir)/config.status $(srcdir)/flam3.pc.in
cd $(top_builddir) && $(SHELL) ./config.status $@
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
f=$(am__strip_dir) \
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
else :; fi; \
done
uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
p=$(am__strip_dir) \
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
done
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
test "$$dir" != "$$p" || dir=.; \
echo "rm -f \"$${dir}/so_locations\""; \
rm -f "$${dir}/so_locations"; \
done
libflam3.la: $(libflam3_la_OBJECTS) $(libflam3_la_DEPENDENCIES)
$(libflam3_la_LINK) -rpath $(libdir) $(libflam3_la_OBJECTS) $(libflam3_la_LIBADD) $(LIBS)
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
@list='$(bin_PROGRAMS)'; for p in $$list; do \
p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
if test -f $$p \
|| test -f $$p1 \
; then \
f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
$(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
else :; fi; \
done
uninstall-binPROGRAMS:
@$(NORMAL_UNINSTALL)
@list='$(bin_PROGRAMS)'; for p in $$list; do \
f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
rm -f "$(DESTDIR)$(bindir)/$$f"; \
done
clean-binPROGRAMS:
@list='$(bin_PROGRAMS)'; for p in $$list; do \
f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
echo " rm -f $$p $$f"; \
rm -f $$p $$f ; \
done
flam3-animate$(EXEEXT): $(flam3_animate_OBJECTS) $(flam3_animate_DEPENDENCIES)
@rm -f flam3-animate$(EXEEXT)
$(LINK) $(flam3_animate_OBJECTS) $(flam3_animate_LDADD) $(LIBS)
flam3-convert$(EXEEXT): $(flam3_convert_OBJECTS) $(flam3_convert_DEPENDENCIES)
@rm -f flam3-convert$(EXEEXT)
$(LINK) $(flam3_convert_OBJECTS) $(flam3_convert_LDADD) $(LIBS)
flam3-genome$(EXEEXT): $(flam3_genome_OBJECTS) $(flam3_genome_DEPENDENCIES)
@rm -f flam3-genome$(EXEEXT)
$(LINK) $(flam3_genome_OBJECTS) $(flam3_genome_LDADD) $(LIBS)
flam3-render$(EXEEXT): $(flam3_render_OBJECTS) $(flam3_render_DEPENDENCIES)
@rm -f flam3-render$(EXEEXT)
$(LINK) $(flam3_render_OBJECTS) $(flam3_render_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
.c.o:
$(COMPILE) -c $<
.c.obj:
$(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
$(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool config.lt
install-man1: $(man1_MANS) $(man_MANS)
@$(NORMAL_INSTALL)
test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
for i in $$l2; do \
case "$$i" in \
*.1*) list="$$list $$i" ;; \
esac; \
done; \
for i in $$list; do \
if test -f $$i; then file=$$i; \
else file=$(srcdir)/$$i; fi; \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
1*) ;; \
*) ext='1' ;; \
esac; \
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
inst=`echo $$inst | sed -e 's/^.*\///'`; \
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
done
uninstall-man1:
@$(NORMAL_UNINSTALL)
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
for i in $$l2; do \
case "$$i" in \
*.1*) list="$$list $$i" ;; \
esac; \
done; \
for i in $$list; do \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
1*) ;; \
*) ext='1' ;; \
esac; \
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
inst=`echo $$inst | sed -e 's/^.*\///'`; \
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
done
install-pkgconfigDATA: $(pkgconfig_DATA)
@$(NORMAL_INSTALL)
test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
@list='$(pkgconfig_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(pkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
$(pkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigdir)/$$f"; \
done
uninstall-pkgconfigDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkgconfig_DATA)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
rm -f "$(DESTDIR)$(pkgconfigdir)/$$f"; \
done
install-pkgdataDATA: $(pkgdata_DATA)
@$(NORMAL_INSTALL)
test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)"
@list='$(pkgdata_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
$(pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
done
uninstall-pkgdataDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkgdata_DATA)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
done
install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
@list='$(include_HEADERS)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
$(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
done
uninstall-includeHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(include_HEADERS)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
rm -f "$(DESTDIR)$(includedir)/$$f"; \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
$(am__remove_distdir)
test -d $(distdir) || mkdir $(distdir)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r $(distdir)
dist-gzip: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
dist-bzip2: distdir
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-lzma: distdir
tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
$(am__remove_distdir)
dist-tarZ: distdir
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
$(am__remove_distdir)
dist-shar: distdir
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
$(am__remove_distdir)
dist-zip: distdir
-rm -f $(distdir).zip
zip -rq $(distdir).zip $(distdir)
$(am__remove_distdir)
dist dist-all: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lzma*) \
unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/_build
mkdir $(distdir)/_inst
chmod a-w $(distdir)
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
&& cd $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
distuninstallcheck \
&& chmod -R a-w "$$dc_install_base" \
&& ({ \
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
} || { rm -rf "$$dc_destdir"; exit 1; }) \
&& rm -rf "$$dc_destdir" \
&& $(MAKE) $(AM_MAKEFLAGS) dist \
&& rm -rf $(DIST_ARCHIVES) \
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
$(am__remove_distdir)
@(echo "$(distdir) archives ready for distribution: "; \
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
distuninstallcheck:
@cd $(distuninstallcheck_dir) \
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
fi ; \
$(distuninstallcheck_listfiles) ; \
exit 1; } >&2
distcleancheck: distclean
@if test '$(srcdir)' = . ; then \
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
exit 1 ; \
fi
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left in build directory after distclean:" ; \
$(distcleancheck_listfiles) ; \
exit 1; } >&2
check-am: all-am
check: check-am
all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) \
config.h
install-binPROGRAMS: install-libLTLIBRARIES
installdirs:
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(includedir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-hdr distclean-libtool distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am: install-includeHEADERS install-man \
install-pkgconfigDATA install-pkgdataDATA
install-dvi: install-dvi-am
install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
install-html: install-html-am
install-info: install-info-am
install-man: install-man1
install-pdf: install-pdf-am
install-ps: install-ps-am
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \
uninstall-libLTLIBRARIES uninstall-man uninstall-pkgconfigDATA \
uninstall-pkgdataDATA
uninstall-man: uninstall-man1
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
clean-libtool ctags dist dist-all dist-bzip2 dist-gzip \
dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \
distclean-compile distclean-generic distclean-hdr \
distclean-libtool distclean-tags distcleancheck distdir \
distuninstallcheck dvi dvi-am html html-am info info-am \
install install-am install-binPROGRAMS install-data \
install-data-am install-dvi install-dvi-am install-exec \
install-exec-am install-html install-html-am \
install-includeHEADERS install-info install-info-am \
install-libLTLIBRARIES install-man install-man1 install-pdf \
install-pdf-am install-pkgconfigDATA install-pkgdataDATA \
install-ps install-ps-am install-strip installcheck \
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
tags uninstall uninstall-am uninstall-binPROGRAMS \
uninstall-includeHEADERS uninstall-libLTLIBRARIES \
uninstall-man uninstall-man1 uninstall-pkgconfigDATA \
uninstall-pkgdataDATA
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

820
src/README.txt Normal file
View File

@ -0,0 +1,820 @@
FLAM3 - cosmic recursive fractal flames
see the file COPYING for the license covering this software.
This is free software to render fractal flames as described on
http://flam3.com. Flam3-animate makes animations, and flam3-render
makes still images. Flam3-genome creates and manipulates genomes
(parameter sets). A C library is also installed.
Note: the following instructions are written for Linux users. Windows
users may install the cygwin package to get the "env" command or set
the envars in your windows command prompt manually. That means
instead of a command like
env dtime=5 prefix=foo. in=test.flame flam3-animate
say
set dtime=5
set prefix=foo.
set in=test.flame
flam3-animate
As usual, to configure, build, and install:
./configure
make
sudo make install
This package depends on development packages for libz, libpng,
libjpeg, and libxml2.
To test it, run
flam3-render < test.flam3
and it should produce 00000.jpg and 00001.jpg, one image for each
<flame> element in the parameter file. To make an animation run
flam3-animate < test.flam3
and it should produce 100 files named 00000.jpg through 00099.jpg that
interpolate between the two <flame> elements.
envar default meaning
===== ======= =======
prefix (empty) prefix names of output files with this string.
begin j time of first frame to render (j=first time in input file) (animate only)
end n-1 time of last frame to render (n=last time specified in the input file) (animate only)
time NA time of first and last frame (ie do one frame) (animate only)
frame NA synonym for "time" (animate only)
in stdin name of input file
out NA name of output file (bad idea if rending more than one, use prefix instead)
template NA apply defaults based on this genome (genome only)
dtime 1 time between frames (animate only)
fields 0 if 1 then render fields, ie odd scanlines at time+0.5
nstrips 1 number of strips, ie render fractions of a frame at once (render only)
qs 1 quality scale, multiply quality of all frames by this
ss 1 size scale, multiply size (in pixels) of all frames by this
jpeg NA jpeg quality for compression, default is native jpeg default
format png "jpg" or "ppm" or "png"
pixel_aspect 1.0 aspect ratio of pixels (width over height), eg 0.90909 for NTSC
isaac_seed random string to be used in generating random seed. defaults to time(0)
seed random integer seed for random numbers, defaults to time+pid. deprecated.
nthreads auto number of threads to use (render and animate)
verbose 0 if non-zero then print progress meter on stderr
bits 33 also 32 or 64: sets bit-width of internal buffers (33 means 32-bit floating-point)
bpc 8 bits per channel of color: only png supports 16 (render/animate)
image filename replace palette with png, jpg, or ppm image
use_vars -1 comma sep list of variation #'s to use when generating a random flame (genome only)
dont_use_vars unset comma sep list of variation #'s to NOT use when generating a random flame. (genome only)
cross0 NA randomly select one genome from this file to genetically cross (genome only)
cross1 NA with one genome from this file (genome only)
method NA method for genetic cross: alternate, interpolate, or union. (genome only)
mutate NA randomly mutate a random genome from this file (genome only)
symmetry NA set symmetry of result. (genome only)
clone NA clone random flame in input (genome only)
clone_all NA clones all flames in file. useful for applying template to all flames (genome only)
animate NA interpolates between all flames in a file, using times specified in file (genome only)
sequence NA 360 degree rotation 'loops' times of each control point plus rotating transitions (genome only)
loops NA number of times to rotate each control point in sequence (genome only)
tries 50 number of tries to make to find a good genome. (genome only)
strip NA strip input, frame and nframes control which one. (genome only)
transparency 0 make bknd transparent, if format supports it (render/animate)
name_enable 0 use 'name' attr in <flame> to name image output if present (render only)
nick "" nickname to use in <edit> tags / img comments
url "" url to use in <edit> tags / img comments
id "" ID to use in <edit> tags / img comments
comment "" comment string for <edit> tags (genome only)
use_mem auto floating point number of bytes of memory to use (render only)
noedits unset omit edit tags from output (genome only)
write_genome 0 write out genome associated with center of motion blur window (animate only)
print_edit_depth 0 depth to truncate <edit> tag structure. 0 prints all <edit> tags (genome only)
intpalette unset round palette entries for importing into older Apophysis versions (genome only)
insert_palette unset insert the palette into the image.
enable_jpeg_comments 1 enables comments in the jpeg header (render and animate)
enable_png_comments 1 enables comments in the png header (render and animate)
New in 2.8:
earlyclip 0 enables the early clipping of rgb values for better antialiasing and resizing
defaults to 0 for backwards compatibility
flam27 0 flam3 2.7 compatibility mode; ensures generated genomes can be used by flam3 2.7.18
stagger 0 affects simultaneity of xform interpolation during genome interpolation.
represents how 'separate' the xforms are interpolated. set to 1 for each
xform to be interpolated individually, fractions control interp overlap.
for example:
env dtime=5 prefix=foo. in=test.flam3 flam3-animate
means to render every 5th frame of parameter file foo.flam3, and store
the results in files named foo.XXXX.jpg.
the flam3-convert program reads from stdin the old format created by
the GIMP and writes to stdout the new xml format.
the flam3-genome program creates random parameter files. it also mutates,
rotates, and interpolates existing parameter files. for example to
create 10 wholly new control points and render them at normal quality:
env template=vidres.flam3 repeat=10 flam3-genome > new.flam3
flam3-render < new.flam3
if you left out the "template=vidres.flam3" part then the size,
quality, etc parameters would be their default (small) values. you
can set the symmetry group:
env template=vidres.flam3 symmetry=3 flam3-genome > new3.flam3
env template=vidres.flam3 symmetry=-2 flam3-genome > new-2.flam3
flam3-render < new3.flam3
flam3-render < new-2.flam3
Mutation is done by giving an input flame file to alter:
env template=vidres.flam3 flam3-genome > parent.flam3
env prefix=parent. flam3-render < parent.flam3
env template=vidres.flam3 mutate=parent.flam3 repeat=10 flam3-genome > mutation.flam3
flam3-render < mutation.flam3
Normally one wouldn't use the same file for the template and the file
to mutate. Crossover is handled similarly:
env template=vidres.flam3 flam3-genome > parent0.flam3
env prefix=parent0. flam3-render < parent0.flam3
env template=vidres.flam3 flam3-genome > parent1.flam3
env prefix=parent1. flam3-render < parent1.flam3
env template=vidres.flam3 cross0=parent0.flam3 cross1=parent1.flam3 flam3-genome > crossover.flam3
flam3-render < crossover.flam3
flam3-genome has 3 ways to produce parameter files for animation in
the style of electric sheep. the highest level and most useful from
the command line is the sequence method. it takes a collection of
control points and makes an animation that has each flame do fractal
rotation for 360 degrees, then make a smooth transition to the next.
for example:
env sequence=test.flam3 nframes=20 flam3-genome > seq.flam3
flam3-animate < seq.flam3
creates and renders a 60 frame animation. there are two flames in
test.flam3, so the animation consists three stages: the first one
rotating, then a transition, then the second one rotating. each stage
has 20 frames as specified on the command line. if you want to
render only some fraction of a whole animation file, specify the begin
and end times:
env begin=20 end=40 flam3-animate < seq.flam3
the other two methods are harder to use because they produce files that
are only good for one frame of animation. the output consists of 3
control points, one for the time requested, one before and one after.
that allows proper motion blur. for example:
env template=vidres.flam3 flam3-genome > rotme.flam3
env rotate=rotme.flam3 frame=10 nframes=20 flam3-genome > rot10.flam3
env frame=10 flam3-animate < rot10.flam3
the file rot10.flam3 specifies the animation for just one frame, in
this case 10 out of 20 frames in the complete animation. C1
continuous electric sheep genetic crossfades are created like this:
env inter=test.flam3 frame=10 nframes=20 flam3-genome > inter10.flam3
env frame=10 flam3-animate < inter10.flam3
see http://flam3.com/flame.pdf for descriptions & formulas, and
see http://electricsheep.wikispaces.com/Variations for updates.
The complete list of variations:
0. linear
1. sinusoidal
2. spherical
3. swirl
4. horseshoe
5. polar
6. handkerchief
7. heart
8. disc
9. spiral
10. hyperbolic
11. diamond
12. ex
13. julia
14. bent
15. waves
16. fisheye
17. popcorn
18. exponential
19. power
20. cosine
21. rings
22. fan
23. blob
24. pdj
25. fan2
26. rings2
27. eyefish
28. bubble
29. cylinder
30. perspective
31. noise
32. julian
33. juliascope
34. blur
35. gaussian_blur
36. radial_blur
37. pie
38. ngon
39. curl
40. rectangles
41. arch
42. tangent
43. square
44. rays
45. blade
46. secant2
47. twintrian
48. cross
49. disc2
50. super_shape
51. flower
52. conic
53. parabola
54. bent2
55. bipolar
56. boarders
57. butterfly
58. cell
59. cpow
60. curve
61. edisc
62. elliptic
63. escher
64. foci
65. lazysusan
66. loonie
67. pre_blur
68. modulus
69. oscilloscope
70. polar2
71. popcorn2
72. scry
73. separation
74. split
75. splits
76. stripes
77. wedge
78. wedge_julia
79. wedge_sph
80. whorl
81. waves2
82. exp
83. log
84. sin
85. cos
86. tan
87. sec
88. csc
89. cot
90. sinh
91. cosh
92. tanh
93. sech
94. csch
95. coth
96. auger
see http://flam3.com/flame.pdf for descriptions & formulas for each of
these. note that, by default, if a random flame is requested and neither
'use_vars' or 'dont_use_vars' are specified, the following variations are
not used: noise, blur, gaussian_blur, radial_blur, ngon, square, rays,
and cross.
note: these variations do not use the variation weight to scale their
contributions, and so will not be implemented in flam3:
circlize
======================================
todo: eliminate all static storage.
======================================
changelog:
12/20/09 Highlight power now interpolates smoothly from old behavior
(-1) to new behavior. flam3-genome 'split' mode was broken, fixed
(thanks Exper.) Die gracefully instead of segfault when very small
estimator_curve values are specified. Version attribute added to
flame tag. Number of iterations used to fuse attractor increased to
100. Release as 2.8beta7.
11/24/09 Potential speedup of 5% over prior versions. Many threading
issues identified and resolved when using flam3 shared library as
back end for user interfaces. 14 complex plane variations added.
auger variation added. new flam3_make_strip library function to
generate stripped genomes for external ui strip renders. bug fix:
when rendering strips, use the same random context for each strip
to prevent edge effects where strips butt against each other. flam3
will now linearly interpolate missing colors in the colormap.
Release as 2.8beta6.
10/16/09 Non-threadsafe progress tracking code in main iteration thread
replaced with per-render progress storage. Fixed bug where pausing
render during density estimation stage terminated render. Waves2
variation fixed (thx Joel F). Release as 2.8beta5.
10/07/09 Fixed bug affecting 'animate' mode with flam3-genome. Changed
estimate_bounding_box to increase discarded iterations if numerous
badvals were encountered during iterations. Exported a few more
functions for Windows DLL. Release as 2.8beta4.
10/03/09 Changed color_speed range from 0 (no color change) to 1
(use new xform color). Animate attribute is now 0 for no motion,
1 for motion. Removed final xform from stagger algorithm. 'oscope'
parameters are now called 'oscilloscope' to match the rest of the
parametric variations (backwards compatible, so old genomes can be
read.) Stagger now affects morphing as well as sheep rotation, but
only using flam3-genome (not flam3-animate). Release as 2.8beta3.
03/18/09 Major upgrade :
- 28 variations added, mostly from the sourceforge plugins pack
- significant speed optimization of variations
- setting earlyclip env var on commandline will enable an alternate
calculation of color values, resulting in better antialiasing
- 'highlight_power' flame element controls the white highlights in
dense areas, eliminating the hue shift bug
- Apophysis chaos and solo xform/plotmode features have been
implemented. solo/plotmode are promoted to floating point
'opacity'. opacity and chaos are both interpolatable.
- <motion> tag now available for xforms...allows cyclic variation
of any regular xform parameter/coef/post.
- env var 'stagger' affects the simultaneity of xform interpolation
when morphing from one flame to another. set to 0 for existing
behaviour, set to 1 to make each xform interpolate individually
- symmetry has been broken out into color_speed and animate tags
with the same sense (which is confusing and will be fixed in a
future release).
- set the flam27 parameter to output backwards compatible genomes.
- passes the consistency test where rendering an image at double
size and filtering it down produces the same results as the
original (modulo quality).
03/17/09 Added fuzz testing with zzuf to the regression tests. 'Strip'
mode and genomes with the zoom parameter used now break into pieces
properly. insert_palette fixed (broken a few versions ago.) fixed
twintrian variation when small weights are used. various rare
segfaults and memory leaks fixed. 'palette_mode' attribute added to
flame element for smoother palette interpolation in slow animations;
possible values are 'step' and 'linear' ('step' mode is default and
matches previous behaviour.) Release as 2.7.18.
11/11/08 Add error checking on the numbers in the input genome. Do
not exit on read errors, fail gracefully. Changed sin/cos = tan in
the tangent variation. Added polar to list of variations that use
the inverted linear identity. Bugfix: temporal_filter_exp was not
set properly in template. Apply interpolation attribute in
templates. Add/publish datarootdir with pkg-config so the palette
file is easy to find (for qosmic). Copyright by Spotworks LLC
instead of Spot and Erik. Add fuzz checks to the regression
suite. include LNX/OSX/WIN in the version string. In
flam3-genome animate command, added one to last flame time, so the
end time is inclusive. Release as 2.7.17.
09/06/08 Added 'clone_all' to flam3_genome to allow application of
template to all flames in a file at once, and 'animate' to write
a full sequence of interpolations out. 'animate' is similar to
'sequence' except that no control point rotation is performed.
Fixed non-functional 'write_genome' env var for flam3_animate.
Two bugs associated with interpolating from a log interpolation_type
to a non-log interpolation_type fixed (rotate angle reduction and
special inverted identity). when using flam3_rotate in 'spin_inter'
the interp type of the first genome is now used rather than the
current genome's interp type. Enforced upper and lower bounds for
xform color and upper bound for interpolated colormap values
as "smooth" interpolation led to values out of range. If "smooth"
interpolation is specified for all flames in a file, the first and
second-to-last genome is switched to "linear" with a warning.
spatial filters with non-box-filter window functions fixed.
Release as 2.7.16.
08/25/08 Added new interpolation types 'old' and 'older', for use in
recreating old animations. 'linear' mode now does not rotate padded
xforms (results in prettier symmetric singularities). switched to
using a 'padding' flag instead of a 'just initialized' flag; padding
flag used for implementation of 'old' and 'older' types.
interpolation_space now deprecated, instead use interpolation_type.
flam3_align is now idempotent (multiple applications do not change
the control points.) Default number of temporal samples bumped to
1000. Removed CVS headers from source code (now using SVN).
Default interpolation mode now log. Removed 'move' and 'split' vars.
changes to flam3-genome: sequence mode now returns linear
interpolation mode for all control points except first/last of edges
- these cps will use the original interpolation mode; inter and
rotate modes will now return padded genomes for all control points,
all with linear interpolation specified. instead of centering
sometimes reframe by golden mean plus noise. Release as 2.7.15.
07/21/08 Add configuration option for atomic-ops. bug fix: do not
truncate floating point palettes. new motion blur features: add
temporal_filter_type, can be "box" (default) or "gaussian" or
"exp". Temporal_filter_width and temporal_filter_exp are parms to
it. 'blur' env var no longer used. Small bug fix: iteration
count depends only on the size of the output image, not the padded
image (the gutter). When interpolating, only do -pi/pi adjustment
for non-asymmetric cases. Julian/juliascope variations use the
alternate inverted identity for interpolation (reduces wedge
effect). Add python script for regression and consistency
checking. Add svn revision number to version string (in the
software not of the package). Release as 2.7.14.
05/28/08 Restored upper limit on particle coordinates. Release as
2.7.13.
05/16/08 Added man pages. Removed upper limit on particle
coordinates. fixed FSF address in comments. update to automake
1.10.1. added eps to denom of perspective fraction to avoid
infinities (thanks fred). Put contents of 'id' env var in png/jpg
comment block. Release as 2.7.12.
04/05/08 Added 16 bit per channel support to PNG via bpc envar.
isaac.h is now installed with the flam3 headers. Strip indexing
now done with size_t's to fix bug in large images (thanks Paul).
Progress callback now returns ETA, and per-thread verbose flag
functionality fixed. Enumerated spatial filter types now used in
flam3.h, taking the place of function pointers (simplifies the
API). Fix bug by moving precalculation of variation variables to
flam3_iterate (thanks david). Release as 2.7.11.
03/15/08 fixed interpolation bug when magnitude of rotation/scaling
component of affine transform is 0. replaced secant variation
with more flame-friendly secant2 (eliminates gap in y direction,
scales y-coordinate by weight). warning message now printed when
unrecognized variation is present in an xform. fixed bad
inequality when checking for -pi/pi discontinuity during complex
interpolation. release as 2.7.10.
02/08/08 non-zero weights for final xforms no longer allowed, and now
have no effect. recompiled windows exes with mingw gcc 4.1 to
take advantage of scalability improvements in flam3 2.7.8 (was
compiling with mingw gcc 3.4 until now). for fedora package
compliance, flam3.pc.in patched by ian weller and moved use of
config.h to c files only. release as 2.7.9.
01/26/08 better scalability across multiple CPUs by using compare and
swap (from Tim Hockin). fix bug in large images (>2GB). add
flam3_srandom and flam3_malloc/free to better support wrapping
with python on windows, which links with a different C
runtime. add --enable-shared option to configure script (from
Bobby R Ward). release as 2.7.8.
12/16/07 fixed bug (rare random crash) identified by david burnett.
initialize new xforms with better defaults for parametric
variations (based on interpolated-against xforms). add id envar,
like nick/url. add clone_action envar. return to xform
interpolation based on complex logs, but make consistent decisions
about counter/clockwise rotation across the sheep edges.
interpolation_space attribute to flame element can be set to
"linear" to go back to the simpler method, or "log" to use this
new (default) method. release as 2.7.7
10/20/07 fixed action string overflow when many xforms are present.
added 'print_edit_depth' env var to control how many levels of
<edit> tags are saved when using flam3-genome. Fixed wrong
placement of random improve_colors code in flam3-genome. go to
five digit filenames. fixed bug in supershape variation. API
cleanup, thanks to david bitseff. release 2.7.6.
08/14/07 various code updates to assist with compiling under msvc++.
now can specify --disable-pthread or --enable-pthread to configure
to better control compilation. fixed bug preventing renders of
flames with more than 128 xforms. release 2.7.5.
07/12/07 fixed bug in split variation, now compatible with both
versions of Apo. added insert_palette option. switched density
estimation kernel from Epanichnikov to Gaussian. genetic cross
now crosses palettes rather than selecting one of the parent
palettes. remove noisy variations from random generation if
use_vars or dont_use_vars not specified. fixed metrics calculated
on small test render for genetic operations. reduced memory
requirements for density estimation filters. 64-bit linux distros
now supported. release 2.7.4.
06/21/07 flam3 version, rendered genome, some render statistics and
optionally nick/url stored in jpeg/png headers. fixed two bugs
in isaac rng code (strongly affected temporal blur). prevent
final xform rotation for sheep animation. fixed interpolation
when only one flame has final xform. added Supershape, Flower,
Conic, Parabola, Move and Split variations. Shape combined with
Supershape via 'rnd' parameter. flam3-genome now writes 'name'
attribute for rotate and sequence modes. oversample attribute
deprecated; supersample now preferred. new build process for
windows exes using MinGW/MSYS. added 'intpalette' env var to
round floating point palettes to allow older versions of Apophysis
to read them. default image type is now PNG, transparency off.
density estimation code revised to be more consistent between
different supersample levels, which required change to default
de params. limit number of de filters to conserve memory. fixed
julia variation dependency on non-thread-safe random bit function.
removed random number storage for radial blur variation.
release 2.7.3.
07/26/08: Note, incompat. change made to direction of cp->rotate
(as of 2.7.3, rotates shortest distance instead of clockwise)
02/09/07 use isaac random number generator to avoid differences
between mac/pc/linux. use multiple threads to take advantage
of multiple CPUs or cores. new variations: disc2, Arch,
Tangent, Square, Rays, Blade, Secant, Twintrian, Cross.
fixed bug reading hex color format - must remove \n prior to
start of colors if present. use EPS in spiral, hyperbolic
and spherical to eliminate black spots. fix numbering of
disc2, change parameter to estimate_bounding_box. made blur
kernel type templatable. removed extraneous 'enabled="1"' in
writing out final xform information (no longer needed).
release 2.7.2.
12/31/06 fixed bug in waves precalculation code. curl and rectangles
variations from joel faber. remove visibility of
rotation_center attribute, fix strips operator to handle
rotation without it. added motion exponent and gamma lin
thresh to flam3_print. list of variations in the docstring
automatically generated. flam3-genome: envar noedits
suppresses output of edit history. release 2.7.1.
09/27/06 print out palette as floating point with up to 6 digits
rather than integers (for very slow smooth transitions).
Added optimization to only recalculate the xform distrib
array when necessary (Thanks Joel Faber). Added settable
kernel for downrez. Added XML reading code for new <palette>
format for gradients. Functionalized hex gradient read.
Removed color shift experimental feature. New
'motion_exponent' attribute controls fade of temporal steps.
added gaussian_blur and radial_blur vars from apo. added pie
and ngon variations from joel faber. add rotation_center
attribute. added but disabled image variation from joel.
release as 2.7.
06/26/06 use new libpng api, handle libpng errors properly (from nix
at esperi.org.uk). print out palette as floating point with
6 digits rather than integers (for very slow smooth
transitions).
06/11/06 disable density estimation for 16 and 32 bit buffers because
it doesn't work. Apo team removed "enabled" from final xform
specification, so now it defaults to on. make default
temporal samples be 60 so that motion blur is the default,
but explicitly ignore temporal samples when rendering still
frames. add strip genetic operator to flam3-genome for
breaking a flame into strips for parallel rendering. add
subpixel offsets for antialiasing by averaging multiple
images. release as 2.7b8.
05/25/06 change attribute name "batches" to "passes" because many old
genomes have it set, and with density estimation it is
harmful.
04/28/06 remove debugging code, release as 2.7b7.
04/28/06 add attribute interpolation="smooth" for catmull-rom
interpolation. known bug: some frames come out dark.
release as 2.7b6.
04/15/06 rename XML attribute "estimator" to "estimator_radius". fix
the progress callback. add use_mem envar. move palette
database to external file. cleanup namespace. add new
variations blur, julian, and juliascope. fix flam3-convert.
add experimental color shifting via "shift" envar. supports
finalxform. can read hex palette format. avoids the "square"
that appears from NaNs. release as 2.7b5.
01/11/06 unlimited number of xforms per flame. new variations
cylinder and perspective. rename rename de_max_filter to
estimator, de_min_filter to estimator_minimum, de_alpha
to estimator_curve, and jitters to temporal_samples.
release as 2.7b4.
11/28/05 performance optimization, fix symmetry singularities, added
bubble variation, fixed handkerchief variation, templates
apply to sequence and rotate flam3-genome commands, added
envar "name_enable" to render filenames specified in the
"name" attribute of the flame element, small bugfixes,
release as 2.7b3.
11/04/05 verbose on by default. Added 'transparency' envar for png
renders without transparency channel. Fixed non-black
background jpeg renders. add improve_colors mutation,
rewrite most of estimate_bounding_box. added new variations
blob pdjd fan2 rings2 eyefish. added '33bit' method for
32-bit floats. <edit> tags track history. alter the gamma
curve to be linear near 0 to avoid singularity and reduce
noise, set with gamma_threshold. release as v2.7b2.
09/24/05 new density estimator and temporal jitter code from Erik
Reckase (note removal of todo items above :). allow gamma,
vibrancy, contrast, pixels_per_unit, and brightness to vary
as part of the genome rather than as part of the rendering
parameters. flam3-genome does not retry when cloning. ditch
2nd color coordinates. release as v2.7b1.
06/27/05 in flam3_dimension, give up and return NaN if 90% or more of
the samples are being clipped. release v2.6.
06/22/05 add envar to control the number of tries.
06/06/05 add new form of mutation that introduces post xforms.
05/20/05 fix memory trashing bug resulting from xform overflow. put
regular xforms before symmetry in printed genomes. enforce
weights non-negative & at least one xform. remove
nan-protection from popcorn variation. truncate xforms with
very small weight.
05/13/05 fix bug reported by erik reckase where fan variation could
blow up to NaN because the domain of atan2 was not protected.
remove protection from all atan2 calls and instead detect NaN
results and replace them with noise. count really large
values as bad too to prevent blowing up to infinity. enforce
0<=hue<1, release v2.6b1.
05/05/05 report choices made during genome generation in notes
attribute. flam3_dimension no longer hangs when most of the
attractor is outside the camera. limit number of variations
produced by genetic operators to 5. reduce rate of
interpolation method of crossover.
03/17/05 put cloning back in (found by James Rantanen).
03/08/05 change sawtooth variation (incompatible!). add fan
variation. rename sawtooth to rings. release as v2.5.
03/01/05 fix rotation when nstrips > 1. add flam3_dimension(). minor
bugfixes. release as v2.4.
01/25/05 release as v2.3.
01/18/05 support post xforms (idea from eric nguyen). support camera
rotation.
12/28/04 release as v2.2.
12/27/04 preview implementation of image fractalization by adding a
color coordinate. changed how random/default color
coordinates are selected (they alternate 0 and 1 instead of
being distributed between 0 and 1). WARNING: incompatible
format change to samples argument of flam3_iterate.
12/20/04 allow mutation and crossover from files with multiple
genomes. a random genome is selected for each repetition.
12/11/04 fix bug printing out interpolated non-built-in palettes.
warn if any images sizes in animation do not match.
12/01/04 remove debugging code left in flam3-convert, thanks to Paul
Fishwick for reporting this. add cosine variation. add
sawtooth variation. handle nstrips that do not divide the
height. write partial results as strips are computed. fix
old bug where in 32 bit mode one of the terms appeared to be
calculated at 16 bits. release as v2.1.
10/28/04 fix docstring bug. release as v2.0.1.
10/28/04 renaming, cleanup, and modularization. now exports
libflam3.a and flam3.h, all names prefixed with flam3_.
binaries named with flam3- prefix, genome files use flam3
suffix. create and install a flam3.pc pkg-config file.
release as v2.0.
09/21/04 fix bug where code for integer rounding was left in 64-bit
floating point version. round remaining time up so we do not
say ETA in 0 seconds. do not use static allocation to hold
onto memory, just malloc and free what we need every frame.
enforce positive oversampling. fix bug in hqi on sequences
of images of different sizes. release as v1.15.
09/17/04 change name of envar to control jpeg compression quality from
"quality" to "jpeg". check for bad nbatches values. release
as v1.14.
08/23/04 add about 600 cmaps from Jackie, Pat Phillips, Classylady,
and BTomchek. use 64-bit (double) sized buffers. remove
white_level. add new variations: exponential & power. fix
bug where hue_rotation was left uninitialized. add clone
option to pick-flame which just applies template to the input
without modifying genome. random_control_point can now put
multiple variations in one xform. remove altivec code because
it is incompatible with 64-bit buffers. verbose (progress bar
on stderr) from Jon Morton. control random number seeds via
seed envar. support buffer sizes 16, 32, or 64 bits with
three versions of rect.c included into libifs.c.
03/28/04 fix bug interpolating between flames with different numbers
of xforms introduced by the new de/parsing. add modified
version of the popcorn variation from apophysis. fix small
bug in waves variation. make distribution of variations
even. add altivec code from R.J. Berry of warwick.ac.uk.
release as v1.13.
03/26/04 add wave variation. allow negative variational coefs. do
not truncate filter width to an integer. add fisheye
variation. make variations print by name instead of using a
vector, that is say spherical="1" instead of var="0 0 1" or
var1="2". it should still read the old format.
03/07/04 fix bug printing out result of interpolating between
symmetries. release as v1.11.
03/03/04 add new means of crossover: a random point between the
parents as defined by linear interpolation. in all kinds of
crossover, reset the color coordinates to make sure they are
spread out well. somehow lost part of the extra_attributes
patch, so put it in again. add pixel_aspect_ratio envar.
decrease filter cutoff threshold. the edges of the filter
were almost zeros, so making the filter smaller saves time
with almost no effect on the results. do not print out the
attributes of control points that have default values.
release as v1.10.
02/26/04 remove prefix argument to print_control_point, and add
extra_attributes. allow any value for vibrancy parameter.
allow variation blending coefs to have any values. do not
normalize them. on windows nstrips is computated
automatically to fit within memory (leaves at least 20%
unused). support png image format and if output is png then
compute & output alpha channel. release as v1.9.
02/01/04 add julia variation, and put bent variation back in. change
how colors are computed in presense of symmetry: xforms that
come from a symmetry do not change the color index. this
prevents the colors from washing out. since an xform may be
interpolated between a symmetry and not, this this is a
blending factor. add more documentation. add function to
compute lyapunov coefs. allow control over symmetries
produced by pick-flame. release as v1.8.
07/20/03 cleanup, update documentation, release as v1.7.
07/15/03 fix bug in interpolation where in last frame when going from
non-symmetric to symmetric it left out some xforms. drop
support for "cmap_inter". add var1 as a abbreviation to var
in xml output, and do not print trailing 0s in var string.
07/09/03 change matrix interpolation to be linear rather than complex
log to avoid the discontinuity at 180 degrees. this was
causing jumpiness in the C1 continuous algorithm. this means
that rotation has to be handled with pick-flame. put direct
support for symmetries in the de/parser to make control
points smaller and easier to understand. support
combinations of bilateral & rotational symmetry.
06/22/03 bug in colormap interpolation. release as v1.6.
06/20/03 fix some bugs, in particular remove sorting of the xforms
when control points are read. they are only sorted when they
are generated. updated dates on copyright notices. added
time parameter to anim, shorthand for begin & end being the
same. added a fairly terrible hack to allow palettes to be
specified as blending of two basic palettes. this requires
much less bandwidth than sending 256 rgb triples. in
pick-flame change default to be enclosed xml output.
06/09/03 add C1 continuous interpolation to pick-flame (suggested by
Cassidy Curtis). added new variations from Ultra Fractal
version by Mark Townsend. added symmetry xforms.
06/02/03 add convert-flame which reads the old file format and writes
the new one. release as v1.5.
03/22/03 fix bug in hqi & anim. somewhere along the way (prolly jpeg)
nstrips was broken. add qs and ss params to hqi.
discontinue strips for anim because the implementation is a
bit problematic (animating zoom??). bump version to 1.4.
03/05/03 add pick-flame.c to the project, and extend it with mutation
and crossover capability. add parse_control_points_from_file
(and use it). rename non-xml variants of de/parsers to *_old
and rename xml variants to remove _xml. add
rotate_control_point. bump version to 1.3.
02/10/03 increase CHOOSE_XFORM_GRAIN by 10x and use chars instead of
ints. remove extra -ljpeg from Makefile. lose hack that
ignored density xforms after interpolation. what was that
for?? it makes a difference, and just makes interpolation
less smooth as far as i can tell. bump version to 1.2.
01/17/03 release as v1.1.
01/16/03 support output in jpeg format; this is the default. support
win32.
01/08/03 by default don't render the last frame so that animations
dove-tail and loop
01/06/03 fix how too many xforms are detected so that one more xform
is allowed.
12/22/02 first release as independent package. release as v1.0.

896
src/aclocal.m4 vendored Normal file
View File

@ -0,0 +1,896 @@
# generated automatically by aclocal 1.10.2 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],,
[m4_warning([this file was generated for autoconf 2.63.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically `autoreconf'.])])
# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_AUTOMAKE_VERSION(VERSION)
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
# generated from the m4 files accompanying Automake X.Y.
# (This private macro should not be called outside this file.)
AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.10'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
m4_if([$1], [1.10.2], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
# _AM_AUTOCONF_VERSION(VERSION)
# -----------------------------
# aclocal traces this macro to find the Autoconf version.
# This is a private macro too. Using m4_define simplifies
# the logic in aclocal, which can simply ignore this definition.
m4_define([_AM_AUTOCONF_VERSION], [])
# AM_SET_CURRENT_AUTOMAKE_VERSION
# -------------------------------
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.10.2])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
#
# Of course, Automake must honor this variable whenever it calls a
# tool from the auxiliary directory. The problem is that $srcdir (and
# therefore $ac_aux_dir as well) can be either absolute or relative,
# depending on how configure is run. This is pretty annoying, since
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
# source directory, any form will work fine, but in subdirectories a
# relative path needs to be adjusted first.
#
# $ac_aux_dir/missing
# fails when called from a subdirectory if $ac_aux_dir is relative
# $top_srcdir/$ac_aux_dir/missing
# fails if $ac_aux_dir is absolute,
# fails when called from a subdirectory in a VPATH build with
# a relative $ac_aux_dir
#
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
# are both prefixed by $srcdir. In an in-source build this is usually
# harmless because $srcdir is `.', but things will broke when you
# start a VPATH build or use an absolute $srcdir.
#
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
# and then we would define $MISSING as
# MISSING="\${SHELL} $am_aux_dir/missing"
# This will work as long as MISSING is not called from configure, because
# unfortunately $(top_srcdir) has no meaning in configure.
# However there are other variables, like CC, which are often used in
# configure, and could therefore not use this "fixed" $ac_aux_dir.
#
# Another solution, used here, is to always expand $ac_aux_dir to an
# absolute PATH. The drawback is that using absolute paths prevent a
# configured tree to be moved without reconfiguration.
AC_DEFUN([AM_AUX_DIR_EXPAND],
[dnl Rely on autoconf to set up CDPATH properly.
AC_PREREQ([2.50])dnl
# expand $ac_aux_dir to an absolute path
am_aux_dir=`cd $ac_aux_dir && pwd`
])
# AM_CONDITIONAL -*- Autoconf -*-
# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 8
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
# -------------------------------------
# Define a conditional.
AC_DEFUN([AM_CONDITIONAL],
[AC_PREREQ(2.52)dnl
ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
AC_SUBST([$1_TRUE])dnl
AC_SUBST([$1_FALSE])dnl
_AM_SUBST_NOTMAKE([$1_TRUE])dnl
_AM_SUBST_NOTMAKE([$1_FALSE])dnl
if $2; then
$1_TRUE=
$1_FALSE='#'
else
$1_TRUE='#'
$1_FALSE=
fi
AC_CONFIG_COMMANDS_PRE(
[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
AC_MSG_ERROR([[conditional "$1" was never defined.
Usually this means the macro was only invoked conditionally.]])
fi])])
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 9
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
# _AM_DEPENDENCIES(NAME)
# ----------------------
# See how the compiler implements dependency checking.
# NAME is "CC", "CXX", "GCJ", or "OBJC".
# We try a few techniques and use that to set a single cache variable.
#
# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
# dependency, and given that the user is not expected to run this macro,
# just rely on AC_PROG_CC.
AC_DEFUN([_AM_DEPENDENCIES],
[AC_REQUIRE([AM_SET_DEPDIR])dnl
AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
AC_REQUIRE([AM_MAKE_INCLUDE])dnl
AC_REQUIRE([AM_DEP_TRACK])dnl
ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
[$1], CXX, [depcc="$CXX" am_compiler_list=],
[$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
[$1], UPC, [depcc="$UPC" am_compiler_list=],
[$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
[depcc="$$1" am_compiler_list=])
AC_CACHE_CHECK([dependency style of $depcc],
[am_cv_$1_dependencies_compiler_type],
[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
cp "$am_depcomp" conftest.dir
cd conftest.dir
# We will build objects and dependencies in a subdirectory because
# it helps to detect inapplicable dependency modes. For instance
# both Tru64's cc and ICC support -MD to output dependencies as a
# side effect of compilation, but ICC will put the dependencies in
# the current directory while Tru64 will put them in the object
# directory.
mkdir sub
am_cv_$1_dependencies_compiler_type=none
if test "$am_compiler_list" = ""; then
am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
fi
for depmode in $am_compiler_list; do
# Setup a source with many dependencies, because some compilers
# like to wrap large dependency lists on column 80 (with \), and
# we should not choose a depcomp mode which is confused by this.
#
# We need to recreate these files for each test, as the compiler may
# overwrite some of them when testing with obscure command lines.
# This happens at least with the AIX C compiler.
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
# Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
# Solaris 8's {/usr,}/bin/sh.
touch sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
case $depmode in
nosideeffect)
# after this tag, mechanisms are not by side-effect, so they'll
# only be used when explicitly requested
if test "x$enable_dependency_tracking" = xyes; then
continue
else
break
fi
;;
none) break ;;
esac
# We check with `-c' and `-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
# handle `-M -o', and we need to detect this.
if depmode=$depmode \
source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
$SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
>/dev/null 2>conftest.err &&
grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
${MAKE-make} -s -f confmf > /dev/null 2>&1; then
# icc doesn't choke on unknown options, it will just issue warnings
# or remarks (even with -Werror). So we grep stderr for any message
# that says an option was ignored or not supported.
# When given -MP, icc 7.0 and 7.1 complain thusly:
# icc: Command line warning: ignoring option '-M'; no argument required
# The diagnosis changed in icc 8.0:
# icc: Command line remark: option '-MP' not supported
if (grep 'ignoring option' conftest.err ||
grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
am_cv_$1_dependencies_compiler_type=$depmode
break
fi
fi
done
cd ..
rm -rf conftest.dir
else
am_cv_$1_dependencies_compiler_type=none
fi
])
AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
AM_CONDITIONAL([am__fastdep$1], [
test "x$enable_dependency_tracking" != xno \
&& test "$am_cv_$1_dependencies_compiler_type" = gcc3])
])
# AM_SET_DEPDIR
# -------------
# Choose a directory name for dependency files.
# This macro is AC_REQUIREd in _AM_DEPENDENCIES
AC_DEFUN([AM_SET_DEPDIR],
[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
])
# AM_DEP_TRACK
# ------------
AC_DEFUN([AM_DEP_TRACK],
[AC_ARG_ENABLE(dependency-tracking,
[ --disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors])
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
AC_SUBST([AMDEPBACKSLASH])dnl
_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
])
# Generate code to set up dependency tracking. -*- Autoconf -*-
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
#serial 5
# _AM_OUTPUT_DEPENDENCY_COMMANDS
# ------------------------------
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
[{
# Autoconf 2.62 quotes --file arguments for eval, but not when files
# are listed without --file. Let's play safe and only enable the eval
# if we detect the quoting.
case $CONFIG_FILES in
*\'*) eval set x "$CONFIG_FILES" ;;
*) set x $CONFIG_FILES ;;
esac
shift
for mf
do
# Strip MF so we end up with the name of the file.
mf=`echo "$mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile or not.
# We used to match only the files named `Makefile.in', but
# some people rename them; so instead we look at the file content.
# Grep'ing the first line is not enough: some people post-process
# each Makefile.in and add a new line on top of each file to say so.
# Grep'ing the whole file is not good either: AIX grep has a line
# limit of 2048, but all sed's we know have understand at least 4000.
if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
dirpart=`AS_DIRNAME("$mf")`
else
continue
fi
# Extract the definition of DEPDIR, am__include, and am__quote
# from the Makefile without running `make'.
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
test -z "$DEPDIR" && continue
am__include=`sed -n 's/^am__include = //p' < "$mf"`
test -z "am__include" && continue
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
# When using ansi2knr, U may be empty or an underscore; expand it
U=`sed -n 's/^U = //p' < "$mf"`
# Find all dependency output files, they are included files with
# $(DEPDIR) in their names. We invoke sed twice because it is the
# simplest approach to changing $(DEPDIR) to its actual value in the
# expansion.
for file in `sed -n "
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`AS_DIRNAME(["$file"])`
AS_MKDIR_P([$dirpart/$fdir])
# echo "creating $dirpart/$file"
echo '# dummy' > "$dirpart/$file"
done
done
}
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
# AM_OUTPUT_DEPENDENCY_COMMANDS
# -----------------------------
# This macro should only be invoked once -- use via AC_REQUIRE.
#
# This code is only required when automatic dependency tracking
# is enabled. FIXME. This creates each `.P' file that we will
# need in order to bootstrap the dependency handling code.
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
[AC_CONFIG_COMMANDS([depfiles],
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
])
# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 8
# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
# Do all the work for Automake. -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2008 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 13
# This macro actually does too much. Some checks are only needed if
# your package does certain things. But this isn't really a big deal.
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
# AM_INIT_AUTOMAKE([OPTIONS])
# -----------------------------------------------
# The call with PACKAGE and VERSION arguments is the old style
# call (pre autoconf-2.50), which is being phased out. PACKAGE
# and VERSION should now be passed to AC_INIT and removed from
# the call to AM_INIT_AUTOMAKE.
# We support both call styles for the transition. After
# the next Automake release, Autoconf can make the AC_INIT
# arguments mandatory, and then we can depend on a new Autoconf
# release and drop the old call support.
AC_DEFUN([AM_INIT_AUTOMAKE],
[AC_PREREQ([2.60])dnl
dnl Autoconf wants to disallow AM_ names. We explicitly allow
dnl the ones we care about.
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
AC_REQUIRE([AC_PROG_INSTALL])dnl
if test "`cd $srcdir && pwd`" != "`pwd`"; then
# Use -I$(srcdir) only when $(srcdir) != ., so that make's output
# is not polluted with repeated "-I."
AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
# test to see if srcdir already configured
if test -f $srcdir/config.status; then
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
fi
fi
# test whether we have cygpath
if test -z "$CYGPATH_W"; then
if (cygpath --version) >/dev/null 2>/dev/null; then
CYGPATH_W='cygpath -w'
else
CYGPATH_W=echo
fi
fi
AC_SUBST([CYGPATH_W])
# Define the identity of the package.
dnl Distinguish between old-style and new-style calls.
m4_ifval([$2],
[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
AC_SUBST([PACKAGE], [$1])dnl
AC_SUBST([VERSION], [$2])],
[_AM_SET_OPTIONS([$1])dnl
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
_AM_IF_OPTION([no-define],,
[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
# Some tools Automake needs.
AC_REQUIRE([AM_SANITY_CHECK])dnl
AC_REQUIRE([AC_ARG_PROGRAM])dnl
AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
AM_MISSING_PROG(AUTOCONF, autoconf)
AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
AM_MISSING_PROG(AUTOHEADER, autoheader)
AM_MISSING_PROG(MAKEINFO, makeinfo)
AM_PROG_INSTALL_SH
AM_PROG_INSTALL_STRIP
AC_REQUIRE([AM_PROG_MKDIR_P])dnl
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
[_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
[_AM_PROG_TAR([v7])])])
_AM_IF_OPTION([no-dependencies],,
[AC_PROVIDE_IFELSE([AC_PROG_CC],
[_AM_DEPENDENCIES(CC)],
[define([AC_PROG_CC],
defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_CXX],
[_AM_DEPENDENCIES(CXX)],
[define([AC_PROG_CXX],
defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_OBJC],
[_AM_DEPENDENCIES(OBJC)],
[define([AC_PROG_OBJC],
defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
])
])
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. The stamp files are numbered to have different names.
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
# loop where config.status creates the headers, so we can generate
# our stamp files there.
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
[# Compute $1's index in $config_headers.
_am_arg=$1
_am_stamp_count=1
for _am_header in $config_headers :; do
case $_am_header in
$_am_arg | $_am_arg:* )
break ;;
* )
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
esac
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_INSTALL_SH
# ------------------
# Define $install_sh.
AC_DEFUN([AM_PROG_INSTALL_SH],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 2
# Check whether the underlying file-system supports filenames
# with a leading dot. For instance MS-DOS doesn't.
AC_DEFUN([AM_SET_LEADING_DOT],
[rm -rf .tst 2>/dev/null
mkdir .tst 2>/dev/null
if test -d .tst; then
am__leading_dot=.
else
am__leading_dot=_
fi
rmdir .tst 2>/dev/null
AC_SUBST([am__leading_dot])])
# Check to see how 'make' treats includes. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 3
# AM_MAKE_INCLUDE()
# -----------------
# Check to see how make treats includes.
AC_DEFUN([AM_MAKE_INCLUDE],
[am_make=${MAKE-make}
cat > confinc << 'END'
am__doit:
@echo done
.PHONY: am__doit
END
# If we don't find an include directive, just comment out the code.
AC_MSG_CHECKING([for style of include used by $am_make])
am__include="#"
am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
# We grep out `Entering directory' and `Leaving directory'
# messages which can occur if `w' ends up in MAKEFLAGS.
# In particular we don't look at `^make:' because GNU make might
# be invoked under some other name (usually "gmake"), in which
# case it prints its new name instead of `make'.
if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
am__include=include
am__quote=
_am_result=GNU
fi
# Now try BSD make style include.
if test "$am__include" = "#"; then
echo '.include "confinc"' > confmf
if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
am__include=.include
am__quote="\""
_am_result=BSD
fi
fi
AC_SUBST([am__include])
AC_SUBST([am__quote])
AC_MSG_RESULT([$_am_result])
rm -f confinc confmf
])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 5
# AM_MISSING_PROG(NAME, PROGRAM)
# ------------------------------
AC_DEFUN([AM_MISSING_PROG],
[AC_REQUIRE([AM_MISSING_HAS_RUN])
$1=${$1-"${am_missing_run}$2"}
AC_SUBST($1)])
# AM_MISSING_HAS_RUN
# ------------------
# Define MISSING if not defined so far and test if it supports --run.
# If it does, set am_missing_run to use it, otherwise, to nothing.
AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
AC_REQUIRE_AUX_FILE([missing])dnl
test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
# Use eval to expand $SHELL
if eval "$MISSING --run true"; then
am_missing_run="$MISSING --run "
else
am_missing_run=
AC_MSG_WARN([`missing' script is too old or missing])
fi
])
# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_MKDIR_P
# ---------------
# Check for `mkdir -p'.
AC_DEFUN([AM_PROG_MKDIR_P],
[AC_PREREQ([2.60])dnl
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
dnl while keeping a definition of mkdir_p for backward compatibility.
dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
dnl Makefile.ins that do not define MKDIR_P, so we do our own
dnl adjustment using top_builddir (which is defined more often than
dnl MKDIR_P).
AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
case $mkdir_p in
[[\\/$]]* | ?:[[\\/]]*) ;;
*/*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
esac
])
# Helper functions for option handling. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
# _AM_MANGLE_OPTION(NAME)
# -----------------------
AC_DEFUN([_AM_MANGLE_OPTION],
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
# _AM_SET_OPTION(NAME)
# ------------------------------
# Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION],
[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
# _AM_SET_OPTIONS(OPTIONS)
# ----------------------------------
# OPTIONS is a space-separated list of Automake options.
AC_DEFUN([_AM_SET_OPTIONS],
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
# -------------------------------------------
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
# Check to make sure that the build environment is sane. -*- Autoconf -*-
# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
[AC_MSG_CHECKING([whether build environment is sane])
# Just in case
sleep 1
echo timestamp > conftest.file
# Do `set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
if test "$[*]" = "X"; then
# -L didn't work.
set X `ls -t $srcdir/configure conftest.file`
fi
rm -f conftest.file
if test "$[*]" != "X $srcdir/configure conftest.file" \
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
# If neither matched, then we have a broken ls. This can happen
# if, for instance, CONFIG_SHELL is bash and it inherits a
# broken ls alias from the environment. This has actually
# happened. Such a system could not be considered "sane".
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
alias in your environment])
fi
test "$[2]" = conftest.file
)
then
# Ok.
:
else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
AC_MSG_RESULT(yes)])
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_INSTALL_STRIP
# ---------------------
# One issue with vendor `install' (even GNU) is that you can't
# specify the program used to strip binaries. This is especially
# annoying in cross-compiling environments, where the build's strip
# is unlikely to handle the host's binaries.
# Fortunately install-sh will honor a STRIPPROG variable, so we
# always use install-sh in `make install-strip', and initialize
# STRIPPROG with the value of the STRIP variable (set by the user).
AC_DEFUN([AM_PROG_INSTALL_STRIP],
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
# Installed binaries are usually stripped using `strip' when the user
# run `make install-strip'. However `strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
# will honor the `STRIP' environment variable to overrule this program.
dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
if test "$cross_compiling" != no; then
AC_CHECK_TOOL([STRIP], [strip], :)
fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
# Copyright (C) 2006 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# _AM_SUBST_NOTMAKE(VARIABLE)
# ---------------------------
# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
# This macro is traced by Automake.
AC_DEFUN([_AM_SUBST_NOTMAKE])
# Check how to create a tarball. -*- Autoconf -*-
# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 2
# _AM_PROG_TAR(FORMAT)
# --------------------
# Check how to create a tarball in format FORMAT.
# FORMAT should be one of `v7', `ustar', or `pax'.
#
# Substitute a variable $(am__tar) that is a command
# writing to stdout a FORMAT-tarball containing the directory
# $tardir.
# tardir=directory && $(am__tar) > result.tar
#
# Substitute a variable $(am__untar) that extract such
# a tarball read from stdin.
# $(am__untar) < result.tar
AC_DEFUN([_AM_PROG_TAR],
[# Always define AMTAR for backward compatibility.
AM_MISSING_PROG([AMTAR], [tar])
m4_if([$1], [v7],
[am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
[m4_case([$1], [ustar],, [pax],,
[m4_fatal([Unknown tar format])])
AC_MSG_CHECKING([how to create a $1 tar archive])
# Loop over all known methods to create a tar archive until one works.
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
# Do not fold the above two line into one, because Tru64 sh and
# Solaris sh will not grok spaces in the rhs of `-'.
for _am_tool in $_am_tools
do
case $_am_tool in
gnutar)
for _am_tar in tar gnutar gtar;
do
AM_RUN_LOG([$_am_tar --version]) && break
done
am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
am__untar="$_am_tar -xf -"
;;
plaintar)
# Must skip GNU tar: if it does not support --format= it doesn't create
# ustar tarball either.
(tar --version) >/dev/null 2>&1 && continue
am__tar='tar chf - "$$tardir"'
am__tar_='tar chf - "$tardir"'
am__untar='tar xf -'
;;
pax)
am__tar='pax -L -x $1 -w "$$tardir"'
am__tar_='pax -L -x $1 -w "$tardir"'
am__untar='pax -r'
;;
cpio)
am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
am__untar='cpio -i -H $1 -d'
;;
none)
am__tar=false
am__tar_=false
am__untar=false
;;
esac
# If the value was cached, stop now. We just wanted to have am__tar
# and am__untar set.
test -n "${am_cv_prog_tar_$1}" && break
# tar/untar a dummy directory, and stop if the command works
rm -rf conftest.dir
mkdir conftest.dir
echo GrepMe > conftest.dir/file
AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
rm -rf conftest.dir
if test -s conftest.tar; then
AM_RUN_LOG([$am__untar <conftest.tar])
grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
fi
done
rm -rf conftest.dir
AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
AC_MSG_RESULT([$am_cv_prog_tar_$1])])
AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
m4_include([m4/libtool.m4])
m4_include([m4/ltoptions.m4])
m4_include([m4/ltsugar.m4])
m4_include([m4/ltversion.m4])
m4_include([m4/lt~obsolete.m4])

138
src/animate.dsp Normal file
View File

@ -0,0 +1,138 @@
# Microsoft Developer Studio Project File - Name="anim" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=anim - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "animate.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "animate.mak" CFG="anim - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "anim - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "anim - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "anim - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "c:\src\libpng" /I "c:\src\zlib" /I "c:\src\libxml2\include" /I "c:\src\jpeg" /I "c:\src\iconv\include" /I "c:\src\pthreads" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /Zm1000 /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\src\jpeg\libjpeg.lib c:\src\libpng\libpng.lib c:\src\libxml2\lib\libxml2.lib c:\src\zlib\zlib.lib c:\src\pthreads\pthreadVC2.lib /nologo /subsystem:console /machine:I386 /out:"Release/flam3-animate.exe"
!ELSEIF "$(CFG)" == "anim - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "c:\src\jpeg" /I "c:\src\libpng" /I "c:\src\zlib" /I "c:\src\libxml2\include" /I "c:\src\iconv\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /Zm1000 /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\src\jpeg\libjpeg.lib c:\src\libpng\libpng.lib c:\src\libxml2\lib\libxml2.lib c:\src\zlib\zlib.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "anim - Win32 Release"
# Name "anim - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\docstring.c
# End Source File
# Begin Source File
SOURCE=".\flam3-animate.c"
# End Source File
# Begin Source File
SOURCE=".\flam3-palettes.c"
# End Source File
# Begin Source File
SOURCE=.\flam3.c
# End Source File
# Begin Source File
SOURCE=.\isaac.c
# End Source File
# Begin Source File
SOURCE=.\jpeg.c
# End Source File
# Begin Source File
SOURCE=.\png.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=config.h
# End Source File
# Begin Source File
SOURCE=.\jpeg.h
# End Source File
# Begin Source File
SOURCE=rect.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

1516
src/config.guess vendored Executable file

File diff suppressed because it is too large Load Diff

89
src/config.h.in Normal file
View File

@ -0,0 +1,89 @@
/* config.h.in. Generated from configure.in by autoheader. */
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Have 64-bit __sync_bool_compare_and_swap() and friends. */
#undef HAVE_GCC_64BIT_ATOMIC_OPS
/* Have 32-bit __sync_bool_compare_and_swap() and friends. */
#undef HAVE_GCC_ATOMIC_OPS
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the `jpeg' library (-ljpeg). */
#undef HAVE_LIBJPEG
/* Define to 1 if you have the `png' library (-lpng). */
#undef HAVE_LIBPNG
/* Define to 1 if you have the `pthread' library (-lpthread). */
#undef HAVE_LIBPTHREAD
/* Define to 1 if you have the `xml2' library (-lxml2). */
#undef HAVE_LIBXML2
/* Define to 1 if you have the `z' library (-lz). */
#undef HAVE_LIBZ
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#undef LT_OBJDIR
/* Name of package */
#undef PACKAGE
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#undef TIME_WITH_SYS_TIME
/* Version number of package */
#undef VERSION
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t

1626
src/config.sub vendored Executable file

File diff suppressed because it is too large Load Diff

14453
src/configure vendored Executable file

File diff suppressed because it is too large Load Diff

84
src/configure.in Normal file
View File

@ -0,0 +1,84 @@
dnl $Id: configure.in,v 1.42 2008-07-21 18:51:56 spotspot Exp $
dnl Process this file with autoconf to produce a configure script.
AC_INIT(flam3-animate.c)
AM_CONFIG_HEADER(config.h)
AC_ARG_ENABLE(pthread, [ --enable-pthread compile FLAM3 with threads enabled (default=yes)])
AC_ARG_ENABLE(atomic_ops, [ --enable-atomic-ops compile FLAM3 with atom ops enabled (default=yes, independently checks for 32 and 64 bit sizes)])
AM_INIT_AUTOMAKE(flam3,"2.8b7")
AC_CONFIG_MACRO_DIR([m4])
# Save CFLAGS from the environment
save_CFLAGS=$CFLAGS
AC_PROG_CC
CFLAGS=$save_CFLAGS
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AM_DISABLE_SHARED
AC_PROG_LIBTOOL
AC_HEADER_STDC
AC_C_CONST
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_CHECK_LIB([z],[deflateInit_],,[AC_MSG_ERROR([zlib is required.])])
AC_CHECK_LIB([png],[png_write_image],,[AC_MSG_ERROR([The png library is required.])])
AC_CHECK_LIB([xml2],[xmlParseFile],,[AC_MSG_ERROR([The xml2 library is required.])])
if test "${enable_atomic_ops}" = "" ; then
enable_atomic_ops=yes
fi
if test "${enable_atomic_ops}" = "yes" ; then
AC_MSG_CHECKING([whether $CC knows 32-bit __sync_bool_compare_and_swap()])
AC_LANG_CONFTEST([#include <stdint.h>
int main() { uint32_t a = 4;
__sync_bool_compare_and_swap(&a, 4, 5); }])
$CC conftest.c $CFLAGS -o conftest > /dev/null 2> /dev/null
ret=$?
rm -f conftest.o conftest
if test $ret -eq 0 ; then
AC_DEFINE([HAVE_GCC_ATOMIC_OPS], 1, [Have 32-bit __sync_bool_compare_and_swap() and friends.])
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no - try specifying CFLAGS=-march={your_arch}])
fi
AC_MSG_CHECKING([whether $CC knows 64-bit __sync_bool_compare_and_swap()])
AC_LANG_CONFTEST([#include <stdint.h>
int main() { uint64_t a = 4; __sync_bool_compare_and_swap(&a, 4, 5); }])
$CC conftest.c $CFLAGS -o conftest > /dev/null 2> /dev/null
ret=$?
rm -f conftest.o conftest
if test $ret -eq 0 ; then
AC_DEFINE([HAVE_GCC_64BIT_ATOMIC_OPS], 1, [Have 64-bit __sync_bool_compare_and_swap() and friends.])
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no - try specifying CFLAGS=-march={your_arch}])
fi
fi
if test "${enable_pthread}" = "" ; then
enable_pthread=yes
fi
if test "${enable_pthread}" = "yes" ; then
AC_CHECK_LIB([pthread],[pthread_create],,[AC_MSG_WARN([Pthread library not found - threads disabled.])])
fi
AC_CHECK_LIB([jpeg],[jpeg_start_compress],,[AC_MSG_ERROR([The jpeg library is required.])])
AC_PATH_PROG(XML2_CONFIG,xml2-config, no, $PATH:/bin:/usr/bin:/usr/local/bin)
if test "$XML2_CONFIG" != "no"
then
CPPFLAGS="`$XML2_CONFIG --cflags` $CPPFLAGS"
fi
AC_OUTPUT([
Makefile
flam3.pc
])

146
src/convert.dsp Normal file
View File

@ -0,0 +1,146 @@
# Microsoft Developer Studio Project File - Name="convert" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=convert - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "convert.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "convert.mak" CFG="convert - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "convert - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "convert - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "convert - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "c:\src\libxml2\include" /I "c:\src\jpeg" /I "c:\src\iconv\include" /I "c:\src\pthreads" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /Zm1000 /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 c:\src\expat\expat.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\src\jpeg\libjpeg.lib c:\src\libpng\libpng.lib c:\src\libxml2\lib\libxml2.lib c:\src\zlib\zlib.lib c:\src\pthreads\pthreadVC2.lib /nologo /subsystem:console /machine:I386 /out:"Release/flam3-convert.exe"
!ELSEIF "$(CFG)" == "convert - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "c:\src\expat\xmlparse" /I "c:\src\jpeg" /I "c:\src\libxml2\include" /I "c:\src\iconv\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\src\expat\expat.lib c:\src\jpeg\libjpeg.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "convert - Win32 Release"
# Name "convert - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\docstring.c
# End Source File
# Begin Source File
SOURCE=".\flam3-convert.c"
# End Source File
# Begin Source File
SOURCE=".\flam3-palettes.c"
# End Source File
# Begin Source File
SOURCE=.\flam3.c
# End Source File
# Begin Source File
SOURCE=.\isaac.c
# End Source File
# Begin Source File
SOURCE=.\jpeg.c
# End Source File
# Begin Source File
SOURCE=.\png.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=cmap.h
# End Source File
# Begin Source File
SOURCE=config.h
# End Source File
# Begin Source File
SOURCE=jpeg.h
# End Source File
# Begin Source File
SOURCE=libifs.h
# End Source File
# Begin Source File
SOURCE=rect.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

206
src/docstring.c Normal file
View File

@ -0,0 +1,206 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include "flam3.h"
static char *the_docstring0 =
"FLAM3 - cosmic recursive fractal flames version ";
static char *the_docstring1 =
"\n\n"
"This software is licensed under the GPL. You should have access\n"
"to the source code; see http://www.fsf.org/licenses/gpl.html.\n"
"\n"
"This is free software to render fractal flames as described on\n"
"http://flam3.com. Flam3-animate makes animations, and flam3-render\n"
"makes still images. Flam3-genome creates and manipulates genomes\n"
"(parameter sets). A C library is also installed.\n"
"\n"
"Note: the following instructions are written for Linux users. Windows\n"
"users may have to install the cygwin package to get the \"env\"\n"
"command or set the envars in your windows command prompt manually.\n"
"That means instead of a command like\n"
"\n"
" env dtime=5 prefix=foo. in=test.flame flam3-animate\n"
"\n"
"say\n"
"\n"
" set dtime=5\n"
" set prefix=foo.\n"
" set in=test.flame\n"
" flam3-animate\n"
"\n"
"\n"
"envar default meaning\n"
"===== ======= =======\n"
"prefix (empty) prefix names of output files with this string.\n"
"begin j time of first frame to render (j=first time specified in file) (animate only)\n"
"end n-1 time of last frame to render (n=last time specified in the input file) (animate only)\n"
"time NA time of first and last frame (ie do one frame) (animate only)\n"
"frame NA synonym for \"time\" (animate only)\n"
"in stdin name of input file\n"
"out NA name of output file (bad idea if rending more than one, use prefix instead)\n"
"template NA apply defaults based on this genome (genome only)\n"
"dtime 1 time between frames (animate only)\n"
"fields 0 if 1 then render fields, ie odd scanlines at time+0.5\n"
"nstrips 1 number of strips, ie render fractions of a frame at once (render only)\n"
"qs 1 quality scale, multiply quality of all frames by this\n"
"ss 1 size scale, multiply size (in pixels) of all frames by this\n"
"jpeg NA jpeg quality for compression, default is native jpeg default\n"
"format png jpg or ppm or png\n"
"pixel_aspect 1.0 aspect ratio of pixels (width over height), eg 0.90909 for NTSC\n"
"seed random integer seed for random numbers, defaults to time+pid\n"
"isaac_seed random character-based seed for iteration loop randomness, defaults to time\n"
"nthreads 0 number of threads to use for render. default auto-detects.\n"
"verbose 0 if non-zero then print progress meter on stderr\n"
"bits 33 also 32 or 64: sets bit-width of internal buffers (33 means 32-bit floating-point)\n"
"bpc 8 bits per color channel: png supports 16, all others are 8 only (render/animate)\n"
"image filename replace palette with png, jpg, or ppm image\n"
"use_vars -1 comma separated list of variation #'s to use when generating a random flame (genome only)\n"
"dont_use_vars NA comma separated list of variation #'s to NOT use when generating a random flame (genome only)\n"
"cross0 NA randomly select one genome from this file to genetically cross (genome only)\n"
"cross1 NA with one genome from this file (genome only)\n"
"method NA method used for genetic cross: alternate, interpolate, or union. (genome only)\n"
"mutate NA randomly mutate a random genome from this file (genome only)\n"
"symmetry NA set symmetry of result. (genome only)\n"
"clone NA clone random flame in input (genome only)\n"
"clone_all NA clones all flames in file. useful for applying template to all flames (genome only)\n"
"animate NA interpolates between all flames in a file, using times specified in file (genome only)\n"
"sequence NA 360 degree rotation 'loops' times of each control point plus rotating transitions (genome only)\n"
"loops NA number of times to rotate each control point in sequence (genome only)\n"
"tries 50 number of tries to make to find a good genome. (genome only)\n"
"strip NA strip input, frame and nframes control which one. (genome only)\n"
"transparency 0 make bknd transparent, if format supports it (render/animate)\n"
"name_enable 0 use 'name' attr in <flame> to name image output if present (render only)\n"
"nick \"\" nickname to use in <edit> tags / img comments\n"
"url \"\" url to use in <edit> tags / img comments\n"
"id \"\" ID to use in <edit> tags\n"
"comment \"\" comment string for <edit> tags (genome only)\n"
"use_mem auto floating point number of bytes of memory to use (render only)\n"
"write_genome 0 write out genome associated with center of motion blur window (animate only)\n"
"noedits unset omit edit tags from output (genome only)\n"
"print_edit_depth 0 depth to truncate <edit> tag structure. 0 prints all <edit> tags (genome only)\n"
"intpalette unset round palette entries for importing into older Apophysis versions (genome only)\n"
"insert_palette unset insert the palette into the image.\n"
"enable_jpeg_comments 1 enables comments in the jpeg header (render and animate)\n"
"enable_png_comments 1 enables comments in the png header (render and animate)\n"
"\n"
"New in 2.8:\n"
"earlyclip 0 enables the early clipping of rgb values for better antialiasing and resizing\n"
" defaults to 0 for backwards compatibility\n"
"flam27 0 flam3 2.7 compatibility mode; ensures generated genomes can be used by flam3 2.7.18\n"
"stagger 0 affects simultaneity of xform interpolation during genome interpolation.\n"
" represents how 'separate' the xforms are interpolated. set to 1 for each\n"
" xform to be interpolated individually, fractions control interp overlap.\n"
"\n"
"for example:\n"
"\n"
" env dtime=5 prefix=foo. in=test.flam3 flam3-animate\n"
"\n"
"means to render every 5th frame of parameter file foo.flam3, and store\n"
"the results in files named foo.XXXX.jpg.\n"
"\n"
"the flam3-convert program reads from stdin the old format created by\n"
"the GIMP and writes to stdout the new xml format.\n"
"\n"
"the flam3-genome program creates random parameter files. it also mutates,\n"
"rotates, and interpolates existing parameter files. for example to\n"
"create 10 wholly new control points and render them at normal quality:\n"
"\n"
" env template=vidres.flam3 repeat=10 flam3-genome > new.flam3\n"
" flam3-render < new.flam3\n"
"\n"
"if you left out the \"template=vidres.flam3\" part then the size,\n"
"quality, etc parameters would be their default (small) values. you\n"
"can set the symmetry group:\n"
"\n"
" env template=vidres.flam3 symmetry=3 flam3-genome > new3.flam3\n"
" env template=vidres.flam3 symmetry=-2 flam3-genome > new-2.flam3\n"
" flam3-render < new3.flam3\n"
" flam3-render < new-2.flam3\n"
"\n"
"Mutation is done by giving an input flame file to alter:\n"
"\n"
" env template=vidres.flam3 flam3-genome > parent.flam3\n"
" env prefix=parent. flam3-render < parent.flam3\n"
" env template=vidres.flam3 mutate=parent.flam3 repeat=10 flam3-genome > mutation.flam3\n"
" flam3-render < mutation.flam3\n"
"\n"
"Normally one wouldn't use the same file for the template and the file\n"
"to mutate. Crossover is handled similarly:\n"
"\n"
" env template=vidres.flam3 flam3-genome > parent0.flam3\n"
" env prefix=parent0. flam3-render < parent0.flam3\n"
" env template=vidres.flam3 flam3-genome > parent1.flam3\n"
" env prefix=parent1. flam3-render < parent1.flam3\n"
" env template=vidres.flam3 cross0=parent0.flam3 cross1=parent1.flam3 flam3-genome > crossover.flam3\n"
" flam3-render < crossover.flam3\n"
"\n"
"flam3-genome has 3 ways to produce parameter files for animation in\n"
"the style of electric sheep. the highest level and most useful from\n"
"the command line is the sequence method. it takes a collection of\n"
"control points and makes an animation that has each flame do fractal\n"
"rotation for 360 degrees, then make a smooth transition to the next.\n"
"for example:\n"
"\n"
" env sequence=test.flam3 nframes=20 flam3-genome > seq.flam3\n"
" flam3-animate < seq.flam3\n"
"\n"
"creates and renders a 60 frame animation. there are two flames in\n"
"test.flam3, so the animation consists three stags: the first one\n"
"rotating, then a transition, then the second one rotating. each stage\n"
"has 20 frames as specified on the command line. if you want to\n"
"render only some fraction of a whole animation file, specify the begin\n"
"and end times:\n"
"\n"
" env begin=20 end=40 flam3-animate < seq.flam3\n"
"\n"
"the other two methods are harder to use becaues they produce files that\n"
"are only good for one frame of animation. the output consists of 3\n"
"control points, one for the time requested, one before and one after.\n"
"that allows proper motion blur. for example:\n"
"\n"
" env template=vidres.flam3 flam3-genome > rotme.flam3\n"
" env rotate=rotme.flam3 frame=10 nframes=20 flam3-genome > rot10.flam3\n"
" env frame=10 flam3-animate < rot10.flam3\n"
"\n"
"the file rot10.flam3 specifies the animation for just one frame, in\n"
"this case 10 out of 20 frames in the complete animation. C1\n"
"continuous electric sheep genetic crossfades are created like this:\n"
"\n"
" env inter=test.flam3 frame=10 nframes=20 flam3-genome > inter10.flam3\n"
" env frame=10 flam3-animate < inter10.flam3\n"
"\n"
"see http://flam3.com/flame.pdf for descriptions & formulas, and\n"
"see http://electricsheep.wikispaces.com/Variations for updates.\n"
"\n"
"The complete list of variations:\n"
;
void docstring() {
int i;
fputs(the_docstring0, stdout);
fputs(flam3_version(), stdout);
fputs(the_docstring1, stdout);
for (i = 0; i < flam3_nvariations; i++)
printf(" %2d. %s\n", i, flam3_variation_names[i]);
}

490
src/filters.c Normal file
View File

@ -0,0 +1,490 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "filters.h"
/*
* filter function definitions
* from Graphics Gems III code
* and ImageMagick resize.c
*/
double flam3_spatial_support[flam3_num_spatialfilters] = {
1.5, /* gaussian */
1.0, /* hermite */
0.5, /* box */
1.0, /* triangle */
1.5, /* bell */
2.0, /* b spline */
2.0, /* mitchell */
1.0, /* blackman */
2.0, /* catrom */
1.0, /* hanning */
1.0, /* hamming */
3.0, /* lanczos3 */
2.0, /* lanczos2 */
1.5 /* quadratic */
};
double flam3_hermite_filter(double t) {
/* f(t) = 2|t|^3 - 3|t|^2 + 1, -1 <= t <= 1 */
if(t < 0.0) t = -t;
if(t < 1.0) return((2.0 * t - 3.0) * t * t + 1.0);
return(0.0);
}
double flam3_box_filter(double t) {
if((t > -0.5) && (t <= 0.5)) return(1.0);
return(0.0);
}
double flam3_triangle_filter(double t) {
if(t < 0.0) t = -t;
if(t < 1.0) return(1.0 - t);
return(0.0);
}
double flam3_bell_filter(double t) {
/* box (*) box (*) box */
if(t < 0) t = -t;
if(t < .5) return(.75 - (t * t));
if(t < 1.5) {
t = (t - 1.5);
return(.5 * (t * t));
}
return(0.0);
}
double flam3_b_spline_filter(double t) {
/* box (*) box (*) box (*) box */
double tt;
if(t < 0) t = -t;
if(t < 1) {
tt = t * t;
return((.5 * tt * t) - tt + (2.0 / 3.0));
} else if(t < 2) {
t = 2 - t;
return((1.0 / 6.0) * (t * t * t));
}
return(0.0);
}
double flam3_sinc(double x) {
x *= M_PI;
if(x != 0) return(sin(x) / x);
return(1.0);
}
double flam3_blackman_filter(double x) {
return(0.42+0.5*cos(M_PI*x)+0.08*cos(2*M_PI*x));
}
double flam3_catrom_filter(double x) {
if (x < -2.0)
return(0.0);
if (x < -1.0)
return(0.5*(4.0+x*(8.0+x*(5.0+x))));
if (x < 0.0)
return(0.5*(2.0+x*x*(-5.0-3.0*x)));
if (x < 1.0)
return(0.5*(2.0+x*x*(-5.0+3.0*x)));
if (x < 2.0)
return(0.5*(4.0+x*(-8.0+x*(5.0-x))));
return(0.0);
}
double flam3_mitchell_filter(double t) {
double tt;
tt = t * t;
if(t < 0) t = -t;
if(t < 1.0) {
t = (((12.0 - 9.0 * flam3_mitchell_b - 6.0 * flam3_mitchell_c) * (t * tt))
+ ((-18.0 + 12.0 * flam3_mitchell_b + 6.0 * flam3_mitchell_c) * tt)
+ (6.0 - 2 * flam3_mitchell_b));
return(t / 6.0);
} else if(t < 2.0) {
t = (((-1.0 * flam3_mitchell_b - 6.0 * flam3_mitchell_c) * (t * tt))
+ ((6.0 * flam3_mitchell_b + 30.0 * flam3_mitchell_c) * tt)
+ ((-12.0 * flam3_mitchell_b - 48.0 * flam3_mitchell_c) * t)
+ (8.0 * flam3_mitchell_b + 24 * flam3_mitchell_c));
return(t / 6.0);
}
return(0.0);
}
double flam3_hanning_filter(double x) {
return(0.5+0.5*cos(M_PI*x));
}
double flam3_hamming_filter(double x) {
return(0.54+0.46*cos(M_PI*x));
}
double flam3_lanczos3_filter(double t) {
if(t < 0) t = -t;
if(t < 3.0) return(flam3_sinc(t) * flam3_sinc(t/3.0));
return(0.0);
}
double flam3_lanczos2_filter(double t) {
if(t < 0) t = -t;
if(t < 2.0) return(flam3_sinc(t) * flam3_sinc(t/2.0));
return(0.0);
}
double flam3_gaussian_filter(double x) {
return(exp((-2.0*x*x))*sqrt(2.0/M_PI));
}
double flam3_quadratic_filter(double x) {
if (x < -1.5)
return(0.0);
if (x < -0.5)
return(0.5*(x+1.5)*(x+1.5));
if (x < 0.5)
return(0.75-x*x);
if (x < 1.5)
return(0.5*(x-1.5)*(x-1.5));
return(0.0);
}
double flam3_spatial_filter(int knum, double x) {
if (knum==0)
return flam3_gaussian_filter(x);
else if (knum==1)
return flam3_hermite_filter(x);
else if (knum==2)
return flam3_box_filter(x);
else if (knum==3)
return flam3_triangle_filter(x);
else if (knum==4)
return flam3_bell_filter(x);
else if (knum==5)
return flam3_b_spline_filter(x);
else if (knum==6)
return flam3_mitchell_filter(x);
else if (knum==7)
return flam3_sinc(x)*flam3_blackman_filter(x);
else if (knum==8)
return flam3_catrom_filter(x);
else if (knum==9)
return flam3_sinc(x)*flam3_hanning_filter(x);
else if (knum==10)
return flam3_sinc(x)*flam3_hamming_filter(x);
else if (knum==11)
return flam3_lanczos3_filter(x)*flam3_sinc(x/3.0);
else if (knum==12)
return flam3_lanczos2_filter(x)*flam3_sinc(x/2.0);
else if (knum==13)
return flam3_quadratic_filter(x);
}
int normalize_vector(double *v, int n) {
double t = 0.0;
int i;
for (i = 0; i < n; i++)
t += v[i];
if (0.0 == t) return 1;
t = 1.0 / t;
for (i = 0; i < n; i++)
v[i] *= t;
return 0;
}
int flam3_create_spatial_filter(flam3_frame *spec, int field, double **filter) {
int sf_kernel = spec->genomes[0].spatial_filter_select;
int supersample = spec->genomes[0].spatial_oversample;
double sf_radius = spec->genomes[0].spatial_filter_radius;
double aspect_ratio = spec->pixel_aspect_ratio;
double sf_supp = flam3_spatial_support[sf_kernel];
double fw = 2.0 * sf_supp * supersample * sf_radius / aspect_ratio;
double adjust, ii, jj;
int fwidth = ((int) fw) + 1;
int i,j;
/* Make sure the filter kernel has same parity as oversample */
if ((fwidth ^ supersample) & 1)
fwidth++;
/* Calculate the coordinate scaling factor for the kernel values */
if (fw > 0.0)
adjust = sf_supp * fwidth / fw;
else
adjust = 1.0;
/* Calling function MUST FREE THE RETURNED KERNEL, lest ye leak memory */
(*filter) = (double *)calloc(fwidth * fwidth,sizeof(double));
/* fill in the coefs */
for (i = 0; i < fwidth; i++)
for (j = 0; j < fwidth; j++) {
/* Calculate the function inputs for the kernel function */
ii = ((2.0 * i + 1.0) / (double)fwidth - 1.0)*adjust;
jj = ((2.0 * j + 1.0) / (double)fwidth - 1.0)*adjust;
/* Scale for scanlines */
if (field) jj *= 2.0;
/* Adjust for aspect ratio */
jj /= aspect_ratio;
(*filter)[i + j * fwidth] =
flam3_spatial_filter(sf_kernel,ii) * flam3_spatial_filter(sf_kernel,jj);
}
if (normalize_vector((*filter), fwidth * fwidth)) {
fprintf(stderr, "Spatial filter value is too small: %g. Terminating.\n",sf_radius);
return(-1);
}
return (fwidth);
}
flam3_de_helper flam3_create_de_filters(double max_rad, double min_rad, double curve, int ss) {
flam3_de_helper de;
double comp_max_radius, comp_min_radius;
double num_de_filters_d;
int num_de_filters,de_max_ind;
int de_row_size, de_half_size;
int filtloop;
int keep_thresh=100;
de.kernel_size=-1;
if (curve <= 0.0) {
fprintf(stderr,"estimator curve must be > 0\n");
return(de);
}
if (max_rad < min_rad) {
fprintf(stderr,"estimator must be larger than estimator_minimum.\n");
fprintf(stderr,"(%f > %f) ? \n",max_rad,min_rad);
return(de);
}
/* We should scale the filter width by the oversample */
/* The '+1' comes from the assumed distance to the first pixel */
comp_max_radius = max_rad*ss + 1;
comp_min_radius = min_rad*ss + 1;
/* Calculate how many filter kernels we need based on the decay function */
/* */
/* num filters = (de_max_width / de_min_width)^(1/estimator_curve) */
/* */
num_de_filters_d = pow( comp_max_radius/comp_min_radius, 1.0/curve );
if (num_de_filters_d>1e7) {
fprintf(stderr,"too many filters required in this configuration (%g)\n",num_de_filters_d);
return(de);
}
num_de_filters = (int)ceil(num_de_filters_d);
/* Condense the smaller kernels to save space */
if (num_de_filters>keep_thresh) {
de_max_ind = (int)ceil(DE_THRESH + pow(num_de_filters-DE_THRESH,curve))+1;
de.max_filtered_counts = (int)pow( (double)(de_max_ind-DE_THRESH), 1.0/curve) + DE_THRESH;
} else {
de_max_ind = num_de_filters;
de.max_filtered_counts = de_max_ind;
}
/* Allocate the memory for these filters */
/* and the hit/width lookup vector */
de_row_size = (int)(2*ceil(comp_max_radius)-1);
de_half_size = (de_row_size-1)/2;
de.kernel_size = (de_half_size+1)*(2+de_half_size)/2;
de.filter_coefs = (double *) calloc (de_max_ind * de.kernel_size,sizeof(double));
de.filter_widths = (double *) calloc (de_max_ind,sizeof(double));
/* Generate the filter coefficients */
de.max_filter_index = 0;
for (filtloop=0;filtloop<de_max_ind;filtloop++) {
double de_filt_sum=0.0, de_filt_d;
double de_filt_h;
int dej,dek;
double adjloop;
int filter_coef_idx;
/* Calculate the filter width for this number of hits in a bin */
if (filtloop<keep_thresh)
de_filt_h = (comp_max_radius / pow(filtloop+1,curve));
else {
adjloop = pow(filtloop-keep_thresh,(1.0/curve)) + keep_thresh;
de_filt_h = (comp_max_radius / pow(adjloop+1,curve));
}
/* Once we've reached the min radius, don't populate any more */
if (de_filt_h <= comp_min_radius) {
de_filt_h = comp_min_radius;
de.max_filter_index = filtloop;
}
de.filter_widths[filtloop] = de_filt_h;
/* Calculate norm of kernel separately (easier) */
for (dej=-de_half_size; dej<=de_half_size; dej++) {
for (dek=-de_half_size; dek<=de_half_size; dek++) {
de_filt_d = sqrt( (double)(dej*dej+dek*dek) ) / de_filt_h;
/* Only populate the coefs within this radius */
if (de_filt_d <= 1.0) {
/* Gaussian */
de_filt_sum += flam3_spatial_filter(flam3_gaussian_kernel,
flam3_spatial_support[flam3_gaussian_kernel]*de_filt_d);
/* Epanichnikov */
// de_filt_sum += (1.0 - (de_filt_d * de_filt_d));
}
}
}
filter_coef_idx = filtloop*de.kernel_size;
/* Calculate the unique entries of the kernel */
for (dej=0; dej<=de_half_size; dej++) {
for (dek=0; dek<=dej; dek++) {
de_filt_d = sqrt( (double)(dej*dej+dek*dek) ) / de_filt_h;
/* Only populate the coefs within this radius */
if (de_filt_d>1.0)
de.filter_coefs[filter_coef_idx] = 0.0;
else {
/* Gaussian */
de.filter_coefs[filter_coef_idx] = flam3_spatial_filter(flam3_gaussian_kernel,
flam3_spatial_support[flam3_gaussian_kernel]*de_filt_d)/de_filt_sum;
/* Epanichnikov */
// de_filter_coefs[filter_coef_idx] = (1.0 - (de_filt_d * de_filt_d))/de_filt_sum;
}
filter_coef_idx ++;
}
}
if (de.max_filter_index>0)
break;
}
if (de.max_filter_index==0)
de.max_filter_index = de_max_ind-1;
return(de);
}
double flam3_create_temporal_filter(int numsteps, int filter_type, double filter_exp, double filter_width,
double **temporal_filter, double **temporal_deltas) {
double maxfilt = 0.0;
double sumfilt = 0.0;
double slpx,halfsteps;
double *deltas, *filter;
int i;
/* Allocate memory - this must be freed in the calling routine! */
deltas = (double *)malloc(numsteps*sizeof(double));
filter = (double *)malloc(numsteps*sizeof(double));
/* Deal with only one step */
if (numsteps==1) {
deltas[0] = 0;
filter[0] = 1.0;
*temporal_deltas = deltas;
*temporal_filter = filter;
return(1.0);
}
/* Define the temporal deltas */
for (i = 0; i < numsteps; i++)
deltas[i] = ((double)i /(double)(numsteps - 1) - 0.5)*filter_width;
/* Define the filter coefs */
if (flam3_temporal_exp == filter_type) {
for (i=0; i < numsteps; i++) {
if (filter_exp>=0)
slpx = ((double)i+1.0)/numsteps;
else
slpx = (double)(numsteps - i)/numsteps;
/* Scale the color based on these values */
filter[i] = pow(slpx,fabs(filter_exp));
/* Keep the max */
if (filter[i]>maxfilt)
maxfilt = filter[i];
}
} else if (flam3_temporal_gaussian == filter_type) {
halfsteps = numsteps/2.0;
for (i=0; i < numsteps; i++) {
/* Gaussian */
filter[i] = flam3_spatial_filter(flam3_gaussian_kernel,
flam3_spatial_support[flam3_gaussian_kernel]*fabs(i - halfsteps)/halfsteps);
/* Keep the max */
if (filter[i]>maxfilt)
maxfilt = filter[i];
}
} else { // (flam3_temporal_box)
for (i=0; i < numsteps; i++)
filter[i] = 1.0;
maxfilt = 1.0;
}
/* Adjust the filter so that the max is 1.0, and */
/* calculate the K2 scaling factor */
for (i=0;i<numsteps;i++) {
filter[i] /= maxfilt;
sumfilt += filter[i];
}
sumfilt /= numsteps;
*temporal_deltas = deltas;
*temporal_filter = filter;
return(sumfilt);
}

65
src/filters.h Normal file
View File

@ -0,0 +1,65 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef filters_included
#define filters_included
#include "private.h"
#define DE_THRESH 100
/* Spatial filter kernels */
#define flam3_gaussian_kernel 0
#define flam3_hermite_kernel 1
#define flam3_box_kernel 2
#define flam3_triangle_kernel 3
#define flam3_bell_kernel 4
#define flam3_b_spline_kernel 5
#define flam3_lanczos3_kernel 6
#define flam3_lanczos2_kernel 7
#define flam3_mitchell_kernel 8
#define flam3_blackman_kernel 9
#define flam3_catrom_kernel 10
#define flam3_hamming_kernel 11
#define flam3_hanning_kernel 12
#define flam3_quadratic_kernel 13
/* Temporal filters */
#define flam3_temporal_box 0
#define flam3_temporal_gaussian 1
#define flam3_temporal_exp 2
typedef struct {
int max_filtered_counts;
int max_filter_index;
int kernel_size;
double *filter_widths;
double *filter_coefs;
} flam3_de_helper;
extern double flam3_spatial_support[flam3_num_spatialfilters];
double flam3_spatial_filter(int knum, double x);
int flam3_create_spatial_filter(flam3_frame *spec, int field, double **filter);
flam3_de_helper flam3_create_de_filters(double max_rad, double min_rad, double curve, int ss);
double flam3_create_temporal_filter(int numsteps, int filter_type, double filter_exp, double filter_width,
double **temporal_filter, double **temporal_deltas);
#endif

342
src/flam3-animate.c Normal file
View File

@ -0,0 +1,342 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "private.h"
#include "img.h"
#include "isaacs.h"
int main(int argc, char **argv) {
char *ai, *fname;
char flamename[256];
char *prefix = args("prefix", "");
int first_frame = argi("begin", 0);
int last_frame = argi("end", 0);
int frame_time = argi("time", 0);
int dtime = argi("dtime", 1);
int do_fields = argi("fields", 0);
int write_genome = argi("write_genome",0);
double qs = argf("qs", 1.0);
double ss = argf("ss", 1.0);
char *format = getenv("format");
int verbose = argi("verbose", 1);
int transparency = argi("transparency", 0);
int bits = argi("bits", 33);
int sub_batch_size = argi("sub_batch_size", 10000);
int bpc = argi("bpc",8);
int earlyclip = argi("earlyclip",0);
int ftime, channels;
unsigned char *image;
flam3_genome *cps,center_cp;
int i, ncps = 0;
char *inf = getenv("in");
double pixel_aspect = argf("pixel_aspect", 1.0);
int num_threads = argi("nthreads",0);
FILE *in,*fp,*genfp;
flam3_frame f;
flam3_img_comments fpc;
stat_struct stats,stats2;
char badval_string[64];
char numiter_string[64];
char rtime_string[64];
#ifdef WIN32
char *slashloc;
char exepath[256];
char palpath[256];
memset(exepath,0,256);
memset(palpath,0,256);
slashloc = strrchr(argv[0],'\\');
if (NULL==slashloc) {
sprintf(palpath,"flam3_palettes=flam3-palettes.xml");
} else {
strncpy(exepath,argv[0],slashloc-argv[0]+1);
sprintf(palpath,"flam3_palettes=%sflam3-palettes.xml",exepath);
}
putenv(palpath);
#endif
memset(&center_cp,0, sizeof(flam3_genome));
if (1 != argc) {
docstring();
exit(0);
}
/* Init random number generators */
flam3_init_frame(&f);
flam3_srandom();
/* Set the number of threads */
if (num_threads==0) {
num_threads = flam3_count_nthreads();
if (verbose > 1)
fprintf(stderr,"Automatically detected %d core(s)...\n",num_threads);
} else{
if (verbose)
fprintf(stderr,"Manually specified %d thread(s)...\n",num_threads);
}
if (getenv("frame")) {
if (getenv("time")) {
fprintf(stderr, "cannot specify both time and frame.\n");
exit(1);
}
if (getenv("begin") || getenv("end")) {
fprintf(stderr, "cannot specify both frame and begin or end.\n");
exit(1);
}
first_frame = last_frame = atoi(getenv("frame"));
}
if (getenv("time")) {
if (getenv("begin") || getenv("end")) {
fprintf(stderr, "cannot specify both time and begin or end.\n");
exit(1);
}
first_frame = last_frame = frame_time;
}
if (NULL == format) format = "png";
if (strcmp(format, "jpg") &&
strcmp(format, "ppm") &&
strcmp(format, "png")) {
fprintf(stderr, "format must be either jpg, ppm, or png, not %s.\n", format);
exit(1);
}
if (pixel_aspect <= 0.0) {
fprintf(stderr, "pixel aspect ratio must be positive, not %g.\n",
pixel_aspect);
exit(1);
}
if (inf)
in = fopen(inf, "rb");
else
in = stdin;
if (NULL == in) {
perror(inf);
exit(1);
}
cps = flam3_parse_from_file(in, inf, flam3_defaults_on, &ncps);
if (inf)
fclose(in);
if (NULL == cps) {
fprintf(stderr," error reading genomes.\n");
exit(1);
}
if (0 == ncps) {
fprintf(stderr, "error: no genomes.\n");
exit(1);
}
for (i = 0; i < ncps; i++) {
cps[i].sample_density *= qs;
cps[i].height = (int)(cps[i].height * ss);
cps[i].width = (int)(cps[i].width * ss);
cps[i].pixels_per_unit *= ss;
if (cps[i].height<=0 || cps[i].width<=0) {
fprintf(stderr,"output image has dimension <=0, aborting.\n");
exit(1);
}
if (i > 0 && cps[i].time <= cps[i-1].time) {
fprintf(stderr, "error: control points must be sorted by time, but %g <= %g, index %d.\n",
cps[i].time, cps[i-1].time, i);
exit(1);
}
if ((cps[i].width != cps[0].width) ||
(cps[i].height != cps[0].height)) {
fprintf(stderr, "warning: flame %d at time %g size mismatch. "
"(%d,%d) should be (%d,%d).\n",
i, cps[i].time,
cps[i].width, cps[i].height,
cps[0].width, cps[0].height);
cps[i].width = cps[0].width;
cps[i].height = cps[0].height;
}
}
if (!getenv("time") && !getenv("frame")) {
if (!getenv("begin")) {
first_frame = (int) cps[0].time;
}
if (!getenv("end")) {
last_frame = (int) cps[ncps-1].time - 1;
if (last_frame < first_frame) last_frame = first_frame;
}
}
channels = strcmp(format, "png") ? 3 : 4;
/* Check for 16-bit-per-channel processing */
if ( (16 == bpc) && (strcmp(format,"png") != 0)) {
fprintf(stderr,"Support for 16 bpc images is only present for the png format.\n");
exit(1);
} else if (bpc != 8 && bpc != 16) {
fprintf(stderr,"Unexpected bpc specified (%d)\n",bpc);
exit(1);
}
// f.temporal_filter_radius = argf("blur", 0.5);
f.pixel_aspect_ratio = pixel_aspect;
f.genomes = cps;
f.ngenomes = ncps;
f.verbose = verbose;
f.bits = bits;
f.progress = 0;
f.earlyclip = earlyclip;
f.nthreads = num_threads;
f.sub_batch_size = sub_batch_size;
if (16==bpc)
f.bytes_per_channel = 2;
else
f.bytes_per_channel = 1;
image = (void *) malloc((size_t)channels *
(size_t)cps[0].width *
(size_t)cps[0].height * f.bytes_per_channel);
if (dtime < 1) {
fprintf(stderr, "dtime must be positive, not %d.\n", dtime);
exit(1);
}
for (ftime = first_frame; ftime <= last_frame; ftime += dtime) {
f.time = (double) ftime;
if (verbose && ((last_frame-first_frame)/dtime) >= 1) {
fprintf(stderr, "time = %d/%d/%d\n", ftime, last_frame, dtime);
}
if (do_fields) {
if (flam3_render(&f, image, flam3_field_even, channels, transparency,&stats)) {
fprintf(stderr,"error rendering image: aborting.\n");
exit(1);
}
f.time += 0.5;
if (flam3_render(&f, image, flam3_field_odd, channels, transparency,&stats2)) {
fprintf(stderr,"error rendering image: aborting.\n");
exit(1);
}
stats.badvals+=stats2.badvals;
stats.render_seconds+=stats2.render_seconds;
stats.num_iters+=stats2.num_iters;
} else {
if (flam3_render(&f, image, flam3_field_both, channels, transparency,&stats)) {
fprintf(stderr,"error rendering image: aborting.\n");
exit(1);
}
}
if (getenv("out"))
fname = getenv("out");
else {
fname = malloc(strlen(prefix) + 20);
sprintf(fname, "%s%05d.%s", prefix, ftime, format);
}
if (verbose)
fprintf(stderr, "writing %s...", fname);
if (write_genome) {
sprintf(flamename,"%s.flam3",fname);
/* get center genome */
flam3_interpolate(f.genomes, f.ngenomes, f.time, 0, &center_cp);
/* write it out */
genfp = fopen(flamename,"w");
if (NULL == genfp) {
perror(flamename);
exit(1);
}
flam3_print(genfp, &center_cp, NULL, flam3_print_edits);
fclose(genfp);
}
fp = fopen(fname, "wb");
if (NULL == fp) {
perror(fname);
exit(1);
}
/* Get center cp for embedding in png file */
flam3_interpolate(f.genomes, f.ngenomes, f.time, 0, &center_cp);
/* Convert to string */
fpc.genome = flam3_print_to_string(&center_cp);
sprintf(badval_string, "%g",stats.badvals/(double)stats.num_iters);
fpc.badvals = badval_string;
sprintf(numiter_string,"%g",(double)stats.num_iters);
fpc.numiters = numiter_string;
sprintf(rtime_string,"%d",stats.render_seconds);
fpc.rtime = rtime_string;
if (!strcmp(format, "png")) {
write_png(fp, image, cps[0].width, cps[0].height, &fpc, 1);
} else if (!strcmp(format, "jpg")) {
write_jpeg(fp, image, cps[0].width, cps[0].height, &fpc);
} else {
int size = 3 * cps[0].width * cps[0].height;
fprintf(fp, "P6\n");
fprintf(fp, "%d %d\n255\n", cps[0].width, cps[0].height);
if (size != fwrite(image, 1, size, fp)) {
perror(fname);
}
}
/* Free string */
free(fpc.genome);
clear_cp(&center_cp,0);
fclose(fp);
if (!getenv("out"))
free(fname);
}
for (i = 0; i < ncps; i++) {
xmlFreeDoc(cps[i].edits);
clear_cp(&cps[i],0);
}
free(cps);
free(image);
if (verbose)
fprintf(stderr, "done.\n");
fflush(stderr);
return 0;
}

36
src/flam3-animate.man Normal file
View File

@ -0,0 +1,36 @@
.TH flam3-animate 1 "" ""
.SH NAME
flam3-animate
flam3-render
flam3-genome
flam3-convert - render and animate FLAM3s and manipulate their genomes
.SH SYNOPSIS
.B flam3-render < input
.SH DESCRIPTION
FLAM3 implements a visual language based on a recursive set equation.
Flam3-genome creates and manipulates genomes (xml parameter sets) in
this language. Flam3-render turns genomes into still images, and
Flam3-animate renders motion-blurred frames of animation.
Flam3-convert reads from stdin files in the old format used by the
flame GIMP plugin, and writes the new format to stdout.
.SH OPTIONS
Any command line option will cause the program to write its
documentation to standard out.
.SH ENVIRONMENT
The environment variables are in the documention written to standard
out given any command line option.
.SH SEE ALSO
.BR WWW.FLAM3.COM,
.BR electricsheep (1),
.SH AUTHOR
spot aka Scott Draves, Erik Reckase

239
src/flam3-convert.c Normal file
View File

@ -0,0 +1,239 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "private.h"
#define MAXARGS 1000
#define streql(x,y) (!strcmp(x,y))
/*
* split a string passed in ss into tokens on whitespace.
* # comments to end of line. ; terminates the record
*/
void tokenize(ss, argv, argc)
char **ss;
char *argv[];
int *argc;
{
char *s = *ss;
int i = 0, state = 0;
while (*s != ';') {
char c = *s;
switch (state) {
case 0:
if ('#' == c)
state = 2;
else if (!isspace(c)) {
argv[i] = s;
i++;
state = 1;
}
case 1:
if (isspace(c)) {
*s = 0;
state = 0;
}
case 2:
if ('\n' == c)
state = 0;
}
s++;
}
*s = 0;
*ss = s+1;
*argc = i;
}
/*
* given a pointer to a string SS, fill fields of a control point CP.
* return a pointer to the first unused char in SS. totally barfucious,
* must integrate with tcl soon...
*/
void parse_control_point_old(char **ss, flam3_genome *cp) {
char *argv[MAXARGS];
int argc, i, j;
int set_cm = 0, set_image_size = 0, set_nbatches = 0, set_white_level = 0, set_cmap_inter = 0;
int set_spatial_oversample = 0, set_hr = 0;
double *slot, xf, cm, t, nbatches, white_level, spatial_oversample, cmap_inter;
double image_size[2];
memset(cp, 0, sizeof(flam3_genome));
flam3_add_xforms(cp, flam3_nxforms, 0, 0);
for (i = 0; i < flam3_nxforms; i++) {
cp->xform[i].density = 0.0;
cp->xform[i].color = i&1;
cp->xform[i].color_speed = 0.5;
cp->xform[i].animate = 1.0;
cp->xform[i].var[0] = 1.0;
for (j = 1; j < flam3_nvariations; j++)
cp->xform[i].var[j] = 0.0;
cp->xform[i].c[0][0] = 1.0;
cp->xform[i].c[0][1] = 0.0;
cp->xform[i].c[1][0] = 0.0;
cp->xform[i].c[1][1] = 1.0;
cp->xform[i].c[2][0] = 0.0;
cp->xform[i].c[2][1] = 0.0;
}
tokenize(ss, argv, &argc);
for (i = 0; i < argc; i++) {
if (streql("xform", argv[i]))
slot = &xf;
else if (streql("time", argv[i]))
slot = &cp->time;
else if (streql("brightness", argv[i]))
slot = &cp->brightness;
else if (streql("contrast", argv[i]))
slot = &cp->contrast;
else if (streql("gamma", argv[i]))
slot = &cp->gamma;
else if (streql("vibrancy", argv[i]))
slot = &cp->vibrancy;
else if (streql("hue_rotation", argv[i])) {
slot = &cp->hue_rotation;
set_hr = 1;
} else if (streql("zoom", argv[i]))
slot = &cp->zoom;
else if (streql("image_size", argv[i])) {
slot = image_size;
set_image_size = 1;
} else if (streql("center", argv[i]))
slot = cp->center;
else if (streql("background", argv[i]))
slot = cp->background;
else if (streql("pixels_per_unit", argv[i]))
slot = &cp->pixels_per_unit;
else if (streql("spatial_filter_radius", argv[i]))
slot = &cp->spatial_filter_radius;
else if (streql("sample_density", argv[i]))
slot = &cp->sample_density;
else if (streql("nbatches", argv[i])) {
slot = &nbatches;
set_nbatches = 1;
} else if (streql("white_level", argv[i])) {
slot = &white_level;
set_white_level = 1;
} else if (streql("spatial_oversample", argv[i])) {
slot = &spatial_oversample;
set_spatial_oversample = 1;
} else if (streql("cmap", argv[i])) {
slot = &cm;
set_cm = 1;
} else if (streql("palette", argv[i])) {
slot = &cp->palette[0].color[0];
} else if (streql("density", argv[i]))
slot = &cp->xform[(int)xf].density;
else if (streql("color", argv[i]))
slot = &cp->xform[(int)xf].color;
else if (streql("coefs", argv[i])) {
slot = cp->xform[(int)xf].c[0];
cp->xform[(int)xf].density = 1.0;
} else if (streql("var", argv[i]))
slot = cp->xform[(int)xf].var;
else if (streql("cmap_inter", argv[i])) {
slot = &cmap_inter;
set_cmap_inter = 1;
} else
*slot++ = atof(argv[i]);
}
if (set_cm) {
double hr = set_hr ? cp->hue_rotation : 0.0;
cp->palette_index = (int) cm;
flam3_get_palette(cp->palette_index, cp->palette, hr);
}
if (set_image_size) {
cp->width = (int) image_size[0];
cp->height = (int) image_size[1];
}
if (set_nbatches)
cp->nbatches = (int) nbatches;
if (set_spatial_oversample)
cp->spatial_oversample = (int) spatial_oversample;
if (set_white_level) {
/* ignore */
}
for (i = 0; i < flam3_nxforms; i++) {
t = 0.0;
for (j = 0; j < flam3_nvariations; j++)
t += cp->xform[i].var[j];
t = 1.0 / t;
for (j = 0; j < flam3_nvariations; j++)
cp->xform[i].var[j] *= t;
}
}
int
main(int argc, char **argv)
{
char *s, *ss;
#ifdef WIN32
char *slashloc;
char palpath[256],exepath[256];
slashloc = strrchr(argv[0],'\\');
if (NULL==slashloc) {
sprintf(palpath,"flam3_palettes=flam3-palettes.xml");
} else {
strncpy(exepath,argv[0],slashloc-argv[0]+1);
sprintf(palpath,"flam3_palettes=%sflam3-palettes.xml",exepath);
}
putenv(palpath);
#endif
if (1 != argc) {
docstring();
exit(0);
}
{
int i, c, slen = 5000;
s = malloc(slen);
i = 0;
do {
c = getchar();
if (EOF == c) goto done_reading;
s[i++] = c;
if (i == slen-1) {
slen *= 2;
s = realloc(s, slen);
}
} while (1);
done_reading:
s[i] = 0;
}
ss = s;
s += strlen(s);
printf("<conversions>\n");
while (strchr(ss, ';')) {
flam3_genome cp;
parse_control_point_old(&ss, &cp);
flam3_print(stdout, &cp, NULL, flam3_print_edits);
}
printf("</conversions>\n");
return 0;
}

36
src/flam3-convert.man Normal file
View File

@ -0,0 +1,36 @@
.TH flam3-animate 1 "" ""
.SH NAME
flam3-animate
flam3-render
flam3-genome
flam3-convert - render and animate FLAM3s and manipulate their genomes
.SH SYNOPSIS
.B flam3-render < input
.SH DESCRIPTION
FLAM3 implements a visual language based on a recursive set equation.
Flam3-genome creates and manipulates genomes (xml parameter sets) in
this language. Flam3-render turns genomes into still images, and
Flam3-animate renders motion-blurred frames of animation.
Flam3-convert reads from stdin files in the old format used by the
flame GIMP plugin, and writes the new format to stdout.
.SH OPTIONS
Any command line option will cause the program to write its
documentation to standard out.
.SH ENVIRONMENT
The environment variables are in the documention written to standard
out given any command line option.
.SH SEE ALSO
.BR WWW.FLAM3.COM,
.BR electricsheep (1),
.SH AUTHOR
spot aka Scott Draves, Erik Reckase

1075
src/flam3-genome.c Normal file

File diff suppressed because it is too large Load Diff

36
src/flam3-genome.man Normal file
View File

@ -0,0 +1,36 @@
.TH flam3-animate 1 "" ""
.SH NAME
flam3-animate
flam3-render
flam3-genome
flam3-convert - render and animate FLAM3s and manipulate their genomes
.SH SYNOPSIS
.B flam3-render < input
.SH DESCRIPTION
FLAM3 implements a visual language based on a recursive set equation.
Flam3-genome creates and manipulates genomes (xml parameter sets) in
this language. Flam3-render turns genomes into still images, and
Flam3-animate renders motion-blurred frames of animation.
Flam3-convert reads from stdin files in the old format used by the
flame GIMP plugin, and writes the new format to stdout.
.SH OPTIONS
Any command line option will cause the program to write its
documentation to standard out.
.SH ENVIRONMENT
The environment variables are in the documention written to standard
out given any command line option.
.SH SEE ALSO
.BR WWW.FLAM3.COM,
.BR electricsheep (1),
.SH AUTHOR
spot aka Scott Draves, Erik Reckase

23135
src/flam3-palettes.xml Normal file

File diff suppressed because it is too large Load Diff

421
src/flam3-render.c Normal file
View File

@ -0,0 +1,421 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifdef WIN32
#define WINVER 0x0500
#include <windows.h>
#endif
#ifdef __APPLE__
#include <sys/sysctl.h>
#endif
#include <limits.h>
#include "private.h"
#include "img.h"
#include "isaacs.h"
int calc_nstrips(flam3_frame *spec) {
double mem_required;
double mem_available;
int nstrips,ninc;
char *testmalloc;
#ifdef WIN32
MEMORYSTATUS stat;
stat.dwLength = sizeof(stat);
GlobalMemoryStatus(&stat); // may want to go to GlobalMemoryStatusEx eventually
mem_available = (double)stat.dwTotalPhys;
// fprintf(stderr,"%lu bytes free memory...\n",(size_t)stat.dwAvailPhys);
// if (mem_available > 1e9) mem_available = 1e9;
#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
mem_available =
(double)sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE);
#elif defined __APPLE__
unsigned int physmem;
size_t len = sizeof(physmem);
static int mib[2] = { CTL_HW, HW_PHYSMEM };
if (sysctl(mib, 2, &physmem, &len, NULL, 0) == 0 && len == sizeof(physmem)) {
mem_available = (double )physmem;
} else {
fprintf(stderr, "warning: unable to determine physical memory.\n");
mem_available = 2e9;
}
#else
fprintf(stderr, "warning: unable to determine physical memory.\n");
mem_available = 2e9;
#endif
#if 0
fprintf(stderr,"available phyical memory is %lu\n",
(unsigned long)mem_available);
#endif
mem_available *= 0.8;
if (getenv("use_mem")) {
mem_available = atof(getenv("use_mem"));
}
mem_required = flam3_render_memory_required(spec);
if (mem_available >= mem_required) return 1;
nstrips = (int) ceil(mem_required / mem_available);
if (0) {
/* Attempt to malloc a strip, and if it fails, try adding additional strips */
ninc=-1;
testmalloc = NULL;
while(NULL==testmalloc && ninc<3) {
ninc++;
testmalloc = (char *)malloc((int)ceil(mem_required / (nstrips+ninc)));
}
if (NULL==testmalloc) {
fprintf(stderr,"Unable to allocate memory for render. Please close some running programs and try to render again.\n");
exit(1);
} else {
free(testmalloc);
nstrips = nstrips + ninc;
}
}
return nstrips;
}
int print_progress(void *foo, double fraction, int stage, double eta) {
fprintf(stderr, "stage=%s progress=%g eta=%g\n", stage?"filtering":"chaos", fraction, eta);
return 0;
}
int main(int argc, char **argv) {
flam3_frame f;
char *ai;
flam3_genome *cps;
int ncps;
int i;
void *image=NULL;
FILE *fp;
char fname[256];
size_t this_size, last_size = -1;
double imgmem;
unsigned int strip;
double center_y, center_base;
unsigned int nstrips;
randctx savectx;
char *prefix = args("prefix", "");
char *out = args("out", NULL);
char *format = getenv("format");
int verbose = argi("verbose", 1);
int bits = argi("bits", 33);
int bpc = argi("bpc",8);
int seed = argi("seed", 0);
int transparency = argi("transparency", 0);
char *inf = getenv("in");
double qs = argf("qs", 1.0);
double ss = argf("ss", 1.0);
double pixel_aspect = argf("pixel_aspect", 1.0);
int sub_batch_size = argi("sub_batch_size",10000);
int name_enable = argi("name_enable",0);
int num_threads = argi("nthreads",0);
int earlyclip = argi("earlyclip",0);
FILE *in;
double zoom_scale;
unsigned int channels;
long start_time = (long)time(0);
flam3_img_comments fpc;
stat_struct stats;
char numiter_string[64];
char badval_string[64];
char rtime_string[64];
#ifdef WIN32
char *slashloc;
char exepath[256];
char palpath[256];
memset(exepath,0,256);
memset(palpath,0,256);
slashloc = strrchr(argv[0],'\\');
if (NULL==slashloc) {
sprintf(palpath,"flam3_palettes=flam3-palettes.xml");
} else {
strncpy(exepath,argv[0],slashloc-argv[0]+1);
sprintf(palpath,"flam3_palettes=%sflam3-palettes.xml",exepath);
}
putenv(palpath);
#endif
if (1 != argc) {
docstring();
exit(0);
}
/* Init random number generators */
flam3_init_frame(&f);
flam3_srandom();
/* Set the number of threads */
if (num_threads==0) {
num_threads = flam3_count_nthreads();
if (verbose > 1)
fprintf(stderr,"Automatically detected %d core(s)...\n",num_threads);
} else{
if (verbose)
fprintf(stderr,"Manually specified %d thread(s)...\n",num_threads);
}
if (NULL == format) format = "png";
if (strcmp(format, "jpg") &&
strcmp(format, "ppm") &&
strcmp(format, "png")) {
fprintf(stderr,
"format must be either jpg, ppm, or png, not %s.\n",
format);
exit(1);
}
channels = strcmp(format, "png") ? 3 : 4;
/* Check for 16-bit-per-channel processing */
if ( (16 == bpc) && (strcmp(format,"png") != 0)) {
fprintf(stderr,"Support for 16 bpc images is only present for the png format.\n");
exit(1);
} else if (bpc != 8 && bpc != 16) {
fprintf(stderr,"Unexpected bpc specified (%d)\n",bpc);
exit(1);
}
if (pixel_aspect <= 0.0) {
fprintf(stderr, "pixel aspect ratio must be positive, not %g.\n",
pixel_aspect);
exit(1);
}
if (inf)
in = fopen(inf, "rb");
else
in = stdin;
if (NULL == in) {
perror(inf);
exit(1);
}
cps = flam3_parse_from_file(in, inf, flam3_defaults_on, &ncps);
if (NULL == cps) {
fprintf(stderr,"error reading genomes from file\n");
exit(1);
}
if (inf)
fclose(in);
for (i = 0; i < ncps; i++) {
/* Force ntemporal_samples to 1 for -render */
cps[i].ntemporal_samples = 1;
cps[i].sample_density *= qs;
cps[i].height = (int)(cps[i].height * ss);
cps[i].width = (int)(cps[i].width * ss);
cps[i].pixels_per_unit *= ss;
if (cps[i].height<=0 || cps[i].width<=0) {
fprintf(stderr,"output image has dimension <=0, aborting.\n");
exit(1);
}
}
if (out && (ncps > 1)) {
fprintf(stderr, "hqi-flame: warning: writing multiple images "
"to one file. all but last will be lost.\n");
}
for (i = 0; i < ncps; i++) {
int real_height;
if (verbose && ncps > 1) {
fprintf(stderr, "flame = %d/%d ", i+1, ncps);
}
// f.temporal_filter_radius = 0.0;
f.genomes = &cps[i];
f.ngenomes = 1;
f.verbose = verbose;
f.bits = bits;
f.time = 0.0;
f.pixel_aspect_ratio = pixel_aspect;
f.progress = 0;//print_progress;
f.nthreads = num_threads;
f.earlyclip = earlyclip;
f.sub_batch_size = sub_batch_size;
if (16==bpc)
f.bytes_per_channel = 2;
else
f.bytes_per_channel = 1;
if (getenv("nstrips")) {
nstrips = atoi(getenv("nstrips"));
} else {
nstrips = calc_nstrips(&f);
}
if (nstrips > cps[i].height) {
fprintf(stderr, "cannot have more strips than rows but %d>%d.\n",
nstrips, cps[i].height);
exit(1);
}
imgmem = (double)channels * (double)cps[i].width
* (double)cps[i].height * f.bytes_per_channel;
if (imgmem > ULONG_MAX) {
fprintf(stderr,"Image size > ULONG_MAX. Aborting.\n");
exit(1);
}
this_size = (size_t)channels * (size_t)cps[i].width
* (size_t)cps[i].height * f.bytes_per_channel;
if (this_size != last_size) {
if (last_size != -1)
free(image);
last_size = this_size;
image = (void *) malloc(this_size);
if (NULL==image) {
fprintf(stderr,"Error allocating memory for image. Aborting\n");
exit(1);
}
} else {
memset(image, 0, this_size);
}
cps[i].sample_density *= nstrips;
real_height = cps[i].height;
cps[i].height = (int) ceil(cps[i].height / (double) nstrips);
center_y = cps[i].center[1];
zoom_scale = pow(2.0, cps[i].zoom);
center_base = center_y - ((nstrips - 1) * cps[i].height) /
(2 * cps[i].pixels_per_unit * zoom_scale);
/* Copy off random context to use for each strip */
memcpy(&savectx, &f.rc, sizeof(randctx));
for (strip = 0; strip < nstrips; strip++) {
size_t ssoff = (size_t)cps[i].height * strip * cps[i].width * channels * f.bytes_per_channel;
void *strip_start = image + ssoff;
cps[i].center[1] = center_base + cps[i].height * (double) strip / (cps[i].pixels_per_unit * zoom_scale);
if ((cps[i].height * (strip + 1)) > real_height) {
int oh = cps[i].height;
cps[i].height = real_height - oh * strip;
cps[i].center[1] -=
(oh - cps[i].height) * 0.5 /
(cps[i].pixels_per_unit * zoom_scale);
}
/* Use the same random context for each strip */
memcpy(&f.rc, &savectx, sizeof(randctx));
if (verbose && nstrips > 1) {
fprintf(stderr, "strip = %d/%d\n", strip+1, nstrips);
}
if (verbose && (1 == nstrips) && (ncps > 1)) {
fprintf(stderr, "\n");
}
cps[i].ntemporal_samples = 1;
if (flam3_render(&f, strip_start, flam3_field_both, channels, transparency, &stats)) {
fprintf(stderr,"error rendering image: aborting.\n");
exit(1);
}
if (NULL != out) {
strcpy(fname,out);
} else if (name_enable && cps[i].flame_name[0]>0) {
sprintf(fname, "%s.%s",cps[i].flame_name,format);
} else {
sprintf(fname, "%s%05d.%s", prefix, i, format);
}
if (verbose) {
fprintf(stderr, "writing %s...", fname);
}
fp = fopen(fname, "wb");
if (NULL == fp) {
perror(fname);
exit(1);
}
/* Generate temp file with genome */
fpc.genome = flam3_print_to_string(f.genomes);
sprintf(badval_string,"%g",stats.badvals/(double)stats.num_iters);
fpc.badvals = badval_string;
sprintf(numiter_string,"%g",(double)stats.num_iters);
fpc.numiters = numiter_string;
sprintf(rtime_string,"%d",stats.render_seconds);
fpc.rtime = rtime_string;
if (!strcmp(format, "png")) {
write_png(fp, image, cps[i].width, real_height, &fpc, f.bytes_per_channel);
} else if (!strcmp(format, "jpg")) {
write_jpeg(fp, (unsigned char *)image, cps[i].width, real_height, &fpc);
} else {
fprintf(fp, "P6\n");
fprintf(fp, "%d %d\n255\n", cps[i].width, real_height);
if (this_size != fwrite((unsigned char *)image, 1, this_size, fp)) {
perror(fname);
}
}
/* Free string */
free(fpc.genome);
fclose(fp);
}
/* restore the cps values to their original values */
cps[i].sample_density /= nstrips;
cps[i].height = real_height;
cps[i].center[1] = center_y;
if (verbose) {
fprintf(stderr, "done.\n");
}
}
if (verbose && ((ncps > 1) || (nstrips > 1))) {
long total_time = (long)time(0) - start_time;
if (total_time > 100)
fprintf(stderr, "total time = %.1f minutes\n", total_time / 60.0);
else
fprintf(stderr, "total time = %ld seconds\n", total_time);
}
for (i=0;i<ncps;i++) {
xmlFreeDoc(cps[i].edits);
clear_cp(&cps[i],0);
}
free(cps);
free(image);
return 0;
}

36
src/flam3-render.man Normal file
View File

@ -0,0 +1,36 @@
.TH flam3-animate 1 "" ""
.SH NAME
flam3-animate
flam3-render
flam3-genome
flam3-convert - render and animate FLAM3s and manipulate their genomes
.SH SYNOPSIS
.B flam3-render < input
.SH DESCRIPTION
FLAM3 implements a visual language based on a recursive set equation.
Flam3-genome creates and manipulates genomes (xml parameter sets) in
this language. Flam3-render turns genomes into still images, and
Flam3-animate renders motion-blurred frames of animation.
Flam3-convert reads from stdin files in the old format used by the
flame GIMP plugin, and writes the new format to stdout.
.SH OPTIONS
Any command line option will cause the program to write its
documentation to standard out.
.SH ENVIRONMENT
The environment variables are in the documention written to standard
out given any command line option.
.SH SEE ALSO
.BR WWW.FLAM3.COM,
.BR electricsheep (1),
.SH AUTHOR
spot aka Scott Draves, Erik Reckase

3994
src/flam3.c Normal file

File diff suppressed because it is too large Load Diff

65
src/flam3.dsw Normal file
View File

@ -0,0 +1,65 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "anim"=.\anim.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "convert"=.\convert.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "hqi"=.\hqi.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "pick"=.\pick.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

657
src/flam3.h Normal file
View File

@ -0,0 +1,657 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef flam3_included
#define flam3_included
#include <stdio.h>
#include <libxml/parser.h>
#include "isaac.h"
#if defined(_MSC_VER) /* VC++ */
#include <windows.h>
#define EXPORT __declspec (dllexport)
#else
#define EXPORT
#endif
EXPORT char *flam3_version();
#define flam3_palette_random (-1)
#define flam3_palette_interpolated (-2)
#define flam3_defaults_on (1)
#define flam3_defaults_off (0)
#define flam3_name_len 64
#define flam3_print_edits (1)
#define flam3_dont_print_edits (0)
//typedef double flam3_palette[256][3];
typedef struct {
double index;
double color[4];
} flam3_palette_entry;
typedef flam3_palette_entry flam3_palette[256];
int flam3_get_palette(int palette_index, flam3_palette p, double hue_rotation);
#define flam3_variation_random (-1)
#define flam3_variation_random_fromspecified (-2)
extern char *flam3_variation_names[];
#define flam3_nvariations 97
#define flam3_nxforms 12
#define flam3_parent_fn_len 30
#define flam3_interpolation_linear 0
#define flam3_interpolation_smooth 1
#define flam3_inttype_linear 0
#define flam3_inttype_log 1
#define flam3_inttype_compat 2 /* Linear and old behaviour */
#define flam3_inttype_older 3 /* rotate padded xforms */
#define flam3_palette_interpolation_hsv 0
#define flam3_palette_interpolation_sweep 1
#define flam3_max_action_length 10000
#define flam3_palette_mode_step 0
#define flam3_palette_mode_linear 1
#define VAR_LINEAR 0
#define VAR_SINUSOIDAL 1
#define VAR_SPHERICAL 2
#define VAR_SWIRL 3
#define VAR_HORSESHOE 4
#define VAR_POLAR 5
#define VAR_HANDKERCHIEF 6
#define VAR_HEART 7
#define VAR_DISC 8
#define VAR_SPIRAL 9
#define VAR_HYPERBOLIC 10
#define VAR_DIAMOND 11
#define VAR_EX 12
#define VAR_JULIA 13
#define VAR_BENT 14
#define VAR_WAVES 15
#define VAR_FISHEYE 16
#define VAR_POPCORN 17
#define VAR_EXPONENTIAL 18
#define VAR_POWER 19
#define VAR_COSINE 20
#define VAR_RINGS 21
#define VAR_FAN 22
#define VAR_BLOB 23
#define VAR_PDJ 24
#define VAR_FAN2 25
#define VAR_RINGS2 26
#define VAR_EYEFISH 27
#define VAR_BUBBLE 28
#define VAR_CYLINDER 29
#define VAR_PERSPECTIVE 30
#define VAR_NOISE 31
#define VAR_JULIAN 32
#define VAR_JULIASCOPE 33
#define VAR_BLUR 34
#define VAR_GAUSSIAN_BLUR 35
#define VAR_RADIAL_BLUR 36
#define VAR_PIE 37
#define VAR_NGON 38
#define VAR_CURL 39
#define VAR_RECTANGLES 40
#define VAR_ARCH 41
#define VAR_TANGENT 42
#define VAR_SQUARE 43
#define VAR_RAYS 44
#define VAR_BLADE 45
#define VAR_SECANT2 46
#define VAR_TWINTRIAN 47
#define VAR_CROSS 48
#define VAR_DISC2 49
#define VAR_SUPER_SHAPE 50
#define VAR_FLOWER 51
#define VAR_CONIC 52
#define VAR_PARABOLA 53
#define VAR_BENT2 54
#define VAR_BIPOLAR 55
#define VAR_BOARDERS 56
#define VAR_BUTTERFLY 57
#define VAR_CELL 58
#define VAR_CPOW 59
#define VAR_CURVE 60
#define VAR_EDISC 61
#define VAR_ELLIPTIC 62
#define VAR_ESCHER 63
#define VAR_FOCI 64
#define VAR_LAZYSUSAN 65
#define VAR_LOONIE 66
#define VAR_PRE_BLUR 67
#define VAR_MODULUS 68
#define VAR_OSCILLOSCOPE 69
#define VAR_POLAR2 70
#define VAR_POPCORN2 71
#define VAR_SCRY 72
#define VAR_SEPARATION 73
#define VAR_SPLIT 74
#define VAR_SPLITS 75
#define VAR_STRIPES 76
#define VAR_WEDGE 77
#define VAR_WEDGE_JULIA 78
#define VAR_WEDGE_SPH 79
#define VAR_WHORL 80
#define VAR_WAVES2 81
#define VAR_EXP 82
#define VAR_LOG 83
#define VAR_SIN 84
#define VAR_COS 85
#define VAR_TAN 86
#define VAR_SEC 87
#define VAR_CSC 88
#define VAR_COT 89
#define VAR_SINH 90
#define VAR_COSH 91
#define VAR_TANH 92
#define VAR_SECH 93
#define VAR_CSCH 94
#define VAR_COTH 95
#define VAR_AUGER 96
typedef struct {
double badvals;
long int num_iters;
int render_seconds;
} stat_struct;
typedef struct {
unsigned int width, height;
int version;
int id;
/* There are 256 levels of gray to work with */
double intensity_weight[256];
unsigned int bin_size[256];
unsigned int bin_offset[256];
/* Pointer to newly allocated memory; we will be allocating */
/* 2*w*h ushorts for this storage. The bin offset will */
/* provide the starting point for a random selection from */
/* (bin size) ordered pairs */
unsigned short *rowcols;
} flam3_image_store;
typedef struct xform {
double var[flam3_nvariations]; /* interp coefs between variations */
double c[3][2]; /* the coefs to the affine part of the function */
double post[3][2]; /* the post transform */
double density; /* probability that this function is chosen. 0 - 1 */
double color; /* color coords for this function. 0 - 1 */
double color_speed; /* scaling factor on color added to current iteration */
double animate; /* whether or not this xform rotates (in sheep) >0 means stationary */
double opacity; /* 0=invisible, 1=totally visible */
double vis_adjusted; /* adjusted visibility for better transitions */
int padding;/* Set to 1 for padding xforms */
double wind[2]; /* winding numbers */
int precalc_angles_flag;
int precalc_atan_xy_flag;
int precalc_atan_yx_flag;
double has_preblur;
int has_post;
/* Params for new parameterized variations */
/* Blob */
double blob_low;
double blob_high;
double blob_waves;
/* PDJ */
double pdj_a;
double pdj_b;
double pdj_c;
double pdj_d;
/* Fan2 */
double fan2_x;
double fan2_y;
/* Rings2 */
double rings2_val;
/* Perspective */
double perspective_angle;
double perspective_dist;
/* Julia_N */
double julian_power;
double julian_dist;
/* Julia_Scope */
double juliascope_power;
double juliascope_dist;
/* Radial_Blur */
double radial_blur_angle;
/* Pie */
double pie_slices;
double pie_rotation;
double pie_thickness;
/* Ngon */
double ngon_sides;
double ngon_power;
double ngon_circle;
double ngon_corners;
/* Curl */
double curl_c1;
double curl_c2;
/* Rectangles */
double rectangles_x;
double rectangles_y;
/* AMW */
double amw_amp;
/* Disc 2 */
double disc2_rot;
double disc2_twist;
/* Supershape */
double super_shape_rnd;
double super_shape_m;
double super_shape_n1;
double super_shape_n2;
double super_shape_n3;
double super_shape_holes;
/* Flower */
double flower_petals;
double flower_holes;
/* Conic */
double conic_eccentricity;
double conic_holes;
/* Parabola */
double parabola_height;
double parabola_width;
/* Bent2 */
double bent2_x;
double bent2_y;
/* Bipolar */
double bipolar_shift;
/* Cell */
double cell_size;
/* Cpow */
double cpow_r;
double cpow_i;
double cpow_power; /* int in apo */
/* Curve */
double curve_xamp,curve_yamp;
double curve_xlength,curve_ylength;
/* Escher */
double escher_beta;
/* Lazysusan */
double lazysusan_spin;
double lazysusan_space;
double lazysusan_twist;
double lazysusan_x, lazysusan_y;
/* Modulus */
double modulus_x, modulus_y;
/* Oscope */
double oscope_separation;
double oscope_frequency;
double oscope_amplitude;
double oscope_damping;
/* Popcorn2 */
double popcorn2_x, popcorn2_y, popcorn2_c;
/* Separation */
double separation_x, separation_xinside;
double separation_y, separation_yinside;
/* Split */
double split_xsize;
double split_ysize;
/* Splits */
double splits_x,splits_y;
/* Stripes */
double stripes_space;
double stripes_warp;
/* Wedge */
double wedge_angle, wedge_hole;
double wedge_count, wedge_swirl;
/* Wedge_Julia */
double wedge_julia_angle;
double wedge_julia_count;
double wedge_julia_power;
double wedge_julia_dist;
/* Wedge_Sph */
double wedge_sph_angle, wedge_sph_count;
double wedge_sph_hole, wedge_sph_swirl;
/* Whorl */
double whorl_inside, whorl_outside;
/* Waves2 */
double waves2_freqx, waves2_scalex;
double waves2_freqy, waves2_scaley;
/* Auger */
double auger_sym, auger_weight;
double auger_freq, auger_scale;
/* If perspective is used, precalculate these values */
/* from the _angle and _dist */
double persp_vsin;
double persp_vfcos;
/* If Julia_N is used, precalculate these values */
double julian_rN;
double julian_cn;
/* If Julia_Scope is used, precalculate these values */
double juliascope_rN;
double juliascope_cn;
/* if Wedge_Julia, precalculate */
double wedgeJulia_rN;
double wedgeJulia_cn;
double wedgeJulia_cf;
/* If Radial_Blur is used, precalculate these values */
double radialBlur_spinvar;
double radialBlur_zoomvar;
/* Precalculate these values for waves */
double waves_dx2;
double waves_dy2;
/* If disc2 is used, precalculate these values */
double disc2_sinadd;
double disc2_cosadd;
double disc2_timespi;
/* If supershape is used, precalculate these values */
double super_shape_pm_4;
double super_shape_pneg1_n1;
int num_active_vars;
double active_var_weights[flam3_nvariations];
int varFunc[flam3_nvariations];
int motion_freq;
int motion_func;
struct xform *motion;
int num_motion;
} flam3_xform;
typedef struct {
char flame_name[flam3_name_len+1]; /* 64 chars plus a null */
double time;
int interpolation;
int interpolation_type;
int palette_interpolation;
int num_xforms;
int final_xform_index;
int final_xform_enable;
flam3_xform *xform;
/* Xaos implementation */
double **chaos;
int chaos_enable;
int genome_index; /* index into source file */
char parent_fname[flam3_parent_fn_len]; /* base filename where parent was located */
int symmetry; /* 0 means none */
flam3_palette palette;
char *input_image; /* preview/temporary! */
int palette_index;
double brightness; /* 1.0 = normal */
double contrast; /* 1.0 = normal */
double gamma;
double highlight_power;
int width, height; /* of the final image */
int spatial_oversample;
double center[2]; /* of camera */
double rot_center[2]; /* really the center */
double rotate; /* camera */
double vibrancy; /* blend between color algs (0=old,1=new) */
double hue_rotation; /* applies to cmap, 0-1 */
double background[3];
double zoom; /* effects ppu, sample density, scale */
double pixels_per_unit; /* vertically */
double spatial_filter_radius; /* radius of spatial filter */
int spatial_filter_select; /* selected spatial filter */
// double (*spatial_filter_func)(double); /* spatial filter kernel function */
// double spatial_filter_support; /* size of standard kernel for specific function */
double sample_density; /* samples per pixel (not bucket) */
/* in order to motion blur more accurately we compute the logs of the
sample density many times and average the results. */
/* nbatches is the number of times the buckets are filtered into
the abucket log accumulator */
/* ntemporal_samples is the number of time steps per batch. this many
interpolated control points are used per batch and accumulated */
int nbatches;
int ntemporal_samples;
/* Density estimation parameters for blurring low density hits */
double estimator; /* Filter width for bin with one hit */
double estimator_curve; /* Exponent on decay function ( MAX / a^(k-1) ) */
double estimator_minimum; /* Minimum filter width used -
forces filter to be used of at least this width on all pts */
/* XML Edit structure */
xmlDocPtr edits;
/* Small-gamma linearization threshold */
double gam_lin_thresh;
/* for cmap_interpolated hack */
int palette_index0;
double hue_rotation0;
int palette_index1;
double hue_rotation1;
double palette_blend;
int temporal_filter_type; /* Temporal filters */
double temporal_filter_width, temporal_filter_exp;
int palette_mode;
} flam3_genome;
typedef struct {
int from;
int to;
double scalar;
} flam3_chaos_entry;
/* xform manipulation */
void flam3_add_motion_element(flam3_xform *xf);
void flam3_add_xforms(flam3_genome *cp, int num_to_add, int interp_padding, int final_flag);
void flam3_delete_xform(flam3_genome *thiscp, int idx_to_delete);
void flam3_copy_xform(flam3_xform *dest, flam3_xform *src);
void flam3_copy(flam3_genome *dest, flam3_genome *src);
void flam3_copyx(flam3_genome *dest, flam3_genome *src, int num_std, int num_final);
void flam3_copy_params(flam3_xform *dest, flam3_xform *src, int varn);
void flam3_delete_motion_elements(flam3_xform *xf);
EXPORT int flam3_xform_preview(flam3_genome *cp, int xi, double range, int numvals, int depth, double *result, randctx *rc);
EXPORT unsigned short* flam3_create_xform_distrib(flam3_genome *cp);
int flam3_create_chaos_distrib(flam3_genome *cp, int xi, unsigned short *xform_distrib);
int flam3_check_unity_chaos(flam3_genome *cp);
void clear_cp(flam3_genome *cp, int def_flag);
/* samples is array nsamples*4 long of x,y,color triples.
using (samples[0], samples[1]) as starting XY point and
(samples[2], samples[3]) as starting color coordinate,
perform fuse iterations and throw them away, then perform
nsamples iterations and save them in the samples array */
EXPORT int flam3_iterate(flam3_genome *g, int nsamples, int fuse, double *samples,
unsigned short *xform_distrib, randctx *rc);
void apply_motion_parameters(flam3_xform *xf, flam3_xform *addto, double blend);
/* genomes is array ngenomes long, with times set and in ascending order.
interpolate to the requested time and return in result */
EXPORT void flam3_interpolate(flam3_genome *genomes, int ngenomes, double time, double stagger, flam3_genome *result);
/* print genome to given file with extra_attributes if not NULL */
void flam3_print(FILE *f, flam3_genome *g, char *extra_attributes, int print_edits);
void flam3_print_xform(FILE *f, flam3_xform *x, int final_flag, int numstd, double *chaos_row, int motion_flag);
char *flam3_print_to_string(flam3_genome *cp);
/* ivars is a list of variations to use, or flam3_variation_random */
/* ivars_n is the number of values in ivars to select from. */
/* sym is either a symmetry group or 0 meaning random or no symmetry */
/* spec_xforms specifies the number of xforms to use, setting to 0 makes the number random. */
EXPORT void flam3_random(flam3_genome *g, int *ivars, int ivars_n, int sym, int spec_xforms);
void add_to_action(char *action, char *addtoaction);
EXPORT void flam3_mutate(flam3_genome *cp, int mutate_mode, int *ivars, int ivars_n, int sym, double speed, randctx *rc, char *action);
EXPORT void flam3_cross(flam3_genome *cp0, flam3_genome *cp1, flam3_genome *out, int cross_mode, randctx *rc, char *action);
/* return NULL in case of error */
EXPORT flam3_genome *flam3_parse_xml2(char *s, char *fn, int default_flag, int *ncps);
flam3_genome *flam3_parse_from_file(FILE *f, char *fn, int default_flag, int *ncps);
void flam3_add_symmetry(flam3_genome *g, int sym);
void flam3_improve_colors(flam3_genome *g, int ntries, int change_palette, int color_resolution);
EXPORT int flam3_colorhist(flam3_genome *cp, int num_batches, double *hist);
EXPORT int flam3_estimate_bounding_box(flam3_genome *g, double eps, int nsamples,
double *bmin, double *bmax, randctx *rc);
void flam3_rotate(flam3_genome *g, double angle, int interp_type); /* angle in degrees */
double flam3_dimension(flam3_genome *g, int ntries, int clip_to_camera);
double flam3_lyapunov(flam3_genome *g, int ntries);
void flam3_apply_template(flam3_genome *cp, flam3_genome *templ);
EXPORT int flam3_count_nthreads(void);
typedef struct {
// double temporal_filter_radius;
double pixel_aspect_ratio; /* width over height of each pixel */
flam3_genome *genomes;
int ngenomes;
int verbose;
int bits;
int bytes_per_channel;
int earlyclip;
double time;
int (*progress)(void *, double, int, double);
void *progress_parameter;
randctx rc;
int nthreads;
int sub_batch_size;
} flam3_frame;
#define flam3_field_both 0
#define flam3_field_even 1
#define flam3_field_odd 2
/* out is pixel array.
pixels are rgb or rgba if nchan is 3 or 4. */
EXPORT int flam3_render(flam3_frame *f, void *out, int field, int nchan, int transp, stat_struct *stats);
EXPORT double flam3_render_memory_required(flam3_frame *f);
EXPORT int flam3_make_strip(flam3_genome *cp, int nstrips, int stripnum);
void rotate_by(double *p, double *center, double by);
double flam3_random01();
double flam3_random11();
int flam3_random_bit();
/* ISAAC random numbers */
double flam3_random_isaac_01(randctx *);
double flam3_random_isaac_11(randctx *);
int flam3_random_isaac_bit(randctx *);
EXPORT void flam3_init_frame(flam3_frame *f);
/* External memory helpers */
EXPORT void *flam3_malloc(size_t size);
EXPORT void flam3_free(void *ptr);
void flam3_srandom();
flam3_genome *sheep_loop(flam3_genome *cp, double blend);
flam3_genome *sheep_edge(flam3_genome *cp, double blend, int seqflag, double stagger);
/* Motion function indices */
#define MOTION_SIN 1
#define MOTION_TRIANGLE 2
#define MOTION_HILL 3
/* Mutation modes */
#define MUTATE_NOT_SPECIFIED -1
#define MUTATE_ALL_VARIATIONS 0
#define MUTATE_ONE_XFORM_COEFS 1
#define MUTATE_ADD_SYMMETRY 2
#define MUTATE_POST_XFORMS 3
#define MUTATE_COLOR_PALETTE 4
#define MUTATE_DELETE_XFORM 5
#define MUTATE_ALL_COEFS 6
/* Cross modes */
#define CROSS_NOT_SPECIFIED -1
#define CROSS_UNION 0
#define CROSS_INTERPOLATE 1
#define CROSS_ALTERNATE 2
#endif

12
src/flam3.pc.in Normal file
View File

@ -0,0 +1,12 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
datarootdir=@datarootdir@
Name: flam3
Description: Renders and animates fractal flames and manipulates their genetic codes, see www.flam3.com for more info.
Version: @VERSION@
Requires: libpng12 >= 1.0 libxml-2.0
Libs: -L${libdir} -lflam3 -ljpeg -lpthread
Cflags: -I${includedir}

146
src/genome.dsp Normal file
View File

@ -0,0 +1,146 @@
# Microsoft Developer Studio Project File - Name="pick" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=pick - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "genome.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "genome.mak" CFG="pick - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "pick - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "pick - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "pick - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "c:\src\libpng" /I "c:\src\zlib" /I "c:\src\libxml2\include" /I "c:\src\jpeg" /I "c:\src\iconv\include" /I "c:\src\pthreads" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /Zm1000 /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\src\jpeg\libjpeg.lib c:\src\libpng\libpng.lib c:\src\libxml2\lib\libxml2.lib c:\src\zlib\zlib.lib c:\src\pthreads\pthreadVC2.lib /nologo /subsystem:console /machine:I386 /out:"Release/flam3-genome.exe"
!ELSEIF "$(CFG)" == "pick - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "c:\src\libpng" /I "c:\src\libxml2\include" /I "c:\src\jpeg" /I "c:\src\iconv\include" /I "c:\src\zlib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /Zm1000 /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\src\jpeg\libjpeg.lib c:\src\libpng\libpng.lib c:\src\libxml2\lib\libxml2.lib c:\src\zlib\zlib.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "pick - Win32 Release"
# Name "pick - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\docstring.c
# End Source File
# Begin Source File
SOURCE=".\flam3-genome.c"
# End Source File
# Begin Source File
SOURCE=".\flam3-palettes.c"
# End Source File
# Begin Source File
SOURCE=.\flam3.c
# End Source File
# Begin Source File
SOURCE=.\isaac.c
# End Source File
# Begin Source File
SOURCE=.\jpeg.c
# End Source File
# Begin Source File
SOURCE=.\png.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=cmap.h
# End Source File
# Begin Source File
SOURCE=config.h
# End Source File
# Begin Source File
SOURCE=jpeg.h
# End Source File
# Begin Source File
SOURCE=libifs.h
# End Source File
# Begin Source File
SOURCE=rect.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

44
src/img.h Normal file
View File

@ -0,0 +1,44 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include "flam3.h"
#define FLAM3_PNG_COM 8
#ifdef WIN32
#define snprintf _snprintf
#endif
typedef struct {
char *genome;
char *badvals;
char *numiters;
char *rtime;
} flam3_img_comments;
void write_jpeg(FILE *file, unsigned char *image, int width, int height, flam3_img_comments *fpc);
void write_png(FILE *file, void *image, int width, int height, flam3_img_comments *fpc, int bpc);
/* returns RGBA pixel array or NULL on failure */
unsigned char *read_png(FILE *file, int *width, int *height);
unsigned char *read_jpeg(FILE *file, int *width, int *height);

250
src/install-sh Executable file
View File

@ -0,0 +1,250 @@
#!/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=:
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

956
src/interpolation.c Normal file
View File

@ -0,0 +1,956 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "interpolation.h"
#include "palettes.h"
double adjust_percentage(double in) {
if (in==0.0)
return(0.0);
else
return(pow(10.0, -log(1.0/in)/log(2)));
}
double motion_funcs(int funcnum, double timeval) {
/* motion funcs should be cyclic, and equal to 0 at integral time values */
/* abs peak values should be not be greater than 1 */
if (funcnum==MOTION_SIN) {
return (sin(2.0*M_PI*timeval));
} else if (funcnum==MOTION_TRIANGLE) {
double fr = fmod(timeval,1.0);
if (fr<0) fr+= 1.0;
if (fr<=.25)
fr = 4.0 * fr;
else if (fr<=.75)
fr = -4.0 * fr + 2.0;
else
fr = 4.0 * fr - 4.0;
return(fr);
} else { //if (funcnum==MOTION_HILL) {
return( (1.0-cos(2.0*M_PI*timeval)) * 0.5);
}
}
double det_matrix(double s[2][2]) {
return s[0][0] * s[1][1] - s[0][1] * s[1][0];
}
int id_matrix(double s[3][2]) {
return
(s[0][0] == 1.0) &&
(s[0][1] == 0.0) &&
(s[1][0] == 0.0) &&
(s[1][1] == 1.0) &&
(s[2][0] == 0.0) &&
(s[2][1] == 0.0);
}
int zero_matrix(double s[3][2]) {
return
(s[0][0] == 0.0) &&
(s[0][1] == 0.0) &&
(s[1][0] == 0.0) &&
(s[1][1] == 0.0) &&
(s[2][0] == 0.0) &&
(s[2][1] == 0.0);
}
void copy_matrix(double to[3][2], double from[3][2]) {
to[0][0] = from[0][0];
to[0][1] = from[0][1];
to[1][0] = from[1][0];
to[1][1] = from[1][1];
to[2][0] = from[2][0];
to[2][1] = from[2][1];
}
void clear_matrix(double m[3][2]) {
m[0][0] = 0.0;
m[0][1] = 0.0;
m[1][0] = 0.0;
m[1][1] = 0.0;
m[2][0] = 0.0;
m[2][1] = 0.0;
}
void sum_matrix(double s, double m1[3][2], double m2[3][2]) {
m2[0][0] += s * m1[0][0];
m2[0][1] += s * m1[0][1];
m2[1][0] += s * m1[1][0];
m2[1][1] += s * m1[1][1];
m2[2][0] += s * m1[2][0];
m2[2][1] += s * m1[2][1];
}
void mult_matrix(double s1[2][2], double s2[2][2], double d[2][2]) {
d[0][0] = s1[0][0] * s2[0][0] + s1[1][0] * s2[0][1];
d[1][0] = s1[0][0] * s2[1][0] + s1[1][0] * s2[1][1];
d[0][1] = s1[0][1] * s2[0][0] + s1[1][1] * s2[0][1];
d[1][1] = s1[0][1] * s2[1][0] + s1[1][1] * s2[1][1];
}
int compare_xforms(const void *av, const void *bv) {
flam3_xform *a = (flam3_xform *) av;
flam3_xform *b = (flam3_xform *) bv;
double aa[2][2];
double bb[2][2];
double ad, bd;
aa[0][0] = a->c[0][0];
aa[0][1] = a->c[0][1];
aa[1][0] = a->c[1][0];
aa[1][1] = a->c[1][1];
bb[0][0] = b->c[0][0];
bb[0][1] = b->c[0][1];
bb[1][0] = b->c[1][0];
bb[1][1] = b->c[1][1];
ad = det_matrix(aa);
bd = det_matrix(bb);
if (a->color_speed > b->color_speed) return 1;
if (a->color_speed < b->color_speed) return -1;
if (a->color_speed) {
if (ad < 0) return -1;
if (bd < 0) return 1;
ad = atan2(a->c[0][0], a->c[0][1]);
bd = atan2(b->c[0][0], b->c[0][1]);
}
if (ad < bd) return -1;
if (ad > bd) return 1;
return 0;
}
void interpolate_cmap(flam3_palette cmap, double blend,
int index0, double hue0, int index1, double hue1) {
flam3_palette p0,p1;
int i, j;
flam3_get_palette(index0, p0, hue0);
flam3_get_palette(index1, p1, hue1);
for (i = 0; i < 256; i++) {
double t[5], s[5];
rgb2hsv(p0[i].color, s);
rgb2hsv(p1[i].color, t);
s[3] = p0[i].color[3];
t[3] = p1[i].color[3];
s[4] = p0[i].index;
t[4] = p1[i].index;
for (j = 0; j < 5; j++)
t[j] = ((1.0-blend) * s[j]) + (blend * t[j]);
hsv2rgb(t, cmap[i].color);
cmap[i].color[3] = t[3];
cmap[i].index = t[4];
}
}
void interp_and_convert_back(double *c, int ncps, int xfi, double cxang[4][2],
double cxmag[4][2], double cxtrn[4][2],double store_array[3][2]) {
int i,col;
double accang[2],accmag[2];
double expmag;
int accmode[2];
accang[0] = 0.0;
accang[1] = 0.0;
accmag[0] = 0.0;
accmag[1] = 0.0;
accmode[0]=accmode[1]=0;
/* accumulation mode defaults to logarithmic, but in special */
/* cases we want to switch to linear accumulation */
for (col=0; col<2; col++) {
for (i=0; i<ncps; i++) {
if (log(cxmag[i][col])<-10)
accmode[col]=1; // Mode set to linear interp
}
}
for (i=0; i<ncps; i++) {
for (col=0; col<2; col++) {
accang[col] += c[i] * cxang[i][col];
if (accmode[col]==0)
accmag[col] += c[i] * log(cxmag[i][col]);
else
accmag[col] += c[i] * (cxmag[i][col]);
/* translation is ready to go */
store_array[2][col] += c[i] * cxtrn[i][col];
}
}
/* Convert the angle back to rectangular */
for (col=0;col<2;col++) {
if (accmode[col]==0)
expmag = exp(accmag[col]);
else
expmag = accmag[col];
store_array[col][0] = expmag * cos(accang[col]);
store_array[col][1] = expmag * sin(accang[col]);
}
}
void convert_linear_to_polar(flam3_genome *cp, int ncps, int xfi, int cflag,
double cxang[4][2], double cxmag[4][2], double cxtrn[4][2]) {
double c1[2],d,t,refang;
int col,k;
int zlm[2];
for (k=0; k<ncps;k++) {
/* Establish the angles and magnitudes for each component */
/* Keep translation linear */
zlm[0]=zlm[1]=0;
for (col=0;col<2;col++) {
if (cflag==0) {
c1[0] = cp[k].xform[xfi].c[col][0];
c1[1] = cp[k].xform[xfi].c[col][1];
t = cp[k].xform[xfi].c[2][col];
} else {
c1[0] = cp[k].xform[xfi].post[col][0];
c1[1] = cp[k].xform[xfi].post[col][1];
t = cp[k].xform[xfi].post[2][col];
}
cxang[k][col] = atan2(c1[1],c1[0]);
cxmag[k][col] = sqrt(c1[0]*c1[0] + c1[1]*c1[1]);
if (cxmag[k][col]== 0.0)
zlm[col]=1;
cxtrn[k][col] = t;
}
if (zlm[0]==1 && zlm[1]==0)
cxang[k][0] = cxang[k][1];
else if (zlm[0]==0 && zlm[1]==1)
cxang[k][1] = cxang[k][0];
}
/* Make sure the rotation is the shorter direction around the circle */
/* by adjusting each angle in succession, and rotate clockwise if 180 degrees */
for (col=0; col<2; col++) {
for (k=1;k<ncps;k++) {
/* Adjust angles differently if we have an asymmetric case */
if (cp[k].xform[xfi].wind[col]>0 && cflag==0) {
/* Adjust the angles to make sure that it's within wind:wind+2pi */
refang = cp[k].xform[xfi].wind[col] - 2*M_PI;
/* Make sure both angles are within [refang refang+2*pi] */
while(cxang[k-1][col] < refang)
cxang[k-1][col] += 2*M_PI;
while(cxang[k-1][col] > refang + 2*M_PI)
cxang[k-1][col] -= 2*M_PI;
while(cxang[k][col] < refang)
cxang[k][col] += 2*M_PI;
while(cxang[k][col] > refang + 2*M_PI)
cxang[k][col] -= 2*M_PI;
} else {
/* Normal way of adjusting angles */
d = cxang[k][col]-cxang[k-1][col];
/* Adjust to avoid the -pi/pi discontinuity */
if (d > M_PI+EPS)
cxang[k][col] -= 2*M_PI;
else if (d < -(M_PI-EPS) ) /* Forces clockwise rotation at 180 */
cxang[k][col] += 2*M_PI;
}
}
}
}
void interpolate_catmull_rom(flam3_genome cps[], double t, flam3_genome *result) {
double t2 = t * t;
double t3 = t2 * t;
double cmc[4];
cmc[0] = (2*t2 - t - t3) / 2;
cmc[1] = (3*t3 - 5*t2 + 2) / 2;
cmc[2] = (4*t2 - 3*t3 + t) / 2;
cmc[3] = (t3 - t2) / 2;
flam3_interpolate_n(result, 4, cps, cmc, 0);
}
double smoother(double t) {
return 3*t*t - 2*t*t*t;
}
double get_stagger_coef(double t, double stagger_prc, int num_xforms, int this_xform) {
/* max_stag is the spacing between xform start times if stagger_prc = 1.0 */
double max_stag = (double)(num_xforms-1)/num_xforms;
/* scale the spacing by stagger_prc */
double stag_scaled = stagger_prc * max_stag;
/* t ranges from 1 to 0 (the contribution of cp[0] to the blend) */
/* the first line below makes the first xform interpolate first */
/* the second line makes the last xform interpolate first */
double st = stag_scaled * (num_xforms - 1 - this_xform) / (num_xforms-1);
// double st = stag_scaled * (this_xform) / (num_xforms-1);
double et = st + (1-stag_scaled);
// printf("t=%f xf:%d st=%f et=%f : : %f\n",t,this_xform,st,et,smoother((t-st)/(1-stag_scaled)));
if (t <= st)
return (0);
else if (t >= et)
return (1);
else
return ( smoother((t-st)/(1-stag_scaled)) );
}
/* all cpi and result must be aligned (have the same number of xforms,
and have final xform in the same slot) */
void flam3_interpolate_n(flam3_genome *result, int ncp,
flam3_genome *cpi, double *c, double stagger) {
int i, j, k, numstd;
if (flam3_palette_interpolation_hsv == cpi[0].palette_interpolation) {
for (i = 0; i < 256; i++) {
double t[3], s[4];
s[0] = s[1] = s[2] = s[3] = s[4] = 0.0;
for (k = 0; k < ncp; k++) {
rgb2hsv(cpi[k].palette[i].color, t);
for (j = 0; j < 3; j++)
s[j] += c[k] * t[j];
s[3] += c[k] * cpi[k].palette[i].color[3];
s[4] += c[k] * cpi[k].palette[i].index;
}
hsv2rgb(s, result->palette[i].color);
result->palette[i].color[3] = s[3];
result->palette[i].index = s[4];
for (j = 0; j < 4; j++) {
if (result->palette[i].color[j] < 0.0)
result->palette[i].color[j] = 0.0;
if (result->palette[i].color[j] > 1.0)
result->palette[i].color[j] = 1.0;
}
if (result->palette[i].index < 0.0)
result->palette[i].index = 0.0;
if (result->palette[i].index > 255.0)
result->palette[i].index = 255.0;
}
} else {
/* Sweep - not the best option for float indices */
for (i = 0; i < 256; i++) {
j = (i < (256 * c[0])) ? 0 : 1;
result->palette[i] = cpi[j].palette[i];
}
}
result->palette_index = flam3_palette_random;
result->symmetry = 0;
result->spatial_filter_select = cpi[0].spatial_filter_select;
result->temporal_filter_type = cpi[0].temporal_filter_type;
result->palette_mode = cpi[0].palette_mode;
result->interpolation_type = cpi[0].interpolation_type;
INTERP(brightness);
INTERP(contrast);
INTERP(highlight_power);
INTERP(gamma);
INTERP(vibrancy);
INTERP(hue_rotation);
INTERI(width);
INTERI(height);
INTERI(spatial_oversample);
INTERP(center[0]);
INTERP(center[1]);
INTERP(rot_center[0]);
INTERP(rot_center[1]);
INTERP(background[0]);
INTERP(background[1]);
INTERP(background[2]);
INTERP(pixels_per_unit);
INTERP(spatial_filter_radius);
INTERP(temporal_filter_exp);
INTERP(temporal_filter_width);
INTERP(sample_density);
INTERP(zoom);
INTERP(rotate);
INTERI(nbatches);
INTERI(ntemporal_samples);
INTERP(estimator);
INTERP(estimator_minimum);
INTERP(estimator_curve);
INTERP(gam_lin_thresh);
/* Interpolate the chaos array */
numstd = cpi[0].num_xforms - (cpi[0].final_xform_index >= 0);
for (i=0;i<numstd;i++) {
for (j=0;j<numstd;j++) {
INTERP(chaos[i][j]);
if (result->chaos[i][j]<0) result->chaos[i][j]=0;
//chaos can be > 1
//if (result->chaos[i][j]>1) result->chaos[i][j]=1.0;
}
}
/* Interpolate each xform */
for (i = 0; i < cpi[0].num_xforms; i++) {
double csave[2];
double td;
int all_id;
int nx = cpi[0].num_xforms-(cpi[0].final_xform_index>=0);
if (ncp==2 && stagger>0 && i!=cpi[0].final_xform_index) {
csave[0] = c[0];
csave[1] = c[1];
c[0] = get_stagger_coef(csave[0],stagger,nx,i);
c[1] = 1.0-c[0];
}
INTERP(xform[i].density);
td = result->xform[i].density;
result->xform[i].density = (td < 0.0) ? 0.0 : td;
INTERP(xform[i].color);
if (result->xform[i].color<0) result->xform[i].color=0;
if (result->xform[i].color>1) result->xform[i].color=1;
INTERP(xform[i].color_speed);
if (result->xform[i].color_speed<0) result->xform[i].color_speed=0;
if (result->xform[i].color_speed>1) result->xform[i].color_speed=1;
INTERP(xform[i].opacity);
INTERP(xform[i].animate);
INTERP(xform[i].blob_low);
INTERP(xform[i].blob_high);
INTERP(xform[i].blob_waves);
INTERP(xform[i].pdj_a);
INTERP(xform[i].pdj_b);
INTERP(xform[i].pdj_c);
INTERP(xform[i].pdj_d);
INTERP(xform[i].fan2_x);
INTERP(xform[i].fan2_y);
INTERP(xform[i].rings2_val);
INTERP(xform[i].perspective_angle);
INTERP(xform[i].perspective_dist);
INTERP(xform[i].julian_power);
INTERP(xform[i].julian_dist);
INTERP(xform[i].juliascope_power);
INTERP(xform[i].juliascope_dist);
INTERP(xform[i].radial_blur_angle);
INTERP(xform[i].pie_slices);
INTERP(xform[i].pie_rotation);
INTERP(xform[i].pie_thickness);
INTERP(xform[i].ngon_sides);
INTERP(xform[i].ngon_power);
INTERP(xform[i].ngon_circle);
INTERP(xform[i].ngon_corners);
INTERP(xform[i].curl_c1);
INTERP(xform[i].curl_c2);
INTERP(xform[i].rectangles_x);
INTERP(xform[i].rectangles_y);
INTERP(xform[i].amw_amp);
INTERP(xform[i].disc2_rot);
INTERP(xform[i].disc2_twist);
INTERP(xform[i].super_shape_rnd);
INTERP(xform[i].super_shape_m);
INTERP(xform[i].super_shape_n1);
INTERP(xform[i].super_shape_n2);
INTERP(xform[i].super_shape_n3);
INTERP(xform[i].super_shape_holes);
INTERP(xform[i].flower_petals);
INTERP(xform[i].flower_holes);
INTERP(xform[i].conic_eccentricity);
INTERP(xform[i].conic_holes);
INTERP(xform[i].parabola_height);
INTERP(xform[i].parabola_width);
INTERP(xform[i].bent2_x);
INTERP(xform[i].bent2_y);
INTERP(xform[i].bipolar_shift);
INTERP(xform[i].cell_size);
INTERP(xform[i].cpow_r);
INTERP(xform[i].cpow_i);
INTERP(xform[i].cpow_power);
INTERP(xform[i].curve_xamp);
INTERP(xform[i].curve_yamp);
INTERP(xform[i].curve_xlength);
INTERP(xform[i].curve_ylength);
INTERP(xform[i].escher_beta);
INTERP(xform[i].lazysusan_x);
INTERP(xform[i].lazysusan_y);
INTERP(xform[i].lazysusan_twist);
INTERP(xform[i].lazysusan_space);
INTERP(xform[i].lazysusan_spin);
INTERP(xform[i].modulus_x);
INTERP(xform[i].modulus_y);
INTERP(xform[i].oscope_separation);
INTERP(xform[i].oscope_frequency);
INTERP(xform[i].oscope_amplitude);
INTERP(xform[i].oscope_damping);
INTERP(xform[i].popcorn2_x);
INTERP(xform[i].popcorn2_y);
INTERP(xform[i].popcorn2_c);
INTERP(xform[i].separation_x);
INTERP(xform[i].separation_xinside);
INTERP(xform[i].separation_y);
INTERP(xform[i].separation_yinside);
INTERP(xform[i].split_xsize);
INTERP(xform[i].split_ysize);
INTERP(xform[i].splits_x);
INTERP(xform[i].splits_y);
INTERP(xform[i].stripes_space);
INTERP(xform[i].stripes_warp);
INTERP(xform[i].wedge_angle);
INTERP(xform[i].wedge_hole);
INTERP(xform[i].wedge_count);
INTERP(xform[i].wedge_swirl);
INTERP(xform[i].wedge_julia_angle);
INTERP(xform[i].wedge_julia_count);
INTERP(xform[i].wedge_julia_power);
INTERP(xform[i].wedge_julia_dist);
INTERP(xform[i].wedge_sph_angle);
INTERP(xform[i].wedge_sph_hole);
INTERP(xform[i].wedge_sph_count);
INTERP(xform[i].wedge_sph_swirl);
INTERP(xform[i].whorl_inside);
INTERP(xform[i].whorl_outside);
INTERP(xform[i].waves2_scalex);
INTERP(xform[i].waves2_scaley);
INTERP(xform[i].waves2_freqx);
INTERP(xform[i].waves2_freqy);
for (j = 0; j < flam3_nvariations; j++)
INTERP(xform[i].var[j]);
if (flam3_inttype_log == cpi[0].interpolation_type) {
double cxmag[4][2]; // XXX why only 4? should be ncp
double cxang[4][2];
double cxtrn[4][2];
/* affine part */
clear_matrix(result->xform[i].c);
convert_linear_to_polar(cpi,ncp,i,0,cxang,cxmag,cxtrn);
interp_and_convert_back(c, ncp, i, cxang, cxmag, cxtrn,result->xform[i].c);
/* post part */
all_id = 1;
for (k=0; k<ncp; k++)
all_id &= id_matrix(cpi[k].xform[i].post);
clear_matrix(result->xform[i].post);
if (all_id) {
result->xform[i].post[0][0] = 1.0;
result->xform[i].post[1][1] = 1.0;
} else {
convert_linear_to_polar(cpi,ncp,i,1,cxang,cxmag,cxtrn);
interp_and_convert_back(c, ncp, i, cxang, cxmag, cxtrn,result->xform[i].post);
}
} else {
/* Interpolate c matrix & post */
clear_matrix(result->xform[i].c);
clear_matrix(result->xform[i].post);
all_id = 1;
for (k = 0; k < ncp; k++) {
sum_matrix(c[k], cpi[k].xform[i].c, result->xform[i].c);
sum_matrix(c[k], cpi[k].xform[i].post, result->xform[i].post);
all_id &= id_matrix(cpi[k].xform[i].post);
}
if (all_id) {
clear_matrix(result->xform[i].post);
result->xform[i].post[0][0] = 1.0;
result->xform[i].post[1][1] = 1.0;
}
}
if (ncp==2 && stagger>0 && i!=cpi[0].final_xform_index) {
c[0] = csave[0];
c[1] = csave[1];
}
}
}
void establish_asymmetric_refangles(flam3_genome *cp, int ncps) {
int k, xfi, col;
double cxang[4][2],d,c1[2];
for (xfi=0; xfi<cp[0].num_xforms; xfi++) {
/* Final xforms don't rotate regardless of their symmetry */
if (cp[0].final_xform_enable==1 && xfi==cp[0].final_xform_index)
continue;
for (k=0; k<ncps;k++) {
/* Establish the angle for each component */
/* Should potentially functionalize */
for (col=0;col<2;col++) {
c1[0] = cp[k].xform[xfi].c[col][0];
c1[1] = cp[k].xform[xfi].c[col][1];
cxang[k][col] = atan2(c1[1],c1[0]);
}
}
for (k=1; k<ncps; k++) {
for (col=0;col<2;col++) {
int sym0,sym1;
int padsymflag;
d = cxang[k][col]-cxang[k-1][col];
/* Adjust to avoid the -pi/pi discontinuity */
if (d > M_PI+EPS)
cxang[k][col] -= 2*M_PI;
else if (d < -(M_PI-EPS) )
cxang[k][col] += 2*M_PI;
/* If this is an asymmetric case, store the NON-symmetric angle */
/* Check them pairwise and store the reference angle in the second */
/* to avoid overwriting if asymmetric on both sides */
padsymflag = 0;
sym0 = (cp[k-1].xform[xfi].animate==0 || (cp[k-1].xform[xfi].padding==1 && padsymflag));
sym1 = (cp[k].xform[xfi].animate==0 || (cp[k].xform[xfi].padding==1 && padsymflag));
if ( sym1 && !sym0 )
cp[k].xform[xfi].wind[col] = cxang[k-1][col] + 2*M_PI;
else if ( sym0 && !sym1 )
cp[k].xform[xfi].wind[col] = cxang[k][col] + 2*M_PI;
}
}
}
}
void flam3_align(flam3_genome *dst, flam3_genome *src, int nsrc) {
int i, tfx, tnx, max_nx = 0, max_fx = 0;
int already_aligned=1;
int xf,j;
int ii,fnd;
double normed;
int usethisone;
usethisone = (nsrc/2) - 1;
max_nx = src[0].num_xforms - (src[0].final_xform_index >= 0);
max_fx = src[0].final_xform_enable;
for (i = 1; i < nsrc; i++) {
tnx = src[i].num_xforms - (src[i].final_xform_index >= 0);
if (max_nx != tnx) {
already_aligned = 0;
if (tnx > max_nx) max_nx = tnx;
}
tfx = src[i].final_xform_enable;
if (max_fx != tfx) {
already_aligned = 0;
max_fx |= tfx;
}
}
/* Pad the cps to equal xforms */
for (i = 0; i < nsrc; i++) {
flam3_copyx(&dst[i], &src[i], max_nx, max_fx);
}
/* Skip if this genome is compatibility mode */
if (dst[usethisone].interpolation_type == flam3_inttype_compat ||
dst[usethisone].interpolation_type == flam3_inttype_older)
return;
/* Check to see if there's a parametric variation present in one xform */
/* but not in an aligned xform. If this is the case, use the parameters */
/* from the xform with the variation as the defaults for the blank one. */
/* All genomes will have the same number of xforms at this point */
/* num = max_nx + max_fx */
for (i = 0; i<nsrc; i++) {
for (xf = 0; xf<max_nx+max_fx; xf++) {
/* Loop over the variations to see which of them are set to 0 */
/* Note that there are no parametric variations < 23 */
for (j = 23; j < flam3_nvariations; j++) {
if (dst[i].xform[xf].var[j]==0) {
if (i>0) {
/* Check to see if the prior genome's xform is populated */
if (dst[i-1].xform[xf].var[j] != 0) {
/* Copy the prior genome's parameters and continue */
flam3_copy_params(&(dst[i].xform[xf]), &(dst[i-1].xform[xf]), j);
continue;
}
} else if (i<nsrc-1) {
/* Check to see if the next genome's xform is populated */
if (dst[i+1].xform[xf].var[j] != 0) {
/* Copy the next genome's parameters and continue */
flam3_copy_params(&(dst[i].xform[xf]), &(dst[i+1].xform[xf]), j);
continue;
}
}
}
} /* variations */
if (dst[i].xform[xf].padding == 1 && !already_aligned) {
/* This is a new xform. Let's see if we can choose a better 'identity' xform. */
/* Check the neighbors to see if any of these variations are used: */
/* rings2, fan2, blob, perspective, julian, juliascope, ngon, curl, super_shape, split */
/* If so, we can use a better starting point for these */
/* Remove linear from the list */
dst[i].xform[xf].var[0] = 0.0;
/* Look through all of the 'companion' xforms to see if we get a match on any of these */
fnd=0;
/* Only do the next substitution for log interpolation */
if ( (i==0 && dst[i].interpolation_type == flam3_inttype_log)
|| (i>0 && dst[i-1].interpolation_type==flam3_inttype_log) ) {
for (ii=-1; ii<=1; ii+=2) {
/* Skip if out of bounds */
if (i+ii<0 || i+ii>=nsrc)
continue;
/* Skip if this is also padding */
if (dst[i+ii].xform[xf].padding==1)
continue;
/* Spherical / Ngon (trumps all others due to holes) */
/* Interpolate these against a 180 degree rotated identity */
/* with weight -1. */
/* Added JULIAN/JULIASCOPE to get rid of black wedges */
if (dst[i+ii].xform[xf].var[VAR_SPHERICAL]>0 ||
dst[i+ii].xform[xf].var[VAR_NGON]>0 ||
dst[i+ii].xform[xf].var[VAR_JULIAN]>0 ||
dst[i+ii].xform[xf].var[VAR_JULIASCOPE]>0 ||
dst[i+ii].xform[xf].var[VAR_POLAR]>0 ||
dst[i+ii].xform[xf].var[VAR_WEDGE_SPH]>0 ||
dst[i+ii].xform[xf].var[VAR_WEDGE_JULIA]>0) {
dst[i].xform[xf].var[VAR_LINEAR] = -1.0;
/* Set the coefs appropriately */
dst[i].xform[xf].c[0][0] = -1.0;
dst[i].xform[xf].c[0][1] = 0.0;
dst[i].xform[xf].c[1][0] = 0.0;
dst[i].xform[xf].c[1][1] = -1.0;
dst[i].xform[xf].c[2][0] = 0.0;
dst[i].xform[xf].c[2][1] = 0.0;
fnd=-1;
}
}
}
if (fnd==0) {
for (ii=-1; ii<=1; ii+=2) {
/* Skip if out of bounds */
if (i+ii<0 || i+ii>=nsrc)
continue;
/* Skip if also padding */
if (dst[i+ii].xform[xf].padding==1)
continue;
/* Rectangles */
if (dst[i+ii].xform[xf].var[VAR_RECTANGLES]>0) {
dst[i].xform[xf].var[VAR_RECTANGLES] = 1.0;
dst[i].xform[xf].rectangles_x = 0.0;
dst[i].xform[xf].rectangles_y = 0.0;
fnd++;
}
/* Rings 2 */
if (dst[i+ii].xform[xf].var[VAR_RINGS2]>0) {
dst[i].xform[xf].var[VAR_RINGS2] = 1.0;
dst[i].xform[xf].rings2_val = 0.0;
fnd++;
}
/* Fan 2 */
if (dst[i+ii].xform[xf].var[VAR_FAN2]>0) {
dst[i].xform[xf].var[VAR_FAN2] = 1.0;
dst[i].xform[xf].fan2_x = 0.0;
dst[i].xform[xf].fan2_y = 0.0;
fnd++;
}
/* Blob */
if (dst[i+ii].xform[xf].var[VAR_BLOB]>0) {
dst[i].xform[xf].var[VAR_BLOB] = 1.0;
dst[i].xform[xf].blob_low = 1.0;
dst[i].xform[xf].blob_high = 1.0;
dst[i].xform[xf].blob_waves = 1.0;
fnd++;
}
/* Perspective */
if (dst[i+ii].xform[xf].var[VAR_PERSPECTIVE]>0) {
dst[i].xform[xf].var[VAR_PERSPECTIVE] = 1.0;
dst[i].xform[xf].perspective_angle = 0.0;
/* Keep the perspective distance as-is */
fnd++;
}
/* Curl */
if (dst[i+ii].xform[xf].var[VAR_CURL]>0) {
dst[i].xform[xf].var[VAR_CURL] = 1.0;
dst[i].xform[xf].curl_c1 = 0.0;
dst[i].xform[xf].curl_c2 = 0.0;
fnd++;
}
/* Super-Shape */
if (dst[i+ii].xform[xf].var[VAR_SUPER_SHAPE]>0) {
dst[i].xform[xf].var[VAR_SUPER_SHAPE] = 1.0;
/* Keep supershape_m the same */
dst[i].xform[xf].super_shape_n1 = 2.0;
dst[i].xform[xf].super_shape_n2 = 2.0;
dst[i].xform[xf].super_shape_n3 = 2.0;
dst[i].xform[xf].super_shape_rnd = 0.0;
dst[i].xform[xf].super_shape_holes = 0.0;
fnd++;
}
}
}
/* If we didn't have any matches with those, */
/* try the affine ones, fan and rings */
if (fnd==0) {
for (ii=-1; ii<=1; ii+=2) {
/* Skip if out of bounds */
if (i+ii<0 || i+ii>=nsrc)
continue;
/* Skip if also a padding xform */
if (dst[i+ii].xform[xf].padding==1)
continue;
/* Fan */
if (dst[i+ii].xform[xf].var[VAR_FAN]>0) {
dst[i].xform[xf].var[VAR_FAN] = 1.0;
fnd++;
}
/* Rings */
if (dst[i+ii].xform[xf].var[VAR_RINGS]>0) {
dst[i].xform[xf].var[VAR_RINGS] = 1.0;
fnd++;
}
}
if (fnd>0) {
/* Set the coefs appropriately */
dst[i].xform[xf].c[0][0] = 0.0;
dst[i].xform[xf].c[0][1] = 1.0;
dst[i].xform[xf].c[1][0] = 1.0;
dst[i].xform[xf].c[1][1] = 0.0;
dst[i].xform[xf].c[2][0] = 0.0;
dst[i].xform[xf].c[2][1] = 0.0;
}
}
/* If we still have no matches, switch back to linear */
if (fnd==0)
dst[i].xform[xf].var[VAR_LINEAR] = 1.0;
else if (fnd>0) {
/* Otherwise, go through and normalize the weights. */
normed = 0.0;
for (j = 0; j < flam3_nvariations; j++)
normed += dst[i].xform[xf].var[j];
for (j = 0; j < flam3_nvariations; j++)
dst[i].xform[xf].var[j] /= normed;
}
}
} /* xforms */
} /* genomes */
}

58
src/interpolation.h Normal file
View File

@ -0,0 +1,58 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef interpolation_included
#define interpolation_included
#include "private.h"
#define INTERP(x) do { result->x = 0.0; \
for (k = 0; k < ncp; k++) result->x += c[k] * cpi[k].x; } while(0)
#define INTERI(x) do { double tt = 0.0; \
for (k = 0; k < ncp; k++) tt += c[k] * cpi[k].x; \
result->x = (int)rint(tt); } while(0)
double adjust_percentage(double in);
double motion_funcs(int funcnum, double timeval);
double smoother(double t);
double get_stagger_coef(double t, double stagger_prc, int num_xforms, int this_xform);
double det_matrix(double s[2][2]);
int id_matrix(double s[3][2]);
int zero_matrix(double s[3][2]);
void copy_matrix(double to[3][2], double from[3][2]);
void clear_matrix(double m[3][2]);
void sum_matrix(double s, double m1[3][2], double m2[3][2]);
void mult_matrix(double s1[2][2], double s2[2][2], double d[2][2]);
int compare_xforms(const void *av, const void *bv);
void interpolate_cmap(flam3_palette cmap, double blend,
int index0, double hue0, int index1, double hue1);
void interp_and_convert_back(double *c, int ncps, int xfi, double cxang[4][2],
double cxmag[4][2], double cxtrn[4][2],double store_array[3][2]);
void convert_linear_to_polar(flam3_genome *cp, int ncps, int xfi, int cflag,
double cxang[4][2], double cxmag[4][2], double cxtrn[4][2]);
void interpolate_catmull_rom(flam3_genome cps[], double t, flam3_genome *result);
void flam3_interpolate_n(flam3_genome *result, int ncp, flam3_genome *cpi, double *c, double stagger);
void establish_asymmetric_refangles(flam3_genome *cp, int ncps);
void flam3_align(flam3_genome *dst, flam3_genome *src, int nsrc);
#endif

110
src/isaac.c Normal file
View File

@ -0,0 +1,110 @@
/*
------------------------------------------------------------------------------
isaac.c: By Bob Jenkins. My random number generator, ISAAC.
MODIFIED:
960327: Creation (addition of randinit, really)
970719: use context, not global variables, for internal state
980324: make a portable version
991209: modified for inclusion with GNU Backgammon by Gary Wong
070121: modified for inclusion with flam3 by Erik Reckase
------------------------------------------------------------------------------
*/
#include "isaacs.h"
#include "isaac.h"
#define ind(mm,x) ((mm)[(x>>2)&(RANDSIZ-1)])
#define rngstep(mix,a,b,mm,m,m2,r,x) \
{ \
x = *m; \
a = ((a^(mix)) + *(m2++)) & 0xffffffff; \
*(m++) = y = (ind(mm,x) + a + b) & 0xffffffff; \
*(r++) = b = (ind(mm,y>>RANDSIZL) + x) & 0xffffffff; \
}
void isaac(randctx *ctx)
{
register ub4 a,b,x,y,*m,*mm,*m2,*r,*mend;
mm=ctx->randmem; r=ctx->randrsl;
a = ctx->randa; b = (ctx->randb + (++ctx->randc)) & 0xffffffff;
for (m = mm, mend = m2 = m+(RANDSIZ/2); m<mend; )
{
rngstep( a<<13, a, b, mm, m, m2, r, x);
rngstep( a>>6 , a, b, mm, m, m2, r, x);
rngstep( a<<2 , a, b, mm, m, m2, r, x);
rngstep( a>>16, a, b, mm, m, m2, r, x);
}
for (m2 = mm; m2<mend; )
{
rngstep( a<<13, a, b, mm, m, m2, r, x);
rngstep( a>>6 , a, b, mm, m, m2, r, x);
rngstep( a<<2 , a, b, mm, m, m2, r, x);
rngstep( a>>16, a, b, mm, m, m2, r, x);
}
ctx->randb = b; ctx->randa = a;
}
#define mix(a,b,c,d,e,f,g,h) \
{ \
a^=b<<11; d+=a; b+=c; \
b^=c>>2; e+=b; c+=d; \
c^=d<<8; f+=c; d+=e; \
d^=e>>16; g+=d; e+=f; \
e^=f<<10; h+=e; f+=g; \
f^=g>>4; a+=f; g+=h; \
g^=h<<8; b+=g; h+=a; \
h^=a>>9; c+=h; a+=b; \
}
/* if (flag==TRUE), then use the contents of randrsl[] to initialize mm[]. */
void irandinit(randctx *ctx, word flag)
{
word i;
ub4 a,b,c,d,e,f,g,h;
ub4 *m,*r;
ctx->randa = ctx->randb = ctx->randc = 0;
m=ctx->randmem;
r=ctx->randrsl;
a=b=c=d=e=f=g=h=0x9e3779b9; /* the golden ratio */
for (i=0; i<4; ++i) /* scramble it */
{
mix(a,b,c,d,e,f,g,h);
}
if (flag)
{
/* initialize using the contents of r[] as the seed */
for (i=0; i<RANDSIZ; i+=8)
{
a+=r[i ]; b+=r[i+1]; c+=r[i+2]; d+=r[i+3];
e+=r[i+4]; f+=r[i+5]; g+=r[i+6]; h+=r[i+7];
mix(a,b,c,d,e,f,g,h);
m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
}
/* do a second pass to make all of the seed affect all of m */
for (i=0; i<RANDSIZ; i+=8)
{
a+=m[i ]; b+=m[i+1]; c+=m[i+2]; d+=m[i+3];
e+=m[i+4]; f+=m[i+5]; g+=m[i+6]; h+=m[i+7];
mix(a,b,c,d,e,f,g,h);
m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
}
}
else
{
for (i=0; i<RANDSIZ; i+=8)
{
/* fill in mm[] with messy stuff */
mix(a,b,c,d,e,f,g,h);
m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d;
m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h;
}
}
isaac(ctx); /* fill in the first set of results */
ctx->randcnt=RANDSIZ; /* prepare to use the first set of results */
}

56
src/isaac.h Normal file
View File

@ -0,0 +1,56 @@
/*
------------------------------------------------------------------------------
isaac.h: definitions for a random number generator
MODIFIED:
960327: Creation (addition of randinit, really)
970719: use context, not global variables, for internal state
980324: renamed seed to flag
980605: recommend RANDSIZL=4 for noncryptography.
991209: modified for inclusion with GNU Backgammon by Gary Wong
070121: modified for inclusion with flam3 by Erik Reckase
------------------------------------------------------------------------------
*/
#include "isaacs.h"
#ifndef _ISAAC_H_
#define _ISAAC_H_
#define RANDSIZL (4) /* I recommend 8 for crypto, 4 for simulations */
#define RANDSIZ (1<<RANDSIZL)
/* context of random number generator */
struct randctx
{
ub4 randcnt;
ub4 randrsl[RANDSIZ];
ub4 randmem[RANDSIZ];
ub4 randa;
ub4 randb;
ub4 randc;
};
typedef struct randctx randctx;
/*
------------------------------------------------------------------------------
If (flag==TRUE), then use the contents of randrsl[0..RANDSIZ-1] as the seed.
------------------------------------------------------------------------------
*/
void irandinit( randctx *r, word flag );
void isaac( randctx *r );
/*
------------------------------------------------------------------------------
Call irand(/o_ randctx *r _o/) to retrieve a single 32-bit random value
------------------------------------------------------------------------------
*/
#define irand(r) \
(!(r)->randcnt-- ? \
(isaac(r), (r)->randcnt=RANDSIZ-1, (r)->randrsl[(r)->randcnt]) : \
(r)->randrsl[(r)->randcnt])
#endif

46
src/isaacs.h Normal file
View File

@ -0,0 +1,46 @@
/*
------------------------------------------------------------------------------
Standard definitions and types, Bob Jenkins
Modified for inclusion with flam3 by Erik Reckase
------------------------------------------------------------------------------
*/
#ifndef _ISAACS_H_
#define _ISAACS_H_
typedef unsigned long int ub4; /* unsigned 4-byte quantities */
#define UB4MAXVAL 0xffffffff
typedef signed long int sb4;
#define SB4MAXVAL 0x7fffffff
typedef unsigned short int ub2;
#define UB2MAXVAL 0xffff
typedef signed short int sb2;
#define SB2MAXVAL 0x7fff
typedef unsigned char ub1;
#define UB1MAXVAL 0xff
typedef signed char sb1; /* signed 1-byte quantities */
#define SB1MAXVAL 0x7f
typedef int word; /* fastest type available */
#endif

145
src/jpeg.c Normal file
View File

@ -0,0 +1,145 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <jpeglib.h>
#include <string.h>
#include "config.h"
#include "img.h"
#include "flam3.h"
#include "private.h"
void
write_jpeg(FILE *file, unsigned char *image, int width, int height, flam3_img_comments *fpc) {
struct jpeg_compress_struct info;
struct jpeg_error_mgr jerr;
size_t i;
char *nick = getenv("nick");
char *url = getenv("url");
char *id = getenv("id");
char *ai; /* For argi */
int jpegcom_enable = argi("enable_jpeg_comments",1);
char nick_string[64], url_string[128], id_string[128];
char bv_string[64],ni_string[64],rt_string[64];
char genome_string[65536], ver_string[64];
/* Create the mandatory comment strings */
snprintf(genome_string,65536,"flam3_genome: %s",fpc->genome);
snprintf(bv_string,64,"flam3_error_rate: %s",fpc->badvals);
snprintf(ni_string,64,"flam3_samples: %s",fpc->numiters);
snprintf(rt_string,64,"flam3_time: %s",fpc->rtime);
snprintf(ver_string,64,"flam3_version: %s",flam3_version());
info.err = jpeg_std_error(&jerr);
jpeg_create_compress(&info);
jpeg_stdio_dest(&info, file);
info.in_color_space = JCS_RGB;
info.input_components = 3;
info.image_width = width;
info.image_height = height;
jpeg_set_defaults(&info);
if (getenv("jpeg")) {
int quality = atoi(getenv("jpeg"));
jpeg_set_quality(&info, quality, TRUE);
}
jpeg_start_compress(&info, TRUE);
/* Write comments to jpeg */
if (jpegcom_enable==1) {
jpeg_write_marker(&info, JPEG_COM, (unsigned char *)ver_string, (int)strlen(ver_string));
if (0 != nick) {
snprintf(nick_string,64,"flam3_nickname: %s",nick);
jpeg_write_marker(&info, JPEG_COM, (unsigned char *)nick_string, (int)strlen(nick_string));
}
if (0 != url) {
snprintf(url_string,128,"flam3_url: %s",url);
jpeg_write_marker(&info, JPEG_COM, (unsigned char *)url_string, (int)strlen(url_string));
}
if (0 != id) {
snprintf(id_string,128,"flam3_id: %s",id);
jpeg_write_marker(&info, JPEG_COM, (unsigned char *)id_string, (int)strlen(id_string));
}
jpeg_write_marker(&info, JPEG_COM, (unsigned char *)bv_string, (int)strlen(bv_string));
jpeg_write_marker(&info, JPEG_COM, (unsigned char *)ni_string, (int)strlen(ni_string));
jpeg_write_marker(&info, JPEG_COM, (unsigned char *)rt_string, (int)strlen(rt_string));
jpeg_write_marker(&info, JPEG_COM, (unsigned char *)genome_string, (int)strlen(genome_string));
}
for (i = 0; i < height; i++) {
JSAMPROW row_pointer[1];
row_pointer[0] = (unsigned char *) image + (3 * width * i);
jpeg_write_scanlines(&info, row_pointer, 1);
}
jpeg_finish_compress(&info);
jpeg_destroy_compress(&info);
}
unsigned char *read_jpeg(FILE *ifp, int *width, int *height) {
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
int num_scanlines;
unsigned char *p, *q, *t;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, ifp);
(void) jpeg_read_header(&cinfo, TRUE);
(void) jpeg_start_decompress(&cinfo);
/* or image_width? */
*width = cinfo.output_width;
*height = cinfo.output_height;
if (3 != cinfo.output_components) {
printf("can only read RGB JPEG files, not %d components.\n",
cinfo.output_components);
return 0;
}
p = q = malloc(4 * *width * *height);
t = malloc(3 * *width);
while (cinfo.output_scanline < cinfo.output_height) {
unsigned char *s = t;
int i;
num_scanlines = jpeg_read_scanlines(&cinfo, &t, 1);
for (i = 0; i < *width; i++) {
p[0] = s[0];
p[1] = s[1];
p[2] = s[2];
p[3] = 255;
s += 3;
p += 4;
}
}
(void) jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
free(t);
return q;
}

6964
src/ltmain.sh Executable file

File diff suppressed because it is too large Load Diff

353
src/missing Executable file
View File

@ -0,0 +1,353 @@
#! /bin/sh
# Common stub for a few missing GNU programs while installing.
scriptversion=2004-09-07.08
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004
# Free Software Foundation, Inc.
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
if test $# -eq 0; then
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
fi
run=:
# In the cases where this matters, `missing' is being run in the
# srcdir already.
if test -f configure.ac; then
configure_ac=configure.ac
else
configure_ac=configure.in
fi
msg="missing on your system"
case "$1" in
--run)
# Try to run requested program, and just exit if it succeeds.
run=
shift
"$@" && exit 0
# Exit code 63 means version mismatch. This often happens
# when the user try to use an ancient version of a tool on
# a file that requires a minimum version. In this case we
# we should proceed has if the program had been absent, or
# if --run hadn't been passed.
if test $? = 63; then
run=:
msg="probably too old"
fi
;;
-h|--h|--he|--hel|--help)
echo "\
$0 [OPTION]... PROGRAM [ARGUMENT]...
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
error status if there is no known handling for PROGRAM.
Options:
-h, --help display this help and exit
-v, --version output version information and exit
--run try to run the given command, and emulate it if it fails
Supported PROGRAM values:
aclocal touch file \`aclocal.m4'
autoconf touch file \`configure'
autoheader touch file \`config.h.in'
automake touch all \`Makefile.in' files
bison create \`y.tab.[ch]', if possible, from existing .[ch]
flex create \`lex.yy.c', if possible, from existing .c
help2man touch the output file
lex create \`lex.yy.c', if possible, from existing .c
makeinfo touch the output file
tar try tar, gnutar, gtar, then tar without non-portable flags
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
Send bug reports to <bug-automake@gnu.org>."
exit 0
;;
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
echo "missing $scriptversion (GNU Automake)"
exit 0
;;
-*)
echo 1>&2 "$0: Unknown \`$1' option"
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
;;
esac
# Now exit if we have it, but it failed. Also exit now if we
# don't have it and --version was passed (most likely to detect
# the program).
case "$1" in
lex|yacc)
# Not GNU programs, they don't have --version.
;;
tar)
if test -n "$run"; then
echo 1>&2 "ERROR: \`tar' requires --run"
exit 1
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
exit 1
fi
;;
*)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
# Could not run --version or --help. This is probably someone
# running `$TOOL --version' or `$TOOL --help' to check whether
# $TOOL exists and not knowing $TOOL uses missing.
exit 1
fi
;;
esac
# If it does not exist, or fails to run (possibly an outdated version),
# try to emulate it.
case "$1" in
aclocal*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
to install the \`Automake' and \`Perl' packages. Grab them from
any GNU archive site."
touch aclocal.m4
;;
autoconf)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`${configure_ac}'. You might want to install the
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
archive site."
touch configure
;;
autoheader)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`acconfig.h' or \`${configure_ac}'. You might want
to install the \`Autoconf' and \`GNU m4' packages. Grab them
from any GNU archive site."
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
test -z "$files" && files="config.h"
touch_files=
for f in $files; do
case "$f" in
*:*) touch_files="$touch_files "`echo "$f" |
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
*) touch_files="$touch_files $f.in";;
esac
done
touch $touch_files
;;
automake*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
You might want to install the \`Automake' and \`Perl' packages.
Grab them from any GNU archive site."
find . -type f -name Makefile.am -print |
sed 's/\.am$/.in/' |
while read f; do touch "$f"; done
;;
autom4te)
echo 1>&2 "\
WARNING: \`$1' is needed, but is $msg.
You might have modified some files without having the
proper tools for further handling them.
You can get \`$1' as part of \`Autoconf' from any GNU
archive site."
file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
if test -f "$file"; then
touch $file
else
test -z "$file" || exec >$file
echo "#! /bin/sh"
echo "# Created by GNU Automake missing as a replacement of"
echo "# $ $@"
echo "exit 0"
chmod +x $file
exit 1
fi
;;
bison|yacc)
echo 1>&2 "\
WARNING: \`$1' $msg. You should only need it if
you modified a \`.y' file. You may need the \`Bison' package
in order for those modifications to take effect. You can get
\`Bison' from any GNU archive site."
rm -f y.tab.c y.tab.h
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.y)
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.c
fi
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.h
fi
;;
esac
fi
if [ ! -f y.tab.h ]; then
echo >y.tab.h
fi
if [ ! -f y.tab.c ]; then
echo 'main() { return 0; }' >y.tab.c
fi
;;
lex|flex)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.l' file. You may need the \`Flex' package
in order for those modifications to take effect. You can get
\`Flex' from any GNU archive site."
rm -f lex.yy.c
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.l)
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" lex.yy.c
fi
;;
esac
fi
if [ ! -f lex.yy.c ]; then
echo 'main() { return 0; }' >lex.yy.c
fi
;;
help2man)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a dependency of a manual page. You may need the
\`Help2man' package in order for those modifications to take
effect. You can get \`Help2man' from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
fi
if [ -f "$file" ]; then
touch $file
else
test -z "$file" || exec >$file
echo ".ab help2man is required to generate this page"
exit 1
fi
;;
makeinfo)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.texi' or \`.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy \`make' (AIX,
DU, IRIX). You might want to install the \`Texinfo' package or
the \`GNU make' package. Grab either from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
fi
touch $file
;;
tar)
shift
# We have already tried tar in the generic part.
# Look for gnutar/gtar before invocation to avoid ugly error
# messages.
if (gnutar --version > /dev/null 2>&1); then
gnutar "$@" && exit 0
fi
if (gtar --version > /dev/null 2>&1); then
gtar "$@" && exit 0
fi
firstarg="$1"
if shift; then
case "$firstarg" in
*o*)
firstarg=`echo "$firstarg" | sed s/o//`
tar "$firstarg" "$@" && exit 0
;;
esac
case "$firstarg" in
*h*)
firstarg=`echo "$firstarg" | sed s/h//`
tar "$firstarg" "$@" && exit 0
;;
esac
fi
echo 1>&2 "\
WARNING: I can't seem to be able to run \`tar' with the given arguments.
You may want to install GNU tar or Free paxutils, or check the
command line arguments."
exit 1
;;
*)
echo 1>&2 "\
WARNING: \`$1' is needed, and is $msg.
You might have modified some files without having the
proper tools for further handling them. Check the \`README' file,
it often tells you about the needed prerequisites for installing
this package. You may also peek at any GNU archive site, in case
some other package would contain this missing \`$1' program."
exit 1
;;
esac
exit 0
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:

40
src/mkinstalldirs Executable file
View File

@ -0,0 +1,40 @@
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain
# $Id: mkinstalldirs,v 1.1.1.1 2004-10-26 19:54:13 spotspot Exp $
errstatus=0
for file
do
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
shift
pathcomp=
for d
do
pathcomp="$pathcomp$d"
case "$pathcomp" in
-* ) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp" 1>&2
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
errstatus=$lasterr
fi
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus
# mkinstalldirs ends here

483
src/palettes.c Normal file
View File

@ -0,0 +1,483 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "private.h"
#include "palettes.h"
lib_palette *the_palettes = NULL;
int npalettes;
static void parse_palettes(xmlNode *node) {
xmlAttrPtr attr;
char *val;
lib_palette *pal;
while (node) {
if (node->type == XML_ELEMENT_NODE && !xmlStrcmp(node->name, (const xmlChar *)"palette")) {
attr = node->properties;
pal = &the_palettes[npalettes];
memset(pal, 0, sizeof(lib_palette));
while (attr) {
val = (char *) xmlGetProp(node, attr->name);
if (!xmlStrcmp(attr->name, (const xmlChar *)"data")) {
int count = 256;
int c_idx = 0;
int r,g,b;
int col_count = 0;
int sscanf_ret;
c_idx=0;
col_count = 0;
do {
sscanf_ret = sscanf((char *)&(val[c_idx]),"00%2x%2x%2x",&r,&g,&b);
if (sscanf_ret != 3) {
printf("Error: Problem reading hexadecimal color data.\n");
exit(1);
}
c_idx += 8;
while (isspace( (int)val[c_idx]))
c_idx++;
pal->colors[col_count][0] = r;
pal->colors[col_count][1] = g;
pal->colors[col_count][2] = b;
col_count++;
} while (col_count<count);
} else if (!xmlStrcmp(attr->name, (const xmlChar *)"number")) {
pal->number = atoi(val);
} else if (!xmlStrcmp(attr->name, (const xmlChar *)"name")) {
strncpy(pal->name, val, flam3_name_len);
pal->name[flam3_name_len-1] = 0;
}
xmlFree(val);
attr = attr->next;
}
npalettes++;
the_palettes = realloc(the_palettes, (1 + npalettes) * sizeof(lib_palette));
} else
parse_palettes(node->children);
node = node->next;
}
}
static int init_palettes(char *filename) {
FILE *fp;
xmlDocPtr doc;
xmlNode *rootnode;
int i, c, slen = 5000;
char *s;
fp = fopen(filename, "rb");
if (NULL == fp) {
fprintf(stderr, "flam3: could not open palette file ");
perror(filename);
exit(1);
}
/* Incrementally read XML file into a string */
s = malloc(slen);
i = 0;
do {
c = getc(fp);
if (EOF == c) {
if (ferror(fp)) {
perror(filename);
exit(1);
}
break;
}
s[i++] = c;
if (i == slen-1) {
slen *= 2;
s = realloc(s, slen);
}
} while (1);
fclose(fp);
s[i] = 0;
doc = xmlReadMemory(s, (int)strlen(s), filename, NULL, XML_PARSE_NONET);
if (NULL == doc) {
fprintf(stderr, "error parsing %s (%s).\n", filename, s);
exit(1);
}
rootnode = xmlDocGetRootElement(doc);
the_palettes = malloc(sizeof(lib_palette));
npalettes = 0;
parse_palettes(rootnode);
xmlFreeDoc(doc);
free(s);
xmlCleanupParser();
return(1);
}
int flam3_get_palette(int n, flam3_palette c, double hue_rotation) {
int cmap_len = 256;
int idx, i, j;
if (NULL == the_palettes) {
char *d = getenv("flam3_palettes");
init_palettes(d ? d : (PACKAGE_DATA_DIR "/flam3-palettes.xml"));
}
if (flam3_palette_random == n)
n = the_palettes[random()%npalettes].number;
for (idx = 0; idx < npalettes; idx++) {
if (n == the_palettes[idx].number) {
/* Loop over elements of cmap */
for (i = 0; i < cmap_len; i++) {
int ii = (i * 256) / cmap_len;
double rgb[3], hsv[3];
/* Colors are in 0-1 space */
for (j = 0; j < 3; j++)
rgb[j] = the_palettes[idx].colors[ii][j] / 255.0;
rgb2hsv(rgb, hsv);
hsv[0] += hue_rotation * 6.0;
hsv2rgb(hsv, rgb);
c[i].index = i;
for (j = 0; j < 3; j++)
c[i].color[j] = rgb[j];
c[i].color[3] = 1.0;
}
return n;
}
}
fprintf(stderr, "warning: palette number %d not found, using white.\n", n);
for (i = 0; i < cmap_len; i++) {
c[i].index = i;
for (j = 0; j < 4; j++)
c[i].color[j] = 1.0;
}
return flam3_palette_random;
}
/* rgb 0 - 1,
h 0 - 6, s 0 - 1, v 0 - 1 */
void rgb2hsv(rgb, hsv)
double *rgb; double *hsv;
{
double rd, gd, bd, h, s, v, max, min, del, rc, gc, bc;
rd = rgb[0];
gd = rgb[1];
bd = rgb[2];
/* compute maximum of rd,gd,bd */
if (rd>=gd) { if (rd>=bd) max = rd; else max = bd; }
else { if (gd>=bd) max = gd; else max = bd; }
/* compute minimum of rd,gd,bd */
if (rd<=gd) { if (rd<=bd) min = rd; else min = bd; }
else { if (gd<=bd) min = gd; else min = bd; }
del = max - min;
v = max;
if (max != 0.0) s = (del) / max;
else s = 0.0;
h = 0;
if (s != 0.0) {
rc = (max - rd) / del;
gc = (max - gd) / del;
bc = (max - bd) / del;
if (rd==max) h = bc - gc;
else if (gd==max) h = 2 + rc - bc;
else if (bd==max) h = 4 + gc - rc;
if (h<0) h += 6;
}
hsv[0] = h;
hsv[1] = s;
hsv[2] = v;
}
/* h 0 - 6, s 0 - 1, v 0 - 1
rgb 0 - 1 */
void hsv2rgb(hsv, rgb)
double *hsv;
double *rgb;
{
double h = hsv[0], s = hsv[1], v = hsv[2];
int j;
double rd, gd, bd;
double f, p, q, t;
while (h >= 6.0) h = h - 6.0;
while (h < 0.0) h = h + 6.0;
j = (int) floor(h);
f = h - j;
p = v * (1-s);
q = v * (1 - (s*f));
t = v * (1 - (s*(1 - f)));
switch (j) {
case 0: rd = v; gd = t; bd = p; break;
case 1: rd = q; gd = v; bd = p; break;
case 2: rd = p; gd = v; bd = t; break;
case 3: rd = p; gd = q; bd = v; break;
case 4: rd = t; gd = p; bd = v; break;
case 5: rd = v; gd = p; bd = q; break;
default: rd = v; gd = t; bd = p; break;
}
rgb[0] = rd;
rgb[1] = gd;
rgb[2] = bd;
}
double flam3_calc_alpha(double density, double gamma, double linrange) {
double dnorm = density;
double funcval = pow(linrange, gamma);
double frac,alpha;
if (dnorm>0) {
if (dnorm < linrange) {
frac = dnorm/linrange;
alpha = (1.0-frac) * dnorm * (funcval / linrange) + frac * pow(dnorm,gamma);
} else
alpha = pow(dnorm,gamma);
} else
alpha = 0;
return(alpha);
}
void flam3_calc_newrgb(double *cbuf, double ls, double highpow, double *newrgb) {
int rgbi;
double newls,lsratio;
double newhsv[3];
double a, maxa=-1.0, maxc=0;
double adjhlp;
if (ls==0.0) {
newrgb[0] = 0.0;
newrgb[1] = 0.0;
newrgb[2] = 0.0;
return;
}
/* Identify the most saturated channel */
for (rgbi=0;rgbi<3;rgbi++) {
a = ls * (cbuf[rgbi]/PREFILTER_WHITE);
if (a>maxa) {
maxa = a;
maxc = cbuf[rgbi]/PREFILTER_WHITE;
}
}
/* If a channel is saturated and we have a non-negative highlight power */
/* modify the color to prevent hue shift */
if (maxa>255 && highpow>=0.0) {
newls = 255.0/maxc;
lsratio = pow(newls/ls,highpow);
/* Calculate the max-value color (ranged 0 - 1) */
for (rgbi=0;rgbi<3;rgbi++)
newrgb[rgbi] = newls*(cbuf[rgbi]/PREFILTER_WHITE)/255.0;
/* Reduce saturation by the lsratio */
rgb2hsv(newrgb,newhsv);
newhsv[1] *= lsratio;
hsv2rgb(newhsv,newrgb);
for (rgbi=0;rgbi<3;rgbi++)
newrgb[rgbi] *= 255.0;
} else {
newls = 255.0/maxc;
adjhlp = -highpow;
if (adjhlp>1)
adjhlp=1;
if (maxa<=255)
adjhlp=1.0;
/* Calculate the max-value color (ranged 0 - 1) interpolated with the old behaviour */
for (rgbi=0;rgbi<3;rgbi++)
newrgb[rgbi] = ((1.0-adjhlp)*newls + adjhlp*ls)*(cbuf[rgbi]/PREFILTER_WHITE);
// for (rgbi=0;rgbi<3;rgbi++)
// newrgb[rgbi] = ls*(cbuf[rgbi]/PREFILTER_WHITE);
}
}
static int random_xform(flam3_genome *g, int excluded) {
int ntries = 0;
while (ntries++ < 100) {
int i = random() % g->num_xforms;
if (g->xform[i].density > 0.0 && i != excluded)
return i;
}
return -1;
}
static double try_colors(flam3_genome *g, int color_resolution) {
int *hist;
int i, hits, res = color_resolution;
int res3 = res * res * res;
flam3_frame f;
unsigned char *image, *p;
flam3_genome saved;
double scalar;
int pixtotal;
stat_struct stats;
memset(&saved, 0, sizeof(flam3_genome));
flam3_copy(&saved, g);
g->sample_density = 1;
g->spatial_oversample = 1;
g->estimator = 0.0;
/* Scale the image so that the total number of pixels is ~10000 */
pixtotal = g->width * g->height;
scalar = sqrt( 10000.0 / (double)pixtotal);
g->width *= scalar;
g->height *= scalar;
g->pixels_per_unit *= scalar;
// g->width = 100; // XXX keep aspect ratio
// g->height = 100;
// g->pixels_per_unit = 50;
g->nbatches = 1;
g->ntemporal_samples = 1;
// f.temporal_filter_radius = 0.0;
flam3_init_frame(&f);
f.bits = 33;
f.bytes_per_channel=1;
f.verbose = 0;
f.genomes = g;
f.ngenomes = 1;
f.earlyclip = 1;
f.pixel_aspect_ratio = 1.0;
f.progress = 0;
f.nthreads = 1;
image = (unsigned char *) calloc(g->width * g->height, 3);
if (flam3_render(&f, image, flam3_field_both, 3, 0, &stats)) {
fprintf(stderr,"Error rendering test image for trycolors. Aborting.\n");
exit(1);
}
hist = calloc(sizeof(int), res3);
p = image;
for (i = 0; i < g->height * g->width; i++) {
hist[(p[0] * res / 256) +
(p[1] * res / 256) * res +
(p[2] * res / 256) * res * res]++;
p += 3;
}
if (0) {
int j, k;
for (i = 0; i < res; i++) {
fprintf(stderr, "\ni=%d: \n", i);
for (j = 0; j < res; j++) {
for (k = 0; k < res; k++) {
fprintf(stderr, " %5d", hist[i * res * res + j * res + k]);
}
fprintf(stderr, "\n");
}
}
}
hits = 0;
for (i = 0; i < res3; i++) {
if (hist[i]) hits++;
}
free(hist);
free(image);
g->sample_density = saved.sample_density;
g->width = saved.width;
g->height = saved.height;
g->spatial_oversample = saved.spatial_oversample;
g->pixels_per_unit = saved.pixels_per_unit;
g->nbatches = saved.nbatches;
g->ntemporal_samples = saved.ntemporal_samples;
g->estimator = saved.estimator;
/* Free xform storage */
clear_cp(&saved,flam3_defaults_on);
return (double) hits / res3;
}
static void change_colors(flam3_genome *g, int change_palette) {
int i;
int x0, x1;
if (change_palette) {
g->hue_rotation = 0.0;
g->palette_index = flam3_get_palette(flam3_palette_random, g->palette, 0.0);
}
for (i = 0; i < g->num_xforms; i++) {
g->xform[i].color = flam3_random01();
}
x0 = random_xform(g, -1);
x1 = random_xform(g, x0);
if (x0 >= 0 && (random()&1)) g->xform[x0].color = 0.0;
if (x1 >= 0 && (random()&1)) g->xform[x1].color = 1.0;
}
void flam3_improve_colors(flam3_genome *g, int ntries, int change_palette, int color_resolution) {
int i;
double best, b;
flam3_genome best_genome;
memset(&best_genome, 0, sizeof(flam3_genome));
best = try_colors(g, color_resolution);
flam3_copy(&best_genome,g);
for (i = 0; i < ntries; i++) {
change_colors(g, change_palette);
b = try_colors(g, color_resolution);
if (b > best) {
best = b;
flam3_copy(&best_genome,g);
}
}
flam3_copy(g,&best_genome);
clear_cp(&best_genome,flam3_defaults_on);
}

37
src/palettes.h Normal file
View File

@ -0,0 +1,37 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef palettes_included
#define palettes_included
typedef struct {
int number;
char name[flam3_name_len];
unsigned char colors[256][3];
} lib_palette;
void rgb2hsv(double *rgb, double *hsv);
void hsv2rgb(double *hsv, double *rgb);
double flam3_calc_alpha(double density, double gamma, double linrange);
void flam3_calc_newrgb(double *cbuf, double ls, double highpow, double *newrgb);
#endif

1364
src/parser.c Normal file

File diff suppressed because it is too large Load Diff

35
src/parser.h Normal file
View File

@ -0,0 +1,35 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef parser_included
#define parser_included
#include "private.h"
int flam3_atoi(char *nstr);
double flam3_atof(char *nstr);
int var2n(const char *s);
int flam3_parse_hexformat_colors(char *colstr, flam3_genome *cp, int numcolors, int chan);
void scan_for_flame_nodes(xmlNode *cur_node, char *parent_file, int default_flag, flam3_genome **all_cp, int *all_ncps);
int parse_flame_element(xmlNode *flame_node, flam3_genome *loc_current_cp);
int parse_xform_xml(xmlNode *chld_node,flam3_xform *this_xform, int *num_xaos,
flam3_chaos_entry **xaos, int numstd, int motionxf);
void flam3_edit_print(FILE *f, xmlNodePtr editNode, int tabs, int formatting);
int flam3_interp_missing_colors(flam3_genome *cp);
#endif

229
src/png.c Executable file
View File

@ -0,0 +1,229 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <png.h>
#include <setjmp.h>
#include "config.h"
#include "img.h"
#include "flam3.h"
#include "private.h"
#ifdef _WIN32
#include <winsock.h> /* for htons */
#else
#include <arpa/inet.h>
#endif
void write_png(FILE *file, void *image, int width, int height, flam3_img_comments *fpc, int bpc) {
png_structp png_ptr;
png_infop info_ptr;
png_text text[FLAM3_PNG_COM];
size_t i;
unsigned short testbe = 1;
void **rows = malloc(sizeof(void *) * height);
char *nick = getenv("nick");
char *url = getenv("url");
char *id = getenv("id");
char *ai; /* For argi */
int pngcom_enable = argi("enable_png_comments", 1);
text[0].compression = PNG_TEXT_COMPRESSION_NONE;
text[0].key = "flam3_version";
text[0].text = flam3_version();
text[1].compression = PNG_TEXT_COMPRESSION_NONE;
text[1].key = "flam3_nickname";
text[1].text = nick;
text[2].compression = PNG_TEXT_COMPRESSION_NONE;
text[2].key = "flam3_url";
text[2].text = url;
text[3].compression = PNG_TEXT_COMPRESSION_NONE;
text[3].key = "flam3_id";
text[3].text = id;
text[4].compression = PNG_TEXT_COMPRESSION_NONE;
text[4].key = "flam3_error_rate";
text[4].text = fpc->badvals;
text[5].compression = PNG_TEXT_COMPRESSION_NONE;
text[5].key = "flam3_samples";
text[5].text = fpc->numiters;
text[6].compression = PNG_TEXT_COMPRESSION_NONE;
text[6].key = "flam3_time";
text[6].text = fpc->rtime;
text[7].compression = PNG_TEXT_COMPRESSION_zTXt;
text[7].key = "flam3_genome";
text[7].text = fpc->genome;
for (i = 0; i < height; i++)
rows[i] = (unsigned char *)image + i * width * 4 * bpc;
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
info_ptr = png_create_info_struct(png_ptr);
if (setjmp(png_jmpbuf(png_ptr))) {
fclose(file);
png_destroy_write_struct(&png_ptr, &info_ptr);
perror("writing file");
return;
}
png_init_io(png_ptr, file);
png_set_IHDR(png_ptr, info_ptr, width, height, 8*bpc,
PNG_COLOR_TYPE_RGBA,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE,
PNG_FILTER_TYPE_BASE);
/* Swap the bytes if we're doing 16bpc and on little-endian platform */
if (2==bpc && testbe != htons(testbe)) {
unsigned short *im = (unsigned short *)image;
for (i=0; i<height*width*4; i++) {
im[i] = htons(im[i]);
}
}
if (pngcom_enable==1)
png_set_text(png_ptr, info_ptr, text, FLAM3_PNG_COM);
png_write_info(png_ptr, info_ptr);
png_write_image(png_ptr, (png_bytepp) rows);
png_write_end(png_ptr, info_ptr);
png_destroy_write_struct(&png_ptr, &info_ptr);
free(rows);
}
#define SIG_CHECK_SIZE 8
unsigned char *read_png(FILE *ifp, int *width, int *height) {
unsigned char sig_buf [SIG_CHECK_SIZE];
png_struct *png_ptr;
png_info *info_ptr;
png_byte **png_image = NULL;
unsigned int linesize, x, y;
unsigned char *p, *q;
if (fread (sig_buf, 1, SIG_CHECK_SIZE, ifp) != SIG_CHECK_SIZE) {
fprintf (stderr, "input file empty or too short\n");
return 0;
}
if (png_sig_cmp (sig_buf, (png_size_t) 0, (png_size_t) SIG_CHECK_SIZE) != 0) {
fprintf (stderr, "input file not a PNG file\n");
return 0;
}
png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
fprintf (stderr, "cannot allocate LIBPNG structure\n");
return 0;
}
if (setjmp(png_jmpbuf(png_ptr))) {
if (png_image) {
for (y = 0 ; y < info_ptr->height ; y++)
free (png_image[y]);
free (png_image);
}
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
perror("reading file");
return 0;
}
info_ptr = png_create_info_struct (png_ptr);
if (info_ptr == NULL) {
png_destroy_read_struct (&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
fprintf (stderr, "cannot allocate LIBPNG structures\n");
return 0;
}
png_init_io (png_ptr, ifp);
png_set_sig_bytes (png_ptr, SIG_CHECK_SIZE);
png_read_info (png_ptr, info_ptr);
if (8 != info_ptr->bit_depth) {
fprintf(stderr, "bit depth type must be 8, not %d.\n",
info_ptr->bit_depth);
return 0;
}
*width = info_ptr->width;
*height = info_ptr->height;
p = q = malloc(4 * *width * *height);
png_image = (png_byte **)malloc (info_ptr->height * sizeof (png_byte*));
linesize = info_ptr->width;
switch (info_ptr->color_type) {
case PNG_COLOR_TYPE_RGB:
linesize *= 3;
break;
case PNG_COLOR_TYPE_RGBA:
linesize *= 4;
break;
default:
fprintf(stderr, "color type must be RGB or RGBA not %d.\n",
info_ptr->color_type);
return 0;
}
for (y = 0 ; y < info_ptr->height ; y++) {
png_image[y] = malloc (linesize);
}
png_read_image (png_ptr, png_image);
png_read_end (png_ptr, info_ptr);
for (y = 0 ; y < info_ptr->height ; y++) {
unsigned char *s = png_image[y];
for (x = 0 ; x < info_ptr->width ; x++) {
switch (info_ptr->color_type) {
case PNG_COLOR_TYPE_RGB:
p[0] = s[0];
p[1] = s[1];
p[2] = s[2];
p[3] = 255;
s += 3;
p += 4;
break;
case PNG_COLOR_TYPE_RGBA:
p[0] = s[0];
p[1] = s[1];
p[2] = s[2];
p[3] = s[3];
s += 4;
p += 4;
break;
}
}
}
for (y = 0 ; y < info_ptr->height ; y++)
free (png_image[y]);
free (png_image);
png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp)NULL);
return q;
}

154
src/private.h Normal file
View File

@ -0,0 +1,154 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef private_included
#define private_included
#include "flam3.h"
#include "config.h"
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <string.h>
#include <libxml/parser.h>
#ifdef _WIN32
#define basename(x) strdup(x)
#define snprintf _snprintf
#define _USE_MATH_DEFINES
#else
#include <unistd.h>
#include <libgen.h>
#endif
#include <math.h>
#ifdef HAVE_LIBPTHREAD
#include <pthread.h>
#endif
#define PREFILTER_WHITE 255
#define EPS (1e-10)
#define CMAP_SIZE 256
#define CMAP_SIZE_M1 255
#define rbit() (flam3_random_bit())
#define flam3_variation_none (-1)
#define max_specified_vars (100)
#define vlen(x) (sizeof(x)/sizeof(*x))
#ifdef _WIN32
#ifndef M_PI
#define M_PI 3.1415926536
#define M_1_PI 0.3183098862
#define M_PI_4 0.7853981634
#endif
#define random() (rand() ^ (rand()<<15))
#define srandom(x) (srand(x))
extern int getpid();
#define rint(A) floor((A)+(((A) < 0)? -0.5 : 0.5))
#endif
#define argi(s,d) ((ai = getenv(s)) ? atoi(ai) : (d))
#define argf(s,d) ((ai = getenv(s)) ? atof(ai) : (d))
#define args(s,d) ((ai = getenv(s)) ? ai : (d))
void docstring();
/* Structures for passing parameters to iteration threads */
typedef struct {
unsigned short *xform_distrib; /* Distribution of xforms based on weights */
flam3_frame *spec; /* Frame contains timing information */
double bounds[4]; /* Corner coords of viewable area */
double rot[2][2]; /* Rotation transformation */
double size[2];
int width, height; /* buffer width/height */
double ws0, wb0s0, hs1, hb1s1; /* shortcuts for indexing */
flam3_palette_entry *dmap; /* palette */
double color_scalar; /* <1.0 if non-uniform motion blur is set */
void *buckets; /* Points to the first accumulator */
double badvals; /* accumulates all badvalue resets */
double batch_size;
int temporal_sample_num,ntemporal_samples;
int batch_num, nbatches, aborted;
time_t *progress_timer;
time_t *progress_timer_history;
double *progress_history;
int *progress_history_mark;
#ifdef HAVE_LIBPTHREAD
/* mutex for bucket accumulator */
pthread_mutex_t bucket_mutex;
#endif
} flam3_iter_constants;
typedef struct {
double tx,ty; /* Starting coordinates */
double precalc_atan, precalc_sina; /* Precalculated, if needed */
double precalc_cosa, precalc_sqrt;
double precalc_sumsq,precalc_atanyx;
flam3_xform *xform; /* For the important values */
/* Output Coords */
double p0, p1;
/* Pointer to the isaac RNG state */
randctx *rc;
} flam3_iter_helper;
typedef struct {
double *iter_storage; /* Storage for iteration coordinates */
randctx rc; /* Thread-unique ISAAC seed */
flam3_genome cp; /* Full copy of genome for use by the thread */
int first_thread;
int timer_initialize;
flam3_iter_constants *fic; /* Constants for render */
} flam3_thread_helper;
double flam3_sinc(double x);
#define flam3_num_spatialfilters 14
double flam3_gaussian_filter(double x);
double flam3_hermite_filter(double t);
double flam3_box_filter(double t);
double flam3_triangle_filter(double t);
double flam3_bell_filter(double t);
double flam3_b_spline_filter(double t);
double flam3_lanczos3_filter(double t);
double flam3_lanczos2_filter(double t);
double flam3_mitchell_filter(double t);
double flam3_blackman_filter(double x);
double flam3_catrom_filter(double x);
double flam3_hamming_filter(double x);
double flam3_hanning_filter(double x);
double flam3_quadratic_filter(double x);
double flam3_spatial_filter(int knum, double x);
#define flam3_mitchell_b (1.0 / 3.0)
#define flam3_mitchell_c (1.0 / 3.0)
#endif

1268
src/rect.c Normal file

File diff suppressed because it is too large Load Diff

143
src/render.dsp Normal file
View File

@ -0,0 +1,143 @@
# Microsoft Developer Studio Project File - Name="hqi" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=hqi - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "render.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "render.mak" CFG="hqi - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "hqi - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "hqi - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "hqi - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "c:\src\libpng" /I "c:\src\zlib" /I "c:\src\libxml2\include" /I "c:\src\jpeg" /I "c:\src\iconv\include" /I "c:\src\pthreads" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /Zm1000 /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\src\jpeg\libjpeg.lib c:\src\libpng\libpng.lib c:\src\libxml2\lib\libxml2.lib c:\src\zlib\zlib.lib c:\src\pthreads\pthreadVC2.lib /nologo /subsystem:console /machine:I386 /out:"Release/flam3-render.exe"
!ELSEIF "$(CFG)" == "hqi - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "c:\src\jpeg" /I "c:\src\libpng" /I "c:\src\zlib" /I "c:\src\libxml2\include" /I "c:\src\iconv\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /Zm1000 /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\src\jpeg\libjpeg.lib c:\src\libpng\libpng.lib c:\src\libxml2\lib\libxml2.lib c:\src\zlib\zlib.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# SUBTRACT LINK32 /pdb:none
!ENDIF
# Begin Target
# Name "hqi - Win32 Release"
# Name "hqi - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\docstring.c
# End Source File
# Begin Source File
SOURCE=".\flam3-palettes.c"
# End Source File
# Begin Source File
SOURCE=".\flam3-render.c"
# End Source File
# Begin Source File
SOURCE=.\flam3.c
# End Source File
# Begin Source File
SOURCE=.\isaac.c
# End Source File
# Begin Source File
SOURCE=.\jpeg.c
# End Source File
# Begin Source File
SOURCE=.\png.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=cmap.h
# End Source File
# Begin Source File
SOURCE=.\jpeg.h
# End Source File
# Begin Source File
SOURCE=libifs.h
# End Source File
# Begin Source File
SOURCE=rect.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

14
src/test.flam3 Normal file
View File

@ -0,0 +1,14 @@
<test>
<flame time="0" palette="15" size="640 480" center="0 0" scale="240" zoom="0" oversample="1" filter="1" quality="10" background="0 0 0" brightness="4" gamma="4" vibrancy="1" hue="0.22851">
<xform weight="0.25" color="1" spherical="1" coefs="-0.681206 -0.0779465 0.20769 0.755065 -0.0416126 -0.262334"/>
<xform weight="0.25" color="0.66" spherical="1" coefs="0.953766 0.48396 0.43268 -0.0542476 0.642503 -0.995898"/>
<xform weight="0.25" color="0.33" spherical="1" coefs="0.840613 -0.816191 0.318971 -0.430402 0.905589 0.909402"/>
<xform weight="0.25" color="0" spherical="1" coefs="0.960492 -0.466555 0.215383 -0.727377 -0.126074 0.253509"/>
</flame>
<flame time="100" palette="29" size="640 480" center="0 0" scale="240" zoom="0" oversample="1" filter="1" quality="10" background="0 0 0" brightness="4" gamma="4" vibrancy="1" hue="0.147038">
<xform weight="0.25" color="1" spherical="1" coefs="-0.357523 0.774667 0.397446 0.674359 -0.730708 0.812876"/>
<xform weight="0.25" color="0.66" spherical="1" coefs="-0.69942 0.141688 -0.743472 0.475451 -0.336206 0.0958816"/>
<xform weight="0.25" color="0.33" spherical="1" coefs="0.0738451 -0.349212 -0.635205 0.262572 -0.398985 -0.736904"/>
<xform weight="0.25" color="0" spherical="1" coefs="0.992697 0.433488 -0.427202 -0.339112 -0.507145 0.120765"/>
</flame>
</test>

2521
src/variations.c Normal file

File diff suppressed because it is too large Load Diff

140
src/variations.h Normal file
View File

@ -0,0 +1,140 @@
/*
FLAM3 - cosmic recursive fractal flames
Copyright (C) 1992-2009 Spotworks LLC
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef variations_included
#define variations_included
#include "private.h"
/* Variation functions */
void var0_linear(flam3_iter_helper *, double);
void var1_sinusoidal(flam3_iter_helper *, double);
void var2_spherical(flam3_iter_helper *, double);
void var3_swirl(flam3_iter_helper *, double);
void var4_horseshoe(flam3_iter_helper *, double);
void var5_polar(flam3_iter_helper *, double);
void var6_handkerchief(flam3_iter_helper *, double);
void var7_heart(flam3_iter_helper *, double);
void var8_disc(flam3_iter_helper *, double);
void var9_spiral(flam3_iter_helper *, double);
void var10_hyperbolic(flam3_iter_helper *, double);
void var11_diamond(flam3_iter_helper *, double);
void var12_ex(flam3_iter_helper *, double);
void var13_julia(flam3_iter_helper *, double);
void var14_bent(flam3_iter_helper *, double);
void var15_waves(flam3_iter_helper *, double);
void var16_fisheye(flam3_iter_helper *, double);
void var17_popcorn(flam3_iter_helper *, double);
void var18_exponential(flam3_iter_helper *, double);
void var19_power(flam3_iter_helper *, double);
void var20_cosine(flam3_iter_helper *, double);
void var21_rings(flam3_iter_helper *, double);
void var22_fan(flam3_iter_helper *, double);
void var23_blob(flam3_iter_helper *, double);
void var24_pdj(flam3_iter_helper *, double);
void var25_fan2(flam3_iter_helper *, double);
void var26_rings2(flam3_iter_helper *, double);
void var27_eyefish(flam3_iter_helper *, double);
void var28_bubble(flam3_iter_helper *, double);
void var29_cylinder(flam3_iter_helper *, double);
void var30_perspective(flam3_iter_helper *, double);
void var31_noise(flam3_iter_helper *, double);
void var32_juliaN_generic(flam3_iter_helper *, double);
void var33_juliaScope_generic(flam3_iter_helper *, double);
void var34_blur(flam3_iter_helper *, double);
void var35_gaussian(flam3_iter_helper *, double);
void var36_radial_blur(flam3_iter_helper *, double);
void var37_pie(flam3_iter_helper *, double);
void var38_ngon(flam3_iter_helper *, double);
void var39_curl(flam3_iter_helper *, double);
void var40_rectangles(flam3_iter_helper *, double);
void var41_arch(flam3_iter_helper *, double);
void var42_tangent(flam3_iter_helper *, double);
void var43_square(flam3_iter_helper *, double);
void var44_rays(flam3_iter_helper *, double);
void var45_blade(flam3_iter_helper *, double);
void var46_secant2(flam3_iter_helper *, double);
void var47_twintrian(flam3_iter_helper *, double);
void var48_cross(flam3_iter_helper *, double);
void var49_disc2(flam3_iter_helper *, double);
void var50_supershape(flam3_iter_helper *, double);
void var51_flower(flam3_iter_helper *, double);
void var52_conic(flam3_iter_helper *, double);
void var53_parabola(flam3_iter_helper *, double);
void var54_bent2(flam3_iter_helper *, double);
void var55_bipolar(flam3_iter_helper *, double);
void var56_boarders(flam3_iter_helper *, double);
void var57_butterfly(flam3_iter_helper *, double);
void var58_cell(flam3_iter_helper *, double);
void var59_cpow(flam3_iter_helper *, double);
void var60_curve(flam3_iter_helper *, double);
void var61_edisc(flam3_iter_helper *, double);
void var62_elliptic(flam3_iter_helper *, double);
void var63_escher(flam3_iter_helper *, double);
void var64_foci(flam3_iter_helper *, double);
void var65_lazysusan(flam3_iter_helper *, double);
void var66_loonie(flam3_iter_helper *, double);
void var67_pre_blur(flam3_iter_helper *, double);
void var68_modulus(flam3_iter_helper *, double);
void var69_oscope(flam3_iter_helper *, double);
void var70_polar2(flam3_iter_helper *, double);
void var71_popcorn2(flam3_iter_helper *, double);
void var72_scry(flam3_iter_helper *, double);
void var73_separation(flam3_iter_helper *, double);
void var74_split(flam3_iter_helper *, double);
void var75_splits(flam3_iter_helper *, double);
void var76_stripes(flam3_iter_helper *, double);
void var77_wedge(flam3_iter_helper *, double);
void var78_wedge_julia(flam3_iter_helper *, double);
void var79_wedge_sph(flam3_iter_helper *, double);
void var80_whorl(flam3_iter_helper *, double);
void var81_waves2(flam3_iter_helper *, double);
void var82_exp (flam3_iter_helper *f, double weight);
void var83_log (flam3_iter_helper *f, double weight);
void var84_sin (flam3_iter_helper *f, double weight);
void var85_cos (flam3_iter_helper *f, double weight);
void var86_tan (flam3_iter_helper *f, double weight);
void var87_sec (flam3_iter_helper *f, double weight);
void var88_csc (flam3_iter_helper *f, double weight);
void var89_cot (flam3_iter_helper *f, double weight);
void var90_sinh (flam3_iter_helper *f, double weight);
void var91_cosh (flam3_iter_helper *f, double weight);
void var92_tanh (flam3_iter_helper *f, double weight);
void var93_sech (flam3_iter_helper *f, double weight);
void var94_csch (flam3_iter_helper *f, double weight);
void var95_coth (flam3_iter_helper *f, double weight);
void var96_auger (flam3_iter_helper *f, double weight);
/* Precalculation functions */
void perspective_precalc(flam3_xform *xf);
void juliaN_precalc(flam3_xform *xf);
void juliaScope_precalc(flam3_xform *xf);
void radial_blur_precalc(flam3_xform *xf);
void waves_precalc(flam3_xform *xf);
void disc2_precalc(flam3_xform *xf);
void supershape_precalc(flam3_xform *xf);
void wedgeJulia_precalc(flam3_xform *xf);
void xform_precalc(flam3_genome *cp, int xi);
int prepare_xform_fn_ptrs(flam3_genome *, randctx *);
int apply_xform(flam3_genome *cp, int fn, double *p, double *q, randctx *rc);
void initialize_xforms(flam3_genome *thiscp, int start_here);
#endif

12
src/vidres.flam3 Executable file
View File

@ -0,0 +1,12 @@
<flame size="640 480"
center="0 0"
scale="240"
zoom="0"
oversample="1"
filter="1"
quality="10"
background="0 0 0"
brightness="4"
gamma="4"
vibrancy="1"
/>