1. pygame
  2. pygame
  3. pygame

Commits

pygame  committed b144118

rotozoom update

  • Participants
  • Parent commits e90b681
  • Branches default

Comments (0)

Files changed (8)

File Setup.in

View file
  • Ignore whitespace
 joystick src/joystick.c $(SDL)
 draw src/draw.c $(SDL)
 image src/image.c $(SDL)
-transform src/transform.c src/SDL_rotozoom/SDL_rotozoom.c $(SDL)
+transform src/transform.c src/rotozoom.c $(SDL)
 #macosx src/macosx.c src/setproctitle.c -Isrc
 
 

File WHATSNEW

View file
  • Ignore whitespace
 # BREAK = change breaks existing code
 # BUG	= fixed a bug that was (or could have been) crashing
 
+January 28, 2002
+	update SDL_rotozoom to 2.0.3
+	fix rotozoom 90degree cases
+
 January 26, 2002
 	special cases for 90 degree transform.rotate()
 	OSX cleanups for commandline (thanks Bob)

File src/SDL_rotozoom/COPYING

  • Ignore whitespace
-                          MOZILLA PUBLIC LICENSE
-                                Version 1.1
-
-                              ---------------
-
-1. Definitions.
-
-     1.0.1. "Commercial Use" means distribution or otherwise making the
-     Covered Code available to a third party.
-
-     1.1. "Contributor" means each entity that creates or contributes to
-     the creation of Modifications.
-
-     1.2. "Contributor Version" means the combination of the Original
-     Code, prior Modifications used by a Contributor, and the Modifications
-     made by that particular Contributor.
-
-     1.3. "Covered Code" means the Original Code or Modifications or the
-     combination of the Original Code and Modifications, in each case
-     including portions thereof.
-
-     1.4. "Electronic Distribution Mechanism" means a mechanism generally
-     accepted in the software development community for the electronic
-     transfer of data.
-
-     1.5. "Executable" means Covered Code in any form other than Source
-     Code.
-
-     1.6. "Initial Developer" means the individual or entity identified
-     as the Initial Developer in the Source Code notice required by Exhibit
-     A.
-
-     1.7. "Larger Work" means a work which combines Covered Code or
-     portions thereof with code not governed by the terms of this License.
-
-     1.8. "License" means this document.
-
-     1.8.1. "Licensable" means having the right to grant, to the maximum
-     extent possible, whether at the time of the initial grant or
-     subsequently acquired, any and all of the rights conveyed herein.
-
-     1.9. "Modifications" means any addition to or deletion from the
-     substance or structure of either the Original Code or any previous
-     Modifications. When Covered Code is released as a series of files, a
-     Modification is:
-          A. Any addition to or deletion from the contents of a file
-          containing Original Code or previous Modifications.
-
-          B. Any new file that contains any part of the Original Code or
-          previous Modifications.
-
-     1.10. "Original Code" means Source Code of computer software code
-     which is described in the Source Code notice required by Exhibit A as
-     Original Code, and which, at the time of its release under this
-     License is not already Covered Code governed by this License.
-
-     1.10.1. "Patent Claims" means any patent claim(s), now owned or
-     hereafter acquired, including without limitation,  method, process,
-     and apparatus claims, in any patent Licensable by grantor.
-
-     1.11. "Source Code" means the preferred form of the Covered Code for
-     making modifications to it, including all modules it contains, plus
-     any associated interface definition files, scripts used to control
-     compilation and installation of an Executable, or source code
-     differential comparisons against either the Original Code or another
-     well known, available Covered Code of the Contributor's choice. The
-     Source Code can be in a compressed or archival form, provided the
-     appropriate decompression or de-archiving software is widely available
-     for no charge.
-
-     1.12. "You" (or "Your")  means an individual or a legal entity
-     exercising rights under, and complying with all of the terms of, this
-     License or a future version of this License issued under Section 6.1.
-     For legal entities, "You" includes any entity which controls, is
-     controlled by, or is under common control with You. For purposes of
-     this definition, "control" means (a) the power, direct or indirect,
-     to cause the direction or management of such entity, whether by
-     contract or otherwise, or (b) ownership of more than fifty percent
-     (50%) of the outstanding shares or beneficial ownership of such
-     entity.
-
-2. Source Code License.
-
-     2.1. The Initial Developer Grant.
-     The Initial Developer hereby grants You a world-wide, royalty-free,
-     non-exclusive license, subject to third party intellectual property
-     claims:
-          (a)  under intellectual property rights (other than patent or
-          trademark) Licensable by Initial Developer to use, reproduce,
-          modify, display, perform, sublicense and distribute the Original
-          Code (or portions thereof) with or without Modifications, and/or
-          as part of a Larger Work; and
-
-          (b) under Patents Claims infringed by the making, using or
-          selling of Original Code, to make, have made, use, practice,
-          sell, and offer for sale, and/or otherwise dispose of the
-          Original Code (or portions thereof).
-
-          (c) the licenses granted in this Section 2.1(a) and (b) are
-          effective on the date Initial Developer first distributes
-          Original Code under the terms of this License.
-
-          (d) Notwithstanding Section 2.1(b) above, no patent license is
-          granted: 1) for code that You delete from the Original Code; 2)
-          separate from the Original Code;  or 3) for infringements caused
-          by: i) the modification of the Original Code or ii) the
-          combination of the Original Code with other software or devices.
-
-     2.2. Contributor Grant.
-     Subject to third party intellectual property claims, each Contributor
-     hereby grants You a world-wide, royalty-free, non-exclusive license
-
-          (a)  under intellectual property rights (other than patent or
-          trademark) Licensable by Contributor, to use, reproduce, modify,
-          display, perform, sublicense and distribute the Modifications
-          created by such Contributor (or portions thereof) either on an
-          unmodified basis, with other Modifications, as Covered Code
-          and/or as part of a Larger Work; and
-
-          (b) under Patent Claims infringed by the making, using, or
-          selling of  Modifications made by that Contributor either alone
-          and/or in combination with its Contributor Version (or portions
-          of such combination), to make, use, sell, offer for sale, have
-          made, and/or otherwise dispose of: 1) Modifications made by that
-          Contributor (or portions thereof); and 2) the combination of
-          Modifications made by that Contributor with its Contributor
-          Version (or portions of such combination).
-
-          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
-          effective on the date Contributor first makes Commercial Use of
-          the Covered Code.
-
-          (d)    Notwithstanding Section 2.2(b) above, no patent license is
-          granted: 1) for any code that Contributor has deleted from the
-          Contributor Version; 2)  separate from the Contributor Version;
-          3)  for infringements caused by: i) third party modifications of
-          Contributor Version or ii)  the combination of Modifications made
-          by that Contributor with other software  (except as part of the
-          Contributor Version) or other devices; or 4) under Patent Claims
-          infringed by Covered Code in the absence of Modifications made by
-          that Contributor.
-
-3. Distribution Obligations.
-
-     3.1. Application of License.
-     The Modifications which You create or to which You contribute are
-     governed by the terms of this License, including without limitation
-     Section 2.2. The Source Code version of Covered Code may be
-     distributed only under the terms of this License or a future version
-     of this License released under Section 6.1, and You must include a
-     copy of this License with every copy of the Source Code You
-     distribute. You may not offer or impose any terms on any Source Code
-     version that alters or restricts the applicable version of this
-     License or the recipients' rights hereunder. However, You may include
-     an additional document offering the additional rights described in
-     Section 3.5.
-
-     3.2. Availability of Source Code.
-     Any Modification which You create or to which You contribute must be
-     made available in Source Code form under the terms of this License
-     either on the same media as an Executable version or via an accepted
-     Electronic Distribution Mechanism to anyone to whom you made an
-     Executable version available; and if made available via Electronic
-     Distribution Mechanism, must remain available for at least twelve (12)
-     months after the date it initially became available, or at least six
-     (6) months after a subsequent version of that particular Modification
-     has been made available to such recipients. You are responsible for
-     ensuring that the Source Code version remains available even if the
-     Electronic Distribution Mechanism is maintained by a third party.
-
-     3.3. Description of Modifications.
-     You must cause all Covered Code to which You contribute to contain a
-     file documenting the changes You made to create that Covered Code and
-     the date of any change. You must include a prominent statement that
-     the Modification is derived, directly or indirectly, from Original
-     Code provided by the Initial Developer and including the name of the
-     Initial Developer in (a) the Source Code, and (b) in any notice in an
-     Executable version or related documentation in which You describe the
-     origin or ownership of the Covered Code.
-
-     3.4. Intellectual Property Matters
-          (a) Third Party Claims.
-          If Contributor has knowledge that a license under a third party's
-          intellectual property rights is required to exercise the rights
-          granted by such Contributor under Sections 2.1 or 2.2,
-          Contributor must include a text file with the Source Code
-          distribution titled "LEGAL" which describes the claim and the
-          party making the claim in sufficient detail that a recipient will
-          know whom to contact. If Contributor obtains such knowledge after
-          the Modification is made available as described in Section 3.2,
-          Contributor shall promptly modify the LEGAL file in all copies
-          Contributor makes available thereafter and shall take other steps
-          (such as notifying appropriate mailing lists or newsgroups)
-          reasonably calculated to inform those who received the Covered
-          Code that new knowledge has been obtained.
-
-          (b) Contributor APIs.
-          If Contributor's Modifications include an application programming
-          interface and Contributor has knowledge of patent licenses which
-          are reasonably necessary to implement that API, Contributor must
-          also include this information in the LEGAL file.
-
-               (c)    Representations.
-          Contributor represents that, except as disclosed pursuant to
-          Section 3.4(a) above, Contributor believes that Contributor's
-          Modifications are Contributor's original creation(s) and/or
-          Contributor has sufficient rights to grant the rights conveyed by
-          this License.
-
-     3.5. Required Notices.
-     You must duplicate the notice in Exhibit A in each file of the Source
-     Code.  If it is not possible to put such notice in a particular Source
-     Code file due to its structure, then You must include such notice in a
-     location (such as a relevant directory) where a user would be likely
-     to look for such a notice.  If You created one or more Modification(s)
-     You may add your name as a Contributor to the notice described in
-     Exhibit A.  You must also duplicate this License in any documentation
-     for the Source Code where You describe recipients' rights or ownership
-     rights relating to Covered Code.  You may choose to offer, and to
-     charge a fee for, warranty, support, indemnity or liability
-     obligations to one or more recipients of Covered Code. However, You
-     may do so only on Your own behalf, and not on behalf of the Initial
-     Developer or any Contributor. You must make it absolutely clear than
-     any such warranty, support, indemnity or liability obligation is
-     offered by You alone, and You hereby agree to indemnify the Initial
-     Developer and every Contributor for any liability incurred by the
-     Initial Developer or such Contributor as a result of warranty,
-     support, indemnity or liability terms You offer.
-
-     3.6. Distribution of Executable Versions.
-     You may distribute Covered Code in Executable form only if the
-     requirements of Section 3.1-3.5 have been met for that Covered Code,
-     and if You include a notice stating that the Source Code version of
-     the Covered Code is available under the terms of this License,
-     including a description of how and where You have fulfilled the
-     obligations of Section 3.2. The notice must be conspicuously included
-     in any notice in an Executable version, related documentation or
-     collateral in which You describe recipients' rights relating to the
-     Covered Code. You may distribute the Executable version of Covered
-     Code or ownership rights under a license of Your choice, which may
-     contain terms different from this License, provided that You are in
-     compliance with the terms of this License and that the license for the
-     Executable version does not attempt to limit or alter the recipient's
-     rights in the Source Code version from the rights set forth in this
-     License. If You distribute the Executable version under a different
-     license You must make it absolutely clear that any terms which differ
-     from this License are offered by You alone, not by the Initial
-     Developer or any Contributor. You hereby agree to indemnify the
-     Initial Developer and every Contributor for any liability incurred by
-     the Initial Developer or such Contributor as a result of any such
-     terms You offer.
-
-     3.7. Larger Works.
-     You may create a Larger Work by combining Covered Code with other code
-     not governed by the terms of this License and distribute the Larger
-     Work as a single product. In such a case, You must make sure the
-     requirements of this License are fulfilled for the Covered Code.
-
-4. Inability to Comply Due to Statute or Regulation.
-
-     If it is impossible for You to comply with any of the terms of this
-     License with respect to some or all of the Covered Code due to
-     statute, judicial order, or regulation then You must: (a) comply with
-     the terms of this License to the maximum extent possible; and (b)
-     describe the limitations and the code they affect. Such description
-     must be included in the LEGAL file described in Section 3.4 and must
-     be included with all distributions of the Source Code. Except to the
-     extent prohibited by statute or regulation, such description must be
-     sufficiently detailed for a recipient of ordinary skill to be able to
-     understand it.
-
-5. Application of this License.
-
-     This License applies to code to which the Initial Developer has
-     attached the notice in Exhibit A and to related Covered Code.
-
-6. Versions of the License.
-
-     6.1. New Versions.
-     Netscape Communications Corporation ("Netscape") may publish revised
-     and/or new versions of the License from time to time. Each version
-     will be given a distinguishing version number.
-
-     6.2. Effect of New Versions.
-     Once Covered Code has been published under a particular version of the
-     License, You may always continue to use it under the terms of that
-     version. You may also choose to use such Covered Code under the terms
-     of any subsequent version of the License published by Netscape. No one
-     other than Netscape has the right to modify the terms applicable to
-     Covered Code created under this License.
-
-     6.3. Derivative Works.
-     If You create or use a modified version of this License (which you may
-     only do in order to apply it to code which is not already Covered Code
-     governed by this License), You must (a) rename Your license so that
-     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
-     "MPL", "NPL" or any confusingly similar phrase do not appear in your
-     license (except to note that your license differs from this License)
-     and (b) otherwise make it clear that Your version of the license
-     contains terms which differ from the Mozilla Public License and
-     Netscape Public License. (Filling in the name of the Initial
-     Developer, Original Code or Contributor in the notice described in
-     Exhibit A shall not of themselves be deemed to be modifications of
-     this License.)
-
-7. DISCLAIMER OF WARRANTY.
-
-     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
-     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
-     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
-     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
-     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
-     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
-     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
-     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
-     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
-     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-8. TERMINATION.
-
-     8.1.  This License and the rights granted hereunder will terminate
-     automatically if You fail to comply with terms herein and fail to cure
-     such breach within 30 days of becoming aware of the breach. All
-     sublicenses to the Covered Code which are properly granted shall
-     survive any termination of this License. Provisions which, by their
-     nature, must remain in effect beyond the termination of this License
-     shall survive.
-
-     8.2.  If You initiate litigation by asserting a patent infringement
-     claim (excluding declatory judgment actions) against Initial Developer
-     or a Contributor (the Initial Developer or Contributor against whom
-     You file such action is referred to as "Participant")  alleging that:
-
-     (a)  such Participant's Contributor Version directly or indirectly
-     infringes any patent, then any and all rights granted by such
-     Participant to You under Sections 2.1 and/or 2.2 of this License
-     shall, upon 60 days notice from Participant terminate prospectively,
-     unless if within 60 days after receipt of notice You either: (i)
-     agree in writing to pay Participant a mutually agreeable reasonable
-     royalty for Your past and future use of Modifications made by such
-     Participant, or (ii) withdraw Your litigation claim with respect to
-     the Contributor Version against such Participant.  If within 60 days
-     of notice, a reasonable royalty and payment arrangement are not
-     mutually agreed upon in writing by the parties or the litigation claim
-     is not withdrawn, the rights granted by Participant to You under
-     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
-     the 60 day notice period specified above.
-
-     (b)  any software, hardware, or device, other than such Participant's
-     Contributor Version, directly or indirectly infringes any patent, then
-     any rights granted to You by such Participant under Sections 2.1(b)
-     and 2.2(b) are revoked effective as of the date You first made, used,
-     sold, distributed, or had made, Modifications made by that
-     Participant.
-
-     8.3.  If You assert a patent infringement claim against Participant
-     alleging that such Participant's Contributor Version directly or
-     indirectly infringes any patent where such claim is resolved (such as
-     by license or settlement) prior to the initiation of patent
-     infringement litigation, then the reasonable value of the licenses
-     granted by such Participant under Sections 2.1 or 2.2 shall be taken
-     into account in determining the amount or value of any payment or
-     license.
-
-     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
-     all end user license agreements (excluding distributors and resellers)
-     which have been validly granted by You or any distributor hereunder
-     prior to termination shall survive termination.
-
-9. LIMITATION OF LIABILITY.
-
-     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
-     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
-     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
-     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
-     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
-     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
-     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
-     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
-     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
-     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
-     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
-     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
-     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
-     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
-
-10. U.S. GOVERNMENT END USERS.
-
-     The Covered Code is a "commercial item," as that term is defined in
-     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
-     software" and "commercial computer software documentation," as such
-     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
-     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
-     all U.S. Government End Users acquire Covered Code with only those
-     rights set forth herein.
-
-11. MISCELLANEOUS.
-
-     This License represents the complete agreement concerning subject
-     matter hereof. If any provision of this License is held to be
-     unenforceable, such provision shall be reformed only to the extent
-     necessary to make it enforceable. This License shall be governed by
-     California law provisions (except to the extent applicable law, if
-     any, provides otherwise), excluding its conflict-of-law provisions.
-     With respect to disputes in which at least one party is a citizen of,
-     or an entity chartered or registered to do business in the United
-     States of America, any litigation relating to this License shall be
-     subject to the jurisdiction of the Federal Courts of the Northern
-     District of California, with venue lying in Santa Clara County,
-     California, with the losing party responsible for costs, including
-     without limitation, court costs and reasonable attorneys' fees and
-     expenses. The application of the United Nations Convention on
-     Contracts for the International Sale of Goods is expressly excluded.
-     Any law or regulation which provides that the language of a contract
-     shall be construed against the drafter shall not apply to this
-     License.
-
-12. RESPONSIBILITY FOR CLAIMS.
-
-     As between Initial Developer and the Contributors, each party is
-     responsible for claims and damages arising, directly or indirectly,
-     out of its utilization of rights under this License and You agree to
-     work with Initial Developer and Contributors to distribute such
-     responsibility on an equitable basis. Nothing herein is intended or
-     shall be deemed to constitute any admission of liability.
-
-13. MULTIPLE-LICENSED CODE.
-
-     Initial Developer may designate portions of the Covered Code as
-     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
-     Developer permits you to utilize portions of the Covered Code under
-     Your choice of the NPL or the alternative licenses, if any, specified
-     by the Initial Developer in the file described in Exhibit A.
-
-EXHIBIT A -Mozilla Public License.
-
-     ``The contents of this file are subject to the Mozilla Public License
-     Version 1.1 (the "License"); you may not use this file except in
-     compliance with the License. You may obtain a copy of the License at
-     http://www.mozilla.org/MPL/
-
-     Software distributed under the License is distributed on an "AS IS"
-     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-     License for the specific language governing rights and limitations
-     under the License.
-
-     The Original Code is ______________________________________.
-
-     The Initial Developer of the Original Code is ________________________.
-     Portions created by ______________________ are Copyright (C) ______
-     _______________________. All Rights Reserved.
-
-     Contributor(s): ______________________________________.
-
-     Alternatively, the contents of this file may be used under the terms
-     of the _____ license (the  "[___] License"), in which case the
-     provisions of [______] License are applicable instead of those
-     above.  If you wish to allow use of your version of this file only
-     under the terms of the [____] License and not to allow others to use
-     your version of this file under the MPL, indicate your decision by
-     deleting  the provisions above and replace  them with the notice and
-     other provisions required by the [___] License.  If you do not delete
-     the provisions above, a recipient may use your version of this file
-     under either the MPL or the [___] License."
-
-     [NOTE: The text of this Exhibit A may differ slightly from the text of
-     the notices in the Source Code files of the Original Code. You should
-     use the text of this Exhibit A rather than the text found in the
-     Original Code Source Code for Your Modifications.]
-
-     ----------------------------------------------------------------------
-
-     AMENDMENTS
-
-     The Netscape Public License Version 1.1 ("NPL") consists of the
-     Mozilla Public License Version 1.1 with the following Amendments,
-     including Exhibit A-Netscape Public License.  Files identified with
-     "Exhibit A-Netscape Public License" are governed by the Netscape
-     Public License Version 1.1.
-
-     Additional Terms applicable to the Netscape Public License.
-          I. Effect.
-          These additional terms described in this Netscape Public
-          License -- Amendments shall apply to the Mozilla Communicator
-          client code and to all Covered Code under this License.
-
-          II. "Netscape's Branded Code" means Covered Code that Netscape
-          distributes and/or permits others to distribute under one or more
-          trademark(s) which are controlled by Netscape but which are not
-          licensed for use under this License.
-
-          III. Netscape and logo.
-          This License does not grant any rights to use the trademarks
-          "Netscape", the "Netscape N and horizon" logo or the "Netscape
-          lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
-          "Smart Browsing" even if such marks are included in the Original
-          Code or Modifications.
-
-          IV. Inability to Comply Due to Contractual Obligation.
-          Prior to licensing the Original Code under this License, Netscape
-          has licensed third party code for use in Netscape's Branded Code.
-          To the extent that Netscape is limited contractually from making
-          such third party code available under this License, Netscape may
-          choose to reintegrate such code into Covered Code without being
-          required to distribute such code in Source Code form, even if
-          such code would otherwise be considered "Modifications" under
-          this License.
-
-          V. Use of Modifications and Covered Code by Initial Developer.
-               V.1. In General.
-               The obligations of Section 3 apply to Netscape, except to
-               the extent specified in this Amendment, Section V.2 and V.3.
-
-               V.2. Other Products.
-               Netscape may include Covered Code in products other than the
-               Netscape's Branded Code which are released by Netscape
-               during the two (2) years following the release date of the
-               Original Code, without such additional products becoming
-               subject to the terms of this License, and may license such
-               additional products on different terms from those contained
-               in this License.
-
-               V.3. Alternative Licensing.
-               Netscape may license the Source Code of Netscape's Branded
-               Code, including Modifications incorporated therein, without
-               such Netscape Branded Code becoming subject to the terms of
-               this License, and may license such Netscape Branded Code on
-               different terms from those contained in this License.
-
-          VI. Litigation.
-          Notwithstanding the limitations of Section 11 above, the
-          provisions regarding litigation in Section 11(a), (b) and (c) of
-          the License shall apply to all disputes relating to this License.
-
-     EXHIBIT A-Netscape Public License.
-
-          "The contents of this file are subject to the Netscape Public
-          License Version 1.1 (the "License"); you may not use this file
-          except in compliance with the License. You may obtain a copy of
-          the License at http://www.mozilla.org/NPL/
-
-          Software distributed under the License is distributed on an "AS
-          IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-          implied. See the License for the specific language governing
-          rights and limitations under the License.
-
-          The Original Code is Mozilla Communicator client code, released
-          March 31, 1998.
-
-          The Initial Developer of the Original Code is Netscape
-          Communications Corporation. Portions created by Netscape are
-          Copyright (C) 1998-1999 Netscape Communications Corporation. All
-          Rights Reserved.
-
-          Contributor(s): ______________________________________.
-
-          Alternatively, the contents of this file may be used under the
-          terms of the _____ license (the "[___] License"), in which case
-          the provisions of [______] License are applicable  instead of
-          those above.  If you wish to allow use of your version of this
-          file only under the terms of the [____] License and not to allow
-          others to use your version of this file under the NPL, indicate
-          your decision by deleting  the provisions above and replace  them
-          with the notice and other provisions required by the [___]
-          License.  If you do not delete the provisions above, a recipient
-          may use your version of this file under either the NPL or the
-          [___] License."

