aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-11-12 18:40:23 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-11-12 18:40:23 -0800
commit8beb2562056702c3a7b057fa17ab496758cccb1e (patch)
treee3fbe670417fcb7f6414362bc569d5f0b7ac0a4d
parentd58b4e8eedef1ce80fd0082024b80b911a0160cc (diff)
zoomSurface support; fixes #673
-rw-r--r--src/library_sdl.js10
-rw-r--r--system/include/SDL/SDL_rotozoom.h123
-rwxr-xr-xtests/runner.py4
-rw-r--r--tests/sdl_rotozoom.c48
-rw-r--r--tests/sdl_rotozoom.pngbin0 -> 338527 bytes
5 files changed, 185 insertions, 0 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 4cb4ca6f..0969f738 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -966,6 +966,16 @@ var LibrarySDL = {
return _SDL_UpperBlit(src, srcrect, dst, dstrect);
},
+ zoomSurface: function(src, x, y, smooth) {
+ var srcData = SDL.surfaces[src];
+ var w = srcData.width*x;
+ var h = srcData.height*y;
+ var ret = SDL.makeSurface(w, h, srcData.flags, false, 'zoomSurface');
+ var dstData = SDL.surfaces[ret];
+ dstData.ctx.drawImage(srcData.canvas, 0, 0, w, h);
+ return ret;
+ },
+
SDL_SetAlpha: function(surf, flag, alpha) {
SDL.surfaces[surf].alpha = alpha;
},
diff --git a/system/include/SDL/SDL_rotozoom.h b/system/include/SDL/SDL_rotozoom.h
new file mode 100644
index 00000000..65b914a9
--- /dev/null
+++ b/system/include/SDL/SDL_rotozoom.h
@@ -0,0 +1,123 @@
+/*
+
+SDL_rotozoom.c: rotozoomer, zoomer and shrinker for 32bit or 8bit surfaces
+
+Copyright (C) 2001-2011 Andreas Schiffler
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+Andreas Schiffler -- aschiffler at ferzkopp dot net
+
+*/
+
+#ifndef _SDL_rotozoom_h
+#define _SDL_rotozoom_h
+
+#include <math.h>
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef M_PI
+#define M_PI 3.141592654
+#endif
+
+#include "SDL.h"
+
+ /* ---- Defines */
+
+ /*!
+ \brief Disable anti-aliasing (no smoothing).
+ */
+#define SMOOTHING_OFF 0
+
+ /*!
+ \brief Enable anti-aliasing (smoothing).
+ */
+#define SMOOTHING_ON 1
+
+ /* ---- Function Prototypes */
+
+#ifdef _MSC_VER
+# if defined(DLL_EXPORT) && !defined(LIBSDL_GFX_DLL_IMPORT)
+# define SDL_ROTOZOOM_SCOPE __declspec(dllexport)
+# else
+# ifdef LIBSDL_GFX_DLL_IMPORT
+# define SDL_ROTOZOOM_SCOPE __declspec(dllimport)
+# endif
+# endif
+#endif
+#ifndef SDL_ROTOZOOM_SCOPE
+# define SDL_ROTOZOOM_SCOPE extern
+#endif
+
+ /*
+
+ Rotozoom functions
+
+ */
+
+ SDL_ROTOZOOM_SCOPE SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth);
+
+ SDL_ROTOZOOM_SCOPE SDL_Surface *rotozoomSurfaceXY
+ (SDL_Surface * src, double angle, double zoomx, double zoomy, int smooth);
+
+
+ SDL_ROTOZOOM_SCOPE void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth,
+ int *dstheight);
+
+ SDL_ROTOZOOM_SCOPE void rotozoomSurfaceSizeXY
+ (int width, int height, double angle, double zoomx, double zoomy,
+ int *dstwidth, int *dstheight);
+
+ /*
+
+ Zooming functions
+
+ */
+
+ SDL_ROTOZOOM_SCOPE SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth);
+
+ SDL_ROTOZOOM_SCOPE void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight);
+
+ /*
+
+ Shrinking functions
+
+ */
+
+ SDL_ROTOZOOM_SCOPE SDL_Surface *shrinkSurface(SDL_Surface * src, int factorx, int factory);
+
+ /*
+
+ Specialized rotation functions
+
+ */
+
+ SDL_ROTOZOOM_SCOPE SDL_Surface* rotateSurface90Degrees(SDL_Surface* src, int numClockwiseTurns);
+
+ /* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SDL_rotozoom_h */
diff --git a/tests/runner.py b/tests/runner.py
index 7523036b..3844845f 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -9261,6 +9261,10 @@ elif 'browser' in str(sys.argv):
def test_sdl_maprgba(self):
self.btest('sdl_maprgba.c', reference='sdl_maprgba.png', reference_slack=3)
+ def test_sdl_rotozoom(self):
+ shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'example.png'))
+ self.btest('sdl_rotozoom.c', reference='sdl_rotozoom.png', args=['--preload-file', 'example.png'])
+
def zzztest_sdl_canvas_palette_2(self): # XXX disabled until we have proper automation
open(os.path.join(self.get_dir(), 'sdl_canvas_palette_2.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_canvas_palette_2.c')).read()))
open(os.path.join(self.get_dir(), 'pre.js'), 'w').write('Module[\'preRun\'] = function() { SDL.defaults.copyOnLock = false }')
diff --git a/tests/sdl_rotozoom.c b/tests/sdl_rotozoom.c
new file mode 100644
index 00000000..cb6295cc
--- /dev/null
+++ b/tests/sdl_rotozoom.c
@@ -0,0 +1,48 @@
+#include "SDL/SDL.h"
+#include "SDL/SDL_image.h"
+#include "SDL/SDL_rotozoom.h"
+
+#ifdef EMSCRIPTEN
+#include "emscripten.h"
+#endif
+
+SDL_Surface *screen;
+SDL_Surface *sprite[4];
+
+void mainloop() {
+ int i;
+ SDL_Rect rect = { 0, 0, 100, 100 };
+ for (i = 0; i < 4; i++) {
+ rect.x = i & 1 ? 200 : 0;
+ rect.y = i & 2 ? 200 : 0;
+ SDL_BlitSurface(sprite[i], 0, screen, &rect);
+ SDL_UpdateRect(screen, 0, 0, 0, 0);
+ }
+}
+
+int main(int argc, char **argv) {
+ SDL_Init(SDL_INIT_VIDEO);
+
+ screen = SDL_SetVideoMode(400, 400, 32, SDL_SWSURFACE);
+
+ sprite[0] = IMG_Load("example.png");
+ sprite[1] = SDL_CreateRGBSurface(SDL_SWSURFACE, 100, 100, 32, 0xFF000000, 0xFF0000, 0xFF00, 0xFF);
+ SDL_FillRect(sprite[1], 0, 0xA0A0A0A0);
+ sprite[2] = zoomSurface(sprite[0], 0.5, 0.5, SMOOTHING_ON);
+ sprite[3] = zoomSurface(sprite[1], 0.5, 0.5, SMOOTHING_ON);
+
+ mainloop();
+
+#ifndef EMSCRIPTEN
+ SDL_Event evt;
+ while (1) {
+ if (SDL_PollEvent(&evt) != 0 && evt.type == SDL_QUIT) break;
+ //mainloop();
+ SDL_Delay(33);
+ }
+#endif
+
+ SDL_Quit();
+
+ return 1;
+}
diff --git a/tests/sdl_rotozoom.png b/tests/sdl_rotozoom.png
new file mode 100644
index 00000000..83ec0589
--- /dev/null
+++ b/tests/sdl_rotozoom.png
Binary files differ