File src/SDL_rotozoom/README

  • Ignore whitespace
-This is the README file for SDL_Rotozoom
-note that this source has had some changes from version 1.4 of SDL_rotozoom
-
-The rotozoom function has been changed to always return a 32bit surface
-if smoothing has been requested.
-
-
-
-The following is the original README file...
-
-
-Rotozoom/Zoom function for SDL
-========================================================================================
-
-(c) LGPL, A. Schiffler, aschiffler@home.com
-
-
-INTERFACE
----------
- 
- 
-SDL_Surface * rotozoomSurface (SDL_Surface *src, double angle, double zoom, int smooth);
-
- Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
- 'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
- then the destination 32bit surface is anti-aliased. If the surface is not 8bit
- or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
-
-
-
-SDL_Surface * zoomSurface (SDL_Surface *src, double zoomx, double zoomy, int smooth);
-
- Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
- 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
- then the destination 32bit surface is anti-aliased. If the surface is not 8bit
- or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
-
-
-Smoothing (interpolation) flags work only on 32bit surfaces:
-
- #define SMOOTHING_OFF		0
- #define SMOOTHING_ON		1
-
-
-EXAMPLE
--------
-
-Run 
-	./configure
-	make
-
-Test with
-	./testrotozoom
-
-Check out the testrotozoom.c code for how to preprocess non-32bit surfaces
-for better speed.
-
-
-CHANGES
--------
-
-Ver 1.0 - Fri Mar 16 08:16:06 EST 2001
-* Initial release
-
-Ver 1.1 - Wed May 23 15:04:42 EDT 2001
-* Added automake/autoconf scripts and testprogram.
-
-Ver 1.2 - Wed May 30 18:18:05 EDT 2001
-* Fixed the completely broken 32bit routine's pointer arithmetic.
-* Uses SDL_SoftStretch in certain cases (angle=0, smooth=0).
-* Convert source surface on the fly if not 8/32bit.
-* Added license file - was empty before (duh).
-
-Ver 1.3 - Thu May 31 08:37:36 EDT 2001
-* Modified code to handle RGBA or ABGR source surfaces transparently.
-* More error checking, source surface locking.
-* Slighly expanded test program with event handling.
-
-Ver 1.4 - Mon Jun  4 12:15:31 EDT 2001
-* Removed SDL_SoftStretch call again in favour of an internal zoom routine.
-* Added new zoomSurface() function with seperate X and Y zoom factors.
-
-
-COMMENTS
---------
-
-The code is not super optimal - but it should be fast enough even for some
-realtime effects if the bitmaps are kept small.
-
-The routines are mostly meant to be used for pre-rendering stuff in higher 
-quality (i.e. smoothing) - that's also a reason why the API differs from 
-SDL_BlitRect() and creates new target surfaces. The final rendering speed 
-is dependent on the target surface size as as it is beeing xy-scanned when
-rendering.

File src/SDL_rotozoom/SDL_rotozoom.c

  • Ignore whitespace
-
-/* SDL_rotozoom.c - see README for info and (c) */
-
-#include <stdlib.h>
-#include <string.h>
-#include "SDL_rotozoom.h"
-
-#ifndef max
-#define max(a,b) ((a)>=(b)?(a):(b))
-#endif
-
-/* 
- 
- 32bit Zoomer with optional anti-aliasing by bilinear interpolation.
-
- Zoomes 32bit RGBA/ABGR 'src' surface to 'dst' surface.
- 
-*/  
-
-int zoomSurfaceRGBA (SDL_Surface *src, SDL_Surface *dst, int smooth)
-{
- int x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy, ex, ey, t1, t2, sstep;
- tColorRGBA *c00, *c01, *c10, *c11;
- tColorRGBA *sp, *csp, *dp;
- int sgap, dgap, orderRGBA;
- 
- /* Variable setup */
- if (smooth) {
-  /* For interpolation: assume source dimension is one pixel */
-  /* smaller to avoid overflow on right and bottom edge.     */
-  sx=(int)(65536.0*(float)(src->w-1)/(float)dst->w);
-  sy=(int)(65536.0*(float)(src->h-1)/(float)dst->h);
- } else {
-  sx=(int)(65536.0*(float)src->w/(float)dst->w);
-  sy=(int)(65536.0*(float)src->h/(float)dst->h);
- }
-
- /* Allocate space for increments */
- if ((sax=(int *)malloc((dst->w+1)*sizeof(Uint32)))==NULL) {
-  return(-1);
- } 
- if ((say=(int *)malloc((dst->h+1)*sizeof(Uint32)))==NULL) {
-  free(sax);
-  return(-1);
- }
- /* Precalculate increments */
- csx=0;
- csax=sax;
- for (x=0; x<=dst->w; x++) {
-  *csax=csx;
-  csax++;
-  csx &= 0xffff;
-  csx += sx;
- }
- csy=0;
- csay=say;
- for (y=0; y<=dst->h; y++) {
-  *csay=csy;
-  csay++;
-  csy &= 0xffff;
-  csy += sy;
- }
-
- /* Pointer setup */
- sp=csp=(tColorRGBA *)src->pixels;
- dp=(tColorRGBA *)dst->pixels;
- sgap=src->pitch - src->w*4;
- dgap=dst->pitch - dst->w*4;
- orderRGBA=(src->format->Rmask==0x000000ff);
-
- /* Switch between interpolating and non-interpolating code */
- if (smooth) {
-
-  /* Scan destination */
-  csay=say;
-  for (y=0; y<dst->h; y++) {
-   /* Setup color source pointers */
-   c00=csp;
-   c01=csp; c01++;
-   c10=(tColorRGBA *)((Uint8 *)csp+src->pitch);
-   c11=c10; c11++;
-   csax=sax;
-   for (x=0; x<dst->w; x++) {
-     /* Switch between RGBA and ABGR ordering */
-     if (orderRGBA) {
-      /* RGBA ordering */
-      /* Copy Alpha */
-      dp->a=c00->a;
-      /* Is pixel visible? */
-      if (c00->a>0) {
-       /* Interpolate colors */
-       ex=(*csax & 0xffff);
-       ey=(*csay & 0xffff);
-       t1=((((c01->b-c00->b)*ex) >> 16) + c00->b) & 0xff;   
-       t2=((((c11->b-c10->b)*ex) >> 16) + c10->b) & 0xff;
-       dp->b=(((t2-t1)*ey) >> 16) + t1;
-       t1=((((c01->g-c00->g)*ex) >> 16) + c00->g) & 0xff;   
-       t2=((((c11->g-c10->g)*ex) >> 16) + c10->g) & 0xff;
-       dp->g=(((t2-t1)*ey) >> 16) + t1;
-       t1=((((c01->r-c00->r)*ex) >> 16) + c00->r) & 0xff;   
-       t2=((((c11->r-c10->r)*ex) >> 16) + c10->r) & 0xff;
-       dp->r=(((t2-t1)*ey) >> 16) + t1;
-      }
-     } else {
-      /* ABGR ordering */
-      /* Copy Alpha */
-      dp->r=c00->r;
-      /* Is pixel visible? */
-      if (c00->r>0) {
-       /* Interpolate colors */
-       ex=(*csax & 0xffff);
-       ey=(*csay & 0xffff);
-       t1=((((c01->g-c00->g)*ex) >> 16) + c00->g) & 0xff;   
-       t2=((((c11->g-c10->g)*ex) >> 16) + c10->g) & 0xff;
-       dp->g=(((t2-t1)*ey) >> 16) + t1;
-       t1=((((c01->b-c00->b)*ex) >> 16) + c00->b) & 0xff;   
-       t2=((((c11->b-c10->b)*ex) >> 16) + c10->b) & 0xff;
-       dp->b=(((t2-t1)*ey) >> 16) + t1;
-       t1=((((c01->a-c00->a)*ex) >> 16) + c00->a) & 0xff;   
-       t2=((((c11->a-c10->a)*ex) >> 16) + c10->a) & 0xff;
-       dp->a=(((t2-t1)*ey) >> 16) + t1;
-      }
-    }   
-    /* Advance source pointers */
-    csax++;
-    sstep=(*csax >> 16);
-    c00 += sstep;
-    c01 += sstep;
-    c10 += sstep;
-    c11 += sstep;
-    /* Advance destination pointer */
-    dp++;
-   }
-   /* Advance source pointer */
-   csay++;
-   csp = (tColorRGBA *)((Uint8 *)csp+(*csay >> 16)*src->pitch);
-   /* Advance destination pointers */
-   dp = (tColorRGBA *)((Uint8 *)dp+dgap);
-  }
-
- } else {
-
-  csay=say;
-  for (y=0; y<dst->h; y++) {
-   sp=csp;
-   csax=sax;
-   for (x=0; x<dst->w; x++) {
-    /* Draw */
-    *dp=*sp;
-    /* Advance source pointers */
-    csax++;
-    sp += (*csax >> 16);
-    /* Advance destination pointer */
-    dp++;
-   }
-   /* Advance source pointer */
-   csay++;
-   csp = (tColorRGBA *)((Uint8 *)csp+(*csay >> 16)*src->pitch);
-   /* Advance destination pointers */
-   dp = (tColorRGBA *)((Uint8 *)dp+dgap);
-  }
-
- }
-
- /* Remove temp arrays */
- free (sax);
- free (say);
-
- return(0);
-}
-
-/* 
- 
- Zoomer without smoothing.
-
- Zoomes 8bit palette/Y 'src' surface to 'dst' surface.
- 
-*/  
-
-int zoomSurfaceY (SDL_Surface *src, SDL_Surface *dst)
-{
- int x, y;
- Uint32 sx, sy, *sax, *say, *csax, *csay, csx, csy;
- Uint8 *sp, *dp, *csp;
- int dgap;
-
- /* Variable setup */
- sx=(Uint32)(65536.0*(float)src->w/(float)dst->w);
- sy=(Uint32)(65536.0*(float)src->h/(float)dst->h);
-
- /* Precalculate increments */
- if ((sax=(Uint32 *)malloc(dst->w*sizeof(Uint32)))==NULL) {
-  return(-1);
- } 
- if ((say=(Uint32 *)malloc(dst->h*sizeof(Uint32)))==NULL) {
-  if (sax!=NULL) {
-   free(sax);
-  }
-  return(-1);
- }
- csx=0;
- csax=sax;
- for (x=0; x<dst->w; x++) {
-  csx += sx;
-  *csax=(csx >> 16);
-  csx &= 0xffff;
-  csax++;
- }
- csy=0;
- csay=say;
- for (y=0; y<dst->h; y++) {
-  csy += sy;
-  *csay=(csy >> 16);
-  csy &= 0xffff;
-  csay++;
- }
-
- csx=0;
- csax=sax;
- for (x=0; x<dst->w; x++) {
-  csx += (*csax);
-  csax++;
- }
- csy=0;
- csay=say;
- for (y=0; y<dst->h; y++) {
-  csy += (*csay);
-  csay++;
- }
-
- /* Pointer setup */
- sp=csp=(Uint8 *)src->pixels;
- dp=(Uint8 *)dst->pixels;
- dgap=dst->pitch - dst->w;
-
- /* Draw */
- csay=say;
- for (y=0; y<dst->h; y++) {
-  csax=sax;
-  sp=csp;
-  for (x=0; x<dst->w; x++) {
-   /* Draw */
-   *dp=*sp;
-   /* Advance source pointers */
-   sp += (*csax);
-   csax++;
-   /* Advance destination pointer */
-   dp++;
-  }
-  /* Advance source pointer (for row) */
-  csp += ((*csay)*src->pitch);
-  csay++;
-  /* Advance destination pointers */
-  dp += dgap;
- }
-
- /* Remove temp arrays */
- free(sax);
- free(say);
-
- return(0);
-}
-
-/* 
- 
- 32bit Rotozoomer with optional anti-aliasing by bilinear interpolation.
-
- Rotates and zoomes 32bit RGBA/ABGR 'src' surface to 'dst' surface.
- 
-*/  
-
-void transformSurfaceRGBA (SDL_Surface *src, SDL_Surface *dst, int cx, int cy, int isin, int icos, int smooth)
-{
- int x,y,t1,t2,dx,dy,xd,yd,sdx,sdy,ax,ay,ex,ey,sw,sh;
- tColorRGBA c00, c01, c10, c11;
- tColorRGBA *pc, *sp;
- int gap, orderRGBA;
- 
- /* Variable setup */
- xd=((src->w-dst->w) << 15);
- yd=((src->h-dst->h) << 15);
- ax=(cx << 16)-(icos*cx);
- ay=(cy << 16)-(isin*cx);
- sw=src->w-1;
- sh=src->h-1;
- pc=dst->pixels;
- gap=dst->pitch - dst->w*4;
- orderRGBA=(src->format->Rmask==0x000000ff);
-
- /* Switch between interpolating and non-interpolating code */
- if (smooth) {
-  for (y=0; y<dst->h; y++) {
-   dy=cy-y;
-   sdx=(ax+(isin*dy))+xd;
-   sdy=(ay-(icos*dy))+yd;
-   for (x=0; x<dst->w; x++) {
-    dx=(sdx >> 16);
-    dy=(sdy >> 16);
-    if ((dx>=-1) && (dy>=-1) && (dx<src->w) && (dy<src->h)) {
-     if ((dx>=0) && (dy>=0) && (dx<sw) && (dy<sh)) {
-      sp=(tColorRGBA *)((Uint8 *)src->pixels+src->pitch*dy); sp += dx;
-      c00 = *sp; sp += 1;
-      c01 = *sp; sp = (tColorRGBA *)((Uint8 *)sp+src->pitch); sp -= 1;
-      c10 = *sp; sp += 1;
-      c11 = *sp;
-     } else if ((dx==sw) && (dy==sh)) {
-      sp=(tColorRGBA *)((Uint8 *)src->pixels+src->pitch*dy); sp += dx;
-      c00 = *sp;
-      c01 = *pc;
-      c10 = *pc;
-      c11 = *pc;
-     } else if ((dx==-1) && (dy==-1)) {
-      sp=(tColorRGBA *)(src->pixels);
-      c00 = *pc;
-      c01 = *pc;
-      c10 = *pc;
-      c11 = *sp;
-     } else if ((dx==-1) && (dy==sh)) {
-      sp=(tColorRGBA *)(src->pixels); 
-      sp=(tColorRGBA *)((Uint8 *)src->pixels+src->pitch*dy);
-      c00 = *pc;
-      c01 = *sp;
-      c10 = *pc;
-      c11 = *pc;
-     } else if ((dx==sw) && (dy==-1)) {
-      sp=(tColorRGBA *)(src->pixels); sp += dx;
-      c00 = *pc;
-      c01 = *pc;
-      c10 = *sp;
-      c11 = *pc;
-     } else if (dx==-1) {
-      sp=(tColorRGBA *)((Uint8 *)src->pixels+src->pitch*dy); 
-      c00 = *pc;
-      c01 = *sp;
-      c10 = *pc; sp = (tColorRGBA *)((Uint8 *)sp+src->pitch);
-      c11 = *sp;
-     } else if (dy==-1) {
-      sp=(tColorRGBA *)(src->pixels); sp += dx;
-      c00 = *pc;
-      c01 = *pc;
-      c10 = *sp; sp += 1;
-      c11 = *sp;
-     } else if (dx==sw) {
-      sp=(tColorRGBA *)((Uint8 *)src->pixels+src->pitch*dy); sp += dx;
-      c00 = *sp;
-      c01 = *pc; sp = (tColorRGBA *)((Uint8 *)sp+src->pitch);
-      c10 = *sp; 
-      c11 = *pc;      
-     } else if (dy==sh) {
-      sp=(tColorRGBA *)((Uint8 *)src->pixels+src->pitch*dy); sp += dx;
-      c00 = *sp; sp += 1;
-      c01 = *sp;
-      c10 = *pc;
-      c11 = *pc;      
-     }
-     /* Switch between RGBA and ABGR ordering */
-     if (orderRGBA) {
-      /* RGBA ordering */
-      /* Copy Alpha */
-      pc->a=c00.a;
-      /* Is pixel visible? */
-      if (c00.a>0) {
-       /* Interpolate colors */
-       ex=(sdx & 0xffff);
-       ey=(sdy & 0xffff);
-       t1=((((c01.b-c00.b)*ex) >> 16) + c00.b) & 0xff;   
-       t2=((((c11.b-c10.b)*ex) >> 16) + c10.b) & 0xff;
-       pc->b=(((t2-t1)*ey) >> 16) + t1;
-       t1=((((c01.g-c00.g)*ex) >> 16) + c00.g) & 0xff;   
-       t2=((((c11.g-c10.g)*ex) >> 16) + c10.g) & 0xff;
-       pc->g=(((t2-t1)*ey) >> 16) + t1;
-       t1=((((c01.r-c00.r)*ex) >> 16) + c00.r) & 0xff;   
-       t2=((((c11.r-c10.r)*ex) >> 16) + c10.r) & 0xff;
-       pc->r=(((t2-t1)*ey) >> 16) + t1;
-      }
-     } else {
-      /* ABGR ordering */
-      /* Copy Alpha */
-      pc->r=c00.r;
-      /* Is pixel visible? */
-      if (c00.r>0) {
-       /* Interpolate colors */
-       ex=(sdx & 0xffff);
-       ey=(sdy & 0xffff);
-       t1=((((c01.g-c00.g)*ex) >> 16) + c00.g) & 0xff;   
-       t2=((((c11.g-c10.g)*ex) >> 16) + c10.g) & 0xff;
-       pc->g=(((t2-t1)*ey) >> 16) + t1;
-       t1=((((c01.b-c00.b)*ex) >> 16) + c00.b) & 0xff;   
-       t2=((((c11.b-c10.b)*ex) >> 16) + c10.b) & 0xff;
-       pc->b=(((t2-t1)*ey) >> 16) + t1;
-       t1=((((c01.a-c00.a)*ex) >> 16) + c00.a) & 0xff;   
-       t2=((((c11.a-c10.a)*ex) >> 16) + c10.a) & 0xff;
-       pc->a=(((t2-t1)*ey) >> 16) + t1;
-      }
-     }
-    }
-    sdx += icos;
-    sdy += isin;
-    pc++;
-   }
-   pc = (tColorRGBA *)((Uint8 *)pc+gap);
-  }
- } else {
-  for (y=0; y<dst->h; y++) {
-   dy=cy-y;
-   sdx=(ax+(isin*dy))+xd;
-   sdy=(ay-(icos*dy))+yd;
-   for (x=0; x<dst->w; x++) {
-    dx=(short)(sdx >> 16);
-    dy=(short)(sdy >> 16);
-    if ((dx>=0) && (dy>=0) && (dx<src->w) && (dy<src->h)) {
-     sp=(tColorRGBA *)((Uint8 *)src->pixels+src->pitch*dy); sp += dx;
-     *pc=*sp;
-    }
-    sdx += icos;
-    sdy += isin;
-    pc++;
-   }
-   pc = (tColorRGBA *)((Uint8 *)pc+gap);
-  }  
- }
-}
-
-/* 
- 
- 8bit Rotozoomer without smoothing
-
- Rotates and zoomes 8bit palette/Y 'src' surface to 'dst' surface.
- 
-*/  
-
-void transformSurfaceY (SDL_Surface *src, SDL_Surface *dst, int cx, int cy, int isin, int icos)
-{
- int x,y,dx,dy,xd,yd,sdx,sdy,ax,ay,sw,sh;
- tColorY *pc, *sp;
- int gap;
- 
- /* Variable setup */
- xd=((src->w-dst->w) << 15);
- yd=((src->h-dst->h) << 15);
- ax=(cx << 16)-(icos*cx);
- ay=(cy << 16)-(isin*cx);
- sw=src->w-1;
- sh=src->h-1;
- pc=dst->pixels;
- gap=dst->pitch-dst->w;
- /* Clear surface to colorkey */
- memset(pc, (unsigned char)(src->format->colorkey & 0xff),dst->pitch*dst->h);
- /* Iterate through destination surface */
- for (y=0; y<dst->h; y++) {
-  dy=cy-y;
-  sdx=(ax+(isin*dy))+xd;
-  sdy=(ay-(icos*dy))+yd;
-  for (x=0; x<dst->w; x++) {
-   dx=(short)(sdx >> 16);
-   dy=(short)(sdy >> 16);
-   if ((dx>=0) && (dy>=0) && (dx<src->w) && (dy<src->h)) {
-    sp=(tColorY *)(src->pixels); sp += (src->pitch*dy+dx);
-    *pc=*sp;
-   }
-   sdx += icos;
-   sdy += isin;
-   pc++;
-  }
-  pc += gap;
- }  
-}
-
-/* 
- 
- rotozoomSurface()
-
- Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
- 'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
- then the destination 32bit surface is anti-aliased. If the surface is not 8bit
- or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
-
-*/  
-
-#define VALUE_LIMIT	0.001
-
-SDL_Surface * rotozoomSurface (SDL_Surface *src, double angle, double zoom, int smooth) 
-{
- SDL_Surface *rz_src;
- SDL_Surface *rz_dst;
- double zoominv;
- double radangle, sanglezoom, canglezoom, sanglezoominv, canglezoominv;
- int dstwidthhalf, dstwidth, dstheighthalf, dstheight;
- double x,y,cx,cy,sx,sy;
- int src_converted;
-
- /* Sanity check */
- if (src==NULL) return(NULL);
-
- /* Determine if source surface is 32bit or 8bit */
- if ( src->format->BitsPerPixel==32 ) {
-  /* Use source surface 'as is' */
-  rz_src=src;
-  src_converted=0;
- } else {
-  /* New source surface is 32bit with a defined RGBA ordering */
-  rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
-  SDL_BlitSurface(src,NULL,rz_src,NULL);
-  src_converted=1;
- }
-        
- /* Sanity check zoom factor */
- if (zoom<VALUE_LIMIT) {
-  zoom=VALUE_LIMIT;
- }  
- zoominv=65536.0/zoom;
-
- /* Check if we have a rotozoom or just a zoom */
- if (fabs(angle)>VALUE_LIMIT) { 
-
-  /* Angle!=0: full rotozoom */
-  /* ----------------------- */
-
-  /* Calculate target factors from sin/cos and zoom */ 
-  radangle=angle*(M_PI/180.0);
-  sanglezoom=sanglezoominv=sin(radangle);
-  canglezoom=canglezoominv=cos(radangle);
-  sanglezoom *= zoom;
-  canglezoom *= zoom;
-  sanglezoominv *= zoominv;
-  canglezoominv *= zoominv;
-  
-  /* Determine destination width and height by rotating a centered source box */
-  x=rz_src->w/2;
-  y=rz_src->h/2;
-  cx=canglezoom*x;
-  cy=canglezoom*y;
-  sx=sanglezoom*x;
-  sy=sanglezoom*y;
-  //
-  dstwidthhalf =max((int)ceil(max(max(max(fabs(cx+sy),fabs(cx-sy)),fabs(-cx+sy)),fabs(-cx-sy))),1);
-  dstheighthalf=max((int)ceil(max(max(max(fabs(sx+cy),fabs(sx-cy)),fabs(-sx+cy)),fabs(-sx-cy))),1);
-  dstwidth=2*dstwidthhalf;
-  dstheight=2*dstheighthalf;
- 
-  /* Alloc space to completely contain the rotated surface */
-  rz_dst=NULL;
-  rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask);
-
-  /* Lock source surface */
-  SDL_LockSurface(rz_src);
-
-  /* Check which kind of surface we have */
-  /* Call the 32bit transformation routine to do the rotation (using alpha) */
-  transformSurfaceRGBA(rz_src,rz_dst,dstwidthhalf,dstheighthalf,
-  	      (int)(sanglezoominv),
- 	      (int)(canglezoominv),
- 	      smooth);
-
-  /* Turn on source-alpha support */
-  SDL_SetAlpha(rz_dst, SDL_SRCALPHA , 255);
-
-  /* Unlock source surface */
-  SDL_UnlockSurface(rz_src);
-
- } else {
-
-  /* Angle=0: Just a zoom */
-  /* -------------------- */
-
-  /* Calculate target size and set rect */
-  dstwidth=(int)((double)rz_src->w*zoom);
-  dstheight=(int)((double)rz_src->h*zoom);
-  if (dstwidth<1) { 
-   dstwidth=1;
-  }
-  if (dstheight<1) {
-   dstheight=1;
-  }
-
-  /* Alloc space to completely contain the zoomed surface */
-  rz_dst=NULL;
-  rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask);
-
-  /* Lock source surface */
-  SDL_LockSurface(rz_src);
-  /* Check which kind of surface we have */
-  /* Call the 32bit transformation routine to do the zooming (using alpha) */
-  zoomSurfaceRGBA(rz_src,rz_dst,smooth);
-  /* Turn on source-alpha support */
-  SDL_SetAlpha(rz_dst, SDL_SRCALPHA , 255);
-
-  /* Unlock source surface */
-  SDL_UnlockSurface(rz_src);
- }
-
- /* Cleanup temp surface */
- if (src_converted) {
-  SDL_FreeSurface(rz_src);
- }
-
- /* Return destination surface */
- return(rz_dst);
-}
-
-/* 
- 
- zoomSurface()
-
- Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
- 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
- then the destination 32bit surface is anti-aliased. If the surface is not 8bit
- or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
-
-*/  
-
-#define VALUE_LIMIT	0.001
-
-SDL_Surface * zoomSurface (SDL_Surface *src, double zoomx, double zoomy, int smooth) 
-{
- SDL_Surface *rz_src;
- SDL_Surface *rz_dst;
- int dstwidth, dstheight;
- int is32bit;
- int i,src_converted;
-
- /* Sanity check */
- if (src==NULL) return(NULL);
-
- /* Determine if source surface is 32bit or 8bit */
- is32bit=(src->format->BitsPerPixel==32);
- if ( (is32bit) || (src->format->BitsPerPixel==8)) {
-  /* Use source surface 'as is' */
-  rz_src=src;
-  src_converted=0;
- } else {
-  /* New source surface is 32bit with a defined RGBA ordering */
-  rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
-  SDL_BlitSurface(src,NULL,rz_src,NULL);
-  src_converted=1;
-  is32bit=1;
- }
-        
- /* Sanity check zoom factors */
- if (zoomx<VALUE_LIMIT) {
-  zoomx=VALUE_LIMIT;
- }  
- if (zoomy<VALUE_LIMIT) {
-  zoomy=VALUE_LIMIT;
- }  
-
- /* Calculate target size and set rect */
- dstwidth=(int)((double)rz_src->w*zoomx);
- dstheight=(int)((double)rz_src->h*zoomy);
- if (dstwidth<1) { 
-  dstwidth=1;
- }
- if (dstheight<1) {
-  dstheight=1;
- }
-
- /* Alloc space to completely contain the zoomed surface */
- rz_dst=NULL;
- if (is32bit) {
-  /* Target surface is 32bit with source RGBA/ABGR ordering */
-  rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask);
- } else {
-  /* Target surface is 8bit */
-  rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 8, 0, 0, 0, 0);
- }
-
- /* Lock source surface */
- SDL_LockSurface(rz_src);
- /* Check which kind of surface we have */
- if (is32bit) {
-  /* Call the 32bit transformation routine to do the zooming (using alpha) */
-  zoomSurfaceRGBA(rz_src,rz_dst,smooth);
-  /* Turn on source-alpha support */
-  SDL_SetAlpha(rz_dst, SDL_SRCALPHA , 255);
- } else {
-  /* Copy palette and colorkey info */
-  for (i=0; i<rz_src->format->palette->ncolors; i++) {
-   rz_dst->format->palette->colors[i]=rz_src->format->palette->colors[i];
-  }
-  rz_dst->format->palette->ncolors=rz_src->format->palette->ncolors;
-  /* Call the 8bit transformation routine to do the zooming */
-  zoomSurfaceY(rz_src,rz_dst);
-  SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, rz_src->format->colorkey);
- }			
- /* Unlock source surface */
- SDL_UnlockSurface(rz_src);
-
- /* Cleanup temp surface */
- if (src_converted) {
-  SDL_FreeSurface(rz_src);
- }
-
- /* Return destination surface */
- return(rz_dst);
-}

File src/SDL_rotozoom/SDL_rotozoom.h

  • Ignore whitespace
-#ifndef _SDL_rotozoom_h
-#define _SDL_rotozoom_h
-
-/* Set up for C function definitions, even when using C++ */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <math.h>
-#ifndef M_PI
- #define M_PI	3.141592654
-#endif
-#include "SDL.h"
-
-
-/* ---- Defines */
-
-#define SMOOTHING_OFF		0
-#define SMOOTHING_ON		1
-
-/* ---- Structures */
-
-typedef struct tColorRGBA {
-	Uint8 r;
-	Uint8 g;
-	Uint8 b;
-	Uint8 a;
-} tColorRGBA;
-
-typedef struct tColorY {
-	Uint8 y;
-} tColorY;
-	
-
-/* ---- Prototypes */
-
-/* 
- 
- rotozoomSurface()
-
- Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
- 'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
- then the destination 32bit surface is anti-aliased. If the surface is not 8bit
- or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
-
-*/  
-
-SDL_Surface * rotozoomSurface (SDL_Surface *src, double angle, double zoom, int smooth);
-
-
-/* 
- 
- zoomSurface()
-
- Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
- 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
- then the destination 32bit surface is anti-aliased. If the surface is not 8bit
- or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
-
-*/  
-
-SDL_Surface * zoomSurface (SDL_Surface *src, double zoomx, double zoomy, int smooth);
-
-
-/* Ends C function definitions when using C++ */
-#ifdef __cplusplus
-};
-#endif
-
-#endif /* _SDL_rotozoom_h */

File src/rotozoom.c

View file
  • Ignore whitespace
+/*  
+
+  SDL_rotozoom.c - rotozoomer for 32bit or 8bit surfaces
+
+  LGPL (c) A. Schiffler
+
+
+  This is a trimmed down version of SDL_rotozoom, from the
+  SDL_gfx library. This source is from version 2.0.3. What's
+  left is only what's needed for the rotozoom function.
+
+*/
+
+#include "pygame.h"
+typedef struct tColorRGBA {
+	Uint8 r; Uint8 g; Uint8 b; Uint8 a;
+} tColorRGBA;
+
+#define VALUE_LIMIT	0.001
+#ifndef MAX
+#define MAX(a,b)    (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef M_PI
+#define M_PI	3.141592654
+#endif
+
+/* 
+ 
+ 32bit Zoomer with optional anti-aliasing by bilinear interpolation.
+
+ Zoomes 32bit RGBA/ABGR 'src' surface to 'dst' surface.
+ 
+*/
+int zoomSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int smooth)
+{
+    int x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy, ex, ey, t1, t2, sstep;
+    tColorRGBA *c00, *c01, *c10, *c11;
+    tColorRGBA *sp, *csp, *dp;
+    int sgap, dgap;
+
+    /*
+     * Variable setup 
+     */
+    if (smooth) {
+	/*
+	 * For interpolation: assume source dimension is one pixel 
+	 */
+	/*
+	 * smaller to avoid overflow on right and bottom edge.     
+	 */
+	sx = (int) (65536.0 * (float) (src->w - 1) / (float) dst->w);
+	sy = (int) (65536.0 * (float) (src->h - 1) / (float) dst->h);
+    } else {
+	sx = (int) (65536.0 * (float) src->w / (float) dst->w);
+	sy = (int) (65536.0 * (float) src->h / (float) dst->h);
+    }
+
+    /*
+     * Allocate memory for row increments 
+     */
+    if ((sax = (int *) malloc((dst->w + 1) * sizeof(Uint32))) == NULL) {
+	return (-1);
+    }
+    if ((say = (int *) malloc((dst->h + 1) * sizeof(Uint32))) == NULL) {
+	free(sax);
+	return (-1);
+    }
+
+    /*
+     * Precalculate row increments 
+     */
+    csx = 0;
+    csax = sax;
+    for (x = 0; x <= dst->w; x++) {
+	*csax = csx;
+	csax++;
+	csx &= 0xffff;
+	csx += sx;
+    }
+    csy = 0;
+    csay = say;
+    for (y = 0; y <= dst->h; y++) {
+	*csay = csy;
+	csay++;
+	csy &= 0xffff;
+	csy += sy;
+    }
+
+    /*
+     * Pointer setup 
+     */
+    sp = csp = (tColorRGBA *) src->pixels;
+    dp = (tColorRGBA *) dst->pixels;
+    sgap = src->pitch - src->w * 4;
+    dgap = dst->pitch - dst->w * 4;
+
+    /*
+     * Switch between interpolating and non-interpolating code 
+     */
+    if (smooth) {
+
+	/*
+	 * Interpolating Zoom 
+	 */
+
+	/*
+	 * Scan destination 
+	 */
+	csay = say;
+	for (y = 0; y < dst->h; y++) {
+	    /*
+	     * Setup color source pointers 
+	     */
+	    c00 = csp;
+	    c01 = csp;
+	    c01++;
+	    c10 = (tColorRGBA *) ((Uint8 *) csp + src->pitch);
+	    c11 = c10;
+	    c11++;
+	    csax = sax;
+	    for (x = 0; x < dst->w; x++) {
+
+		/*
+		 * Interpolate colors 
+		 */
+		ex = (*csax & 0xffff);
+		ey = (*csay & 0xffff);
+		t1 = ((((c01->r - c00->r) * ex) >> 16) + c00->r) & 0xff;
+		t2 = ((((c11->r - c10->r) * ex) >> 16) + c10->r) & 0xff;
+		dp->r = (((t2 - t1) * ey) >> 16) + t1;
+		t1 = ((((c01->g - c00->g) * ex) >> 16) + c00->g) & 0xff;
+		t2 = ((((c11->g - c10->g) * ex) >> 16) + c10->g) & 0xff;
+		dp->g = (((t2 - t1) * ey) >> 16) + t1;
+		t1 = ((((c01->b - c00->b) * ex) >> 16) + c00->b) & 0xff;
+		t2 = ((((c11->b - c10->b) * ex) >> 16) + c10->b) & 0xff;
+		dp->b = (((t2 - t1) * ey) >> 16) + t1;
+		t1 = ((((c01->a - c00->a) * ex) >> 16) + c00->a) & 0xff;
+		t2 = ((((c11->a - c10->a) * ex) >> 16) + c10->a) & 0xff;
+		dp->a = (((t2 - t1) * ey) >> 16) + t1;
+
+		/*
+		 * Advance source pointers 
+		 */
+		csax++;
+		sstep = (*csax >> 16);
+		c00 += sstep;
+		c01 += sstep;
+		c10 += sstep;
+		c11 += sstep;
+		/*
+		 * Advance destination pointer 
+		 */
+		dp++;
+	    }
+	    /*
+	     * Advance source pointer 
+	     */
+	    csay++;
+	    csp = (tColorRGBA *) ((Uint8 *) csp + (*csay >> 16) * src->pitch);
+	    /*
+	     * Advance destination pointers 
+	     */
+	    dp = (tColorRGBA *) ((Uint8 *) dp + dgap);
+	}
+
+    } else {
+
+	/*
+	 * Non-Interpolating Zoom 
+	 */
+
+	csay = say;
+	for (y = 0; y < dst->h; y++) {
+	    sp = csp;
+	    csax = sax;
+	    for (x = 0; x < dst->w; x++) {
+		/*
+		 * Draw 
+		 */
+		*dp = *sp;
+		/*
+		 * Advance source pointers 
+		 */
+		csax++;
+		sp += (*csax >> 16);
+		/*
+		 * Advance destination pointer 
+		 */
+		dp++;
+	    }
+	    /*
+	     * Advance source pointer 
+	     */
+	    csay++;
+	    csp = (tColorRGBA *) ((Uint8 *) csp + (*csay >> 16) * src->pitch);
+	    /*
+	     * Advance destination pointers 
+	     */
+	    dp = (tColorRGBA *) ((Uint8 *) dp + dgap);
+	}
+
+    }
+
+    /*
+     * Remove temp arrays 
+     */
+    free(sax);
+    free(say);
+
+    return (0);
+}
+
+
+/* 
+ 
+ 32bit Rotozoomer with optional anti-aliasing by bilinear interpolation.
+
+ Rotates and zoomes 32bit RGBA/ABGR 'src' surface to 'dst' surface.
+ 
+*/
+
+void transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int smooth)
+{
+    int x, y, t1, t2, dx, dy, xd, yd, sdx, sdy, ax, ay, ex, ey, sw, sh;
+    tColorRGBA c00, c01, c10, c11;
+    tColorRGBA *pc, *sp;
+    int gap;
+
+    /*
+     * Variable setup 
+     */
+    xd = ((src->w - dst->w) << 15);
+    yd = ((src->h - dst->h) << 15);
+    ax = (cx << 16) - (icos * cx);
+    ay = (cy << 16) - (isin * cx);
+    sw = src->w - 1;
+    sh = src->h - 1;
+    pc = dst->pixels;
+    gap = dst->pitch - dst->w * 4;
+
+    /*
+     * Switch between interpolating and non-interpolating code 
+     */
+    if (smooth) {
+	for (y = 0; y < dst->h; y++) {
+	    dy = cy - y;
+	    sdx = (ax + (isin * dy)) + xd;
+	    sdy = (ay - (icos * dy)) + yd;
+	    for (x = 0; x < dst->w; x++) {
+		dx = (sdx >> 16);
+		dy = (sdy >> 16);
+		if ((dx >= -1) && (dy >= -1) && (dx < src->w) && (dy < src->h)) {
+		    if ((dx >= 0) && (dy >= 0) && (dx < sw) && (dy < sh)) {
+			sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
+			sp += dx;
+			c00 = *sp;
+			sp += 1;
+			c01 = *sp;
+			sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch);
+			sp -= 1;
+			c10 = *sp;
+			sp += 1;
+			c11 = *sp;
+		    } else if ((dx == sw) && (dy == sh)) {
+			sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
+			sp += dx;
+			c00 = *sp;
+			c01 = *sp;
+			c10 = *sp;
+			c11 = *sp;
+		    } else if ((dx == -1) && (dy == -1)) {
+			sp = (tColorRGBA *) (src->pixels);
+			c00 = *sp;
+			c01 = *sp;
+			c10 = *sp;
+			c11 = *sp;
+		    } else if ((dx == -1) && (dy == sh)) {
+			sp = (tColorRGBA *) (src->pixels);
+			sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
+			c00 = *sp;
+			c01 = *sp;
+			c10 = *sp;
+			c11 = *sp;
+		    } else if ((dx == sw) && (dy == -1)) {
+			sp = (tColorRGBA *) (src->pixels);
+			sp += dx;
+			c00 = *sp;
+			c01 = *sp;
+			c10 = *sp;
+			c11 = *sp;
+		    } else if (dx == -1) {
+			sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
+			c00 = *sp;
+			c01 = *sp;
+			c10 = *sp;
+			sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch);
+			c11 = *sp;
+		    } else if (dy == -1) {
+			sp = (tColorRGBA *) (src->pixels);
+			sp += dx;
+			c00 = *sp;
+			c01 = *sp;
+			c10 = *sp;
+			sp += 1;
+			c11 = *sp;
+		    } else if (dx == sw) {
+			sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
+			sp += dx;
+			c00 = *sp;
+			c01 = *sp;
+			sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch);
+			c10 = *sp;
+			c11 = *sp;
+		    } else if (dy == sh) {
+			sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
+			sp += dx;
+			c00 = *sp;
+			sp += 1;
+			c01 = *sp;
+			c10 = *sp;
+			c11 = *sp;
+		    }
+		    /*
+		     * Interpolate colors 
+		     */
+		    ex = (sdx & 0xffff);
+		    ey = (sdy & 0xffff);
+		    t1 = ((((c01.r - c00.r) * ex) >> 16) + c00.r) & 0xff;
+		    t2 = ((((c11.r - c10.r) * ex) >> 16) + c10.r) & 0xff;
+		    pc->r = (((t2 - t1) * ey) >> 16) + t1;
+		    t1 = ((((c01.g - c00.g) * ex) >> 16) + c00.g) & 0xff;
+		    t2 = ((((c11.g - c10.g) * ex) >> 16) + c10.g) & 0xff;
+		    pc->g = (((t2 - t1) * ey) >> 16) + t1;
+		    t1 = ((((c01.b - c00.b) * ex) >> 16) + c00.b) & 0xff;
+		    t2 = ((((c11.b - c10.b) * ex) >> 16) + c10.b) & 0xff;
+		    pc->b = (((t2 - t1) * ey) >> 16) + t1;
+		    t1 = ((((c01.a - c00.a) * ex) >> 16) + c00.a) & 0xff;
+		    t2 = ((((c11.a - c10.a) * ex) >> 16) + c10.a) & 0xff;
+		    pc->a = (((t2 - t1) * ey) >> 16) + t1;
+		}
+		sdx += icos;
+		sdy += isin;
+		pc++;
+	    }
+	    pc = (tColorRGBA *) ((Uint8 *) pc + gap);
+	}
+    } else {
+	for (y = 0; y < dst->h; y++) {
+	    dy = cy - y;
+	    sdx = (ax + (isin * dy)) + xd;
+	    sdy = (ay - (icos * dy)) + yd;
+	    for (x = 0; x < dst->w; x++) {
+		dx = (short) (sdx >> 16);
+		dy = (short) (sdy >> 16);
+		if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) {
+		    sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
+		    sp += dx;
+		    *pc = *sp;
+		}
+		sdx += icos;
+		sdy += isin;
+		pc++;
+	    }
+	    pc = (tColorRGBA *) ((Uint8 *) pc + gap);
+	}
+    }
+}
+
+
+/* 
+ 
+ rotozoomSurface()
+
+ Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
+ 'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
+ then the destination 32bit surface is anti-aliased. If the surface is not 8bit
+ or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
+
+*/
+
+#define VALUE_LIMIT	0.001
+
+
+/* Local rotozoom-size function with trig result return */
+
+void rotozoomSurfaceSizeTrig(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight,
+			     double *canglezoom, double *sanglezoom)
+{
+    double x, y, cx, cy, sx, sy;
+    double radangle;
+    int dstwidthhalf, dstheighthalf;
+
+    /*
+     * Determine destination width and height by rotating a centered source box 
+     */
+    radangle = angle * (M_PI / 180.0);
+    *sanglezoom = sin(radangle);
+    *canglezoom = cos(radangle);
+    *sanglezoom *= zoom;
+    *canglezoom *= zoom;
+    x = width / 2;
+    y = height / 2;
+    cx = *canglezoom * x;
+    cy = *canglezoom * y;
+    sx = *sanglezoom * x;
+    sy = *sanglezoom * y;
+    dstwidthhalf = MAX((int)
+		       ceil(MAX(MAX(MAX(fabs(cx + sy), fabs(cx - sy)), fabs(-cx + sy)), fabs(-cx - sy))), 1);
+    dstheighthalf = MAX((int)
+			ceil(MAX(MAX(MAX(fabs(sx + cy), fabs(sx - cy)), fabs(-sx + cy)), fabs(-sx - cy))), 1);
+    *dstwidth = 2 * dstwidthhalf;
+    *dstheight = 2 * dstheighthalf;
+}
+
+
+/* Publically available rotozoom-size function */
+
+void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight)
+{
+    double dummy_sanglezoom, dummy_canglezoom;
+
+    rotozoomSurfaceSizeTrig(width, height, angle, zoom, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom);
+}
+
+/* 
+ 
+ zoomSurface()
+
+ Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
+ 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
+ then the destination 32bit surface is anti-aliased. If the surface is not 8bit
+ or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
+
+*/
+
+void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight)
+{
+    /*
+     * Sanity check zoom factors 
+     */
+    if (zoomx < VALUE_LIMIT) {
+	zoomx = VALUE_LIMIT;
+    }
+    if (zoomy < VALUE_LIMIT) {
+	zoomy = VALUE_LIMIT;
+    }
+
+    /*
+     * Calculate target size 
+     */
+    *dstwidth = (int) ((double) width * zoomx);
+    *dstheight = (int) ((double) height * zoomy);
+    if (*dstwidth < 1) {
+	*dstwidth = 1;
+    }
+    if (*dstheight < 1) {
+	*dstheight = 1;
+    }
+}
+
+
+/* Publically available rotozoom function */
+
+SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth)
+{
+    SDL_Surface *rz_src;
+    SDL_Surface *rz_dst;
+    double zoominv;
+    double sanglezoom, canglezoom, sanglezoominv, canglezoominv;
+    int dstwidthhalf, dstwidth, dstheighthalf, dstheight;
+    int is32bit;
+    int src_converted;
+
+    /*
+     * Sanity check 
+     */
+    if (src == NULL)
+	return (NULL);
+
+    /*
+     * Determine if source surface is 32bit or 8bit 
+     */
+    is32bit = (src->format->BitsPerPixel == 32);
+    if ((is32bit) || (src->format->BitsPerPixel == 8)) {
+	/*
+	 * Use source surface 'as is' 
+	 */
+	rz_src = src;
+	src_converted = 0;
+    } else {
+	/*
+	 * New source surface is 32bit with a defined RGBA ordering 
+	 */
+	rz_src =
+	    SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
+	SDL_BlitSurface(src, NULL, rz_src, NULL);
+	src_converted = 1;
+	is32bit = 1;
+    }
+
+    /*
+     * Sanity check zoom factor 
+     */
+    if (zoom < VALUE_LIMIT) {
+	zoom = VALUE_LIMIT;
+    }
+    zoominv = 65536.0 / (zoom * zoom);
+
+    /*
+     * Check if we have a rotozoom or just a zoom 
+     */
+    if (fabs(angle) > VALUE_LIMIT) {
+
+	/*
+	 * Angle!=0: full rotozoom 
+	 */
+	/*
+	 * ----------------------- 
+	 */
+
+	/* Determine target size */
+	rotozoomSurfaceSizeTrig(rz_src->w, rz_src->h, angle, zoom, &dstwidth, &dstheight, &canglezoom, &sanglezoom);
+
+	/*
+	 * Calculate target factors from sin/cos and zoom 
+	 */
+	sanglezoominv = sanglezoom;
+	canglezoominv = canglezoom;
+	sanglezoominv *= zoominv;
+	canglezoominv *= zoominv;
+
+	/* Calculate half size */
+	dstwidthhalf = dstwidth / 2;
+	dstheighthalf = dstheight / 2;
+
+	/*
+	 * Alloc space to completely contain the rotated surface 
+	 */
+	rz_dst = NULL;
+	/*
+	 * Target surface is 32bit with source RGBA/ABGR ordering 
+	 */
+	rz_dst =
+	SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32,
+				 rz_src->format->Rmask, rz_src->format->Gmask,
+				 rz_src->format->Bmask, rz_src->format->Amask);
+
+	/*
+	 * Lock source surface 
+	 */
+	SDL_LockSurface(rz_src);
+	/*
+	 * Check which kind of surface we have 
+	 */
+	/*
+	 * Call the 32bit transformation routine to do the rotation (using alpha) 
+	 */
+	transformSurfaceRGBA(rz_src, rz_dst, dstwidthhalf, dstheighthalf,
+			 (int) (sanglezoominv), (int) (canglezoominv), smooth);
+	/*
+	 * Turn on source-alpha support 
+	 */
+	SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255);
+	/*
+	 * Unlock source surface 
+	 */
+	SDL_UnlockSurface(rz_src);
+
+    } else {
+
+	/*
+	 * Angle=0: Just a zoom 
+	 */
+	/*
+	 * -------------------- 
+	 */
+
+	/*
+	 * Calculate target size
+	 */
+	zoomSurfaceSize(rz_src->w, rz_src->h, zoom, zoom, &dstwidth, &dstheight);
+
+	/*
+	 * Alloc space to completely contain the zoomed surface 
+	 */
+	rz_dst = NULL;
+	/*
+	 * Target surface is 32bit with source RGBA/ABGR ordering 
+	 */
+	rz_dst =
+	SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32,
+				 rz_src->format->Rmask, rz_src->format->Gmask,
+				 rz_src->format->Bmask, rz_src->format->Amask);
+
+	/*
+	 * Lock source surface 
+	 */
+	SDL_LockSurface(rz_src);
+	/*
+	 * Check which kind of surface we have 
+	 */
+	/*
+	 * Call the 32bit transformation routine to do the zooming (using alpha) 
+	 */
+	zoomSurfaceRGBA(rz_src, rz_dst, smooth);
+	/*
+	 * Turn on source-alpha support 
+	 */
+	SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255);
+	/*
+	 * Unlock source surface 
+	 */
+	SDL_UnlockSurface(rz_src);
+    }
+
+    /*
+     * Cleanup temp surface 
+     */
+    if (src_converted) {
+	SDL_FreeSurface(rz_src);
+    }
+
+    /*
+     * Return destination surface 
+     */
+    return (rz_dst);
+}
+

File src/transform.c

View file
  • Ignore whitespace
 static PyObject* surf_rotozoom(PyObject* self, PyObject* arg)
 {
 	PyObject *surfobj;
-	SDL_Surface *surf, *newsurf;
+	SDL_Surface *surf, *newsurf, *surf32;
 	float scale, angle;
 
 	/*get all the arguments*/
 		return NULL;
 	surf = PySurface_AsSurface(surfobj);
 
-	PySurface_Lock(surfobj);
-	newsurf = rotozoomSurface(surf, angle, scale, 1);
-	PySurface_Unlock(surfobj);
+	if(surf->format->BitsPerPixel == 32)
+	{
+		surf32 = surf;
+		PySurface_Lock(surfobj);
+	}
+	else
+	{
+	    surf32 = SDL_CreateRGBSurface(SDL_SWSURFACE, surf->w, surf->h, 32,
+					0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
+		SDL_BlitSurface(surf, NULL, surf32, NULL);
+	}
 
+	if(scale == 1.0 && !(((int)angle)%90))