]> git.jsancho.org Git - gacela.git/blobdiff - src/gacela_SDL.c
Gacela as Guile module.
[gacela.git] / src / gacela_SDL.c
index f40c0ac3980058f04f463201545400736ae0b746..f9500021399d3827cab8575037a95d1585fde64f 100644 (file)
 
 #include <libguile.h>
 #include <SDL/SDL.h>
+#include <SDL/SDL_events.h>
 #include <SDL/SDL_image.h>
 #include <SDL/SDL_mixer.h>
+#include <SDL/SDL_rotozoom.h>
 #include "gacela_SDL.h"
 
 struct surface
 {
-  SCM name;
+  SCM filename;
+  SDL_Surface *surface_address;
 };
 
 static scm_t_bits surface_tag;
 
 SCM
-gacela_make_surface (SCM name)
+make_surface (SCM file, SDL_Surface *surface_address)
 {
   SCM smob;
   struct surface *surface;
 
   surface = (struct surface *) scm_gc_malloc (sizeof (struct surface), "surface");
 
-  surface->name = SCM_BOOL_F;
+  surface->filename = SCM_BOOL_F;
+  surface->surface_address = NULL;
 
   SCM_NEWSMOB (smob, surface_tag, surface);
 
-  surface->name = name;
+  surface->filename = file;
+  surface->surface_address = surface_address;
 
   return smob;
 }
 
+SDL_Surface *
+get_surface_address (SCM surface_smob)
+{
+  struct surface *surface;
+
+  scm_assert_smob_type (surface_tag, surface_smob);
+  surface = (struct surface *) SCM_SMOB_DATA (surface_smob);
+  return surface->surface_address;
+}
+
+SCM
+get_surface_filename (SCM surface_smob)
+{
+  struct surface *surface;
+
+  scm_assert_smob_type (surface_tag, surface_smob);
+  surface = (struct surface *) SCM_SMOB_DATA (surface_smob);
+  return surface->filename;
+}
+
+SCM
+get_surface_width (SCM surface_smob)
+{
+  SDL_Surface *surface = get_surface_address (surface_smob);
+
+  return scm_from_int (surface->w);
+}
+
+SCM
+get_surface_height (SCM surface_smob)
+{
+  SDL_Surface *surface = get_surface_address (surface_smob);
+
+  return scm_from_int (surface->h);
+}
+
+SCM
+get_surface_pixels (SCM surface_smob)
+{
+  SDL_Surface *surface = get_surface_address (surface_smob);
+
+  return scm_from_int ((int)surface->pixels);
+}
+
+SCM
+get_surface_format_BytesPerPixel (SCM surface_smob)
+{
+  SDL_Surface *surface = get_surface_address (surface_smob);
+
+  return scm_from_int (surface->format->BytesPerPixel);
+}
+
+SCM
+mark_surface (SCM surface_smob)
+{
+  struct surface *surface = (struct surface *) SCM_SMOB_DATA (surface_smob);
+
+  scm_gc_mark (surface->filename);
+     
+  return SCM_BOOL_F;
+}
+
+size_t
+free_surface (SCM surface_smob)
+{
+  struct surface *surface = (struct surface *) SCM_SMOB_DATA (surface_smob);
+
+  SDL_FreeSurface (surface->surface_address);
+  scm_gc_free (surface, sizeof (struct surface), "surface");
+
+  return 0;
+}
+
+static int
+print_surface (SCM surface_smob, SCM port, scm_print_state *pstate)
+{
+  struct surface *surface = (struct surface *) SCM_SMOB_DATA (surface_smob);
+
+  scm_puts ("#<surface \"", port);
+  scm_display (surface->filename, port);
+  scm_puts ("\">", port);
+
+  /* non-zero means success */
+  return 1;
+}
+
+
 SCM
 gacela_SDL_Init (SCM flags)
 {
@@ -61,28 +153,34 @@ gacela_SDL_Quit (void)
 SCM
 gacela_SDL_SetVideoMode (SCM width, SCM height, SCM bpp, SCM flags)
 {
-  return scm_from_int ((int)SDL_SetVideoMode (scm_to_int (width), scm_to_int (height), \
-                                             scm_to_int (bpp), scm_to_int (flags)));
+  SDL_Surface *screen = SDL_SetVideoMode (scm_to_int (width), scm_to_int (height), \
+                                         scm_to_int (bpp), scm_to_int (flags));
+
+  if (screen) {
+    return make_surface (scm_from_locale_string ("screen"), screen);
+  }
+  else {
+    return SCM_BOOL_F;
+  }
 }
 
 SCM
-gacela_SDL_WM_SetCaption (SCM title, SCM icon)
+gacela_SDL_FreeSurface (SCM surface)
 {
-  SDL_WM_SetCaption (scm_to_locale_string(title), scm_to_locale_string(icon));
-  return SCM_UNSPECIFIED;
+  return scm_from_int (free_surface (surface));
 }
 
 SCM
-gacela_SDL_Flip (SCM screen)
+gacela_SDL_WM_SetCaption (SCM title, SCM icon)
 {
-  return scm_from_int (SDL_Flip ((SDL_Surface *)scm_to_int (screen)));
+  SDL_WM_SetCaption (scm_to_locale_string(title), scm_to_locale_string(icon));
+  return SCM_UNSPECIFIED;
 }
 
 SCM
-gacela_SDL_FreeSurface (SCM surface)
+gacela_SDL_Flip (SCM screen)
 {
-  SDL_FreeSurface ((SDL_Surface *)scm_to_int (surface));
-  return SCM_UNSPECIFIED;
+  return scm_from_int (SDL_Flip (get_surface_address (screen)));
 }
 
 SCM
@@ -101,7 +199,27 @@ gacela_SDL_GetTicks (void)
 SCM
 gacela_SDL_DisplayFormat (SCM surface)
 {
-  return scm_from_int ((int)SDL_DisplayFormat ((SDL_Surface *)scm_to_int (surface)));
+  SDL_Surface *new = SDL_DisplayFormat (get_surface_address (surface));
+
+  if (new) {
+    return make_surface (get_surface_filename (surface), new);
+  }
+  else {
+    return SCM_BOOL_F;
+  }
+}
+
+SCM
+gacela_SDL_DisplayFormatAlpha (SCM surface)
+{
+  SDL_Surface *new = SDL_DisplayFormatAlpha (get_surface_address (surface));
+
+  if (new) {
+    return make_surface (get_surface_filename (surface), new);
+  }
+  else {
+    return SCM_BOOL_F;
+  }
 }
 
 SCM
@@ -113,19 +231,39 @@ gacela_SDL_MapRGB (SCM format, SCM r, SCM g, SCM b)
 SCM
 gacela_SDL_SetColorKey (SCM surface, SCM flag, SCM key)
 {
-  return scm_from_int (SDL_SetColorKey ((SDL_Surface *)scm_to_int (surface), scm_to_int (flag), scm_to_int (key)));
+  return scm_from_int (SDL_SetColorKey (get_surface_address (surface), scm_to_int (flag), scm_to_int (key)));
+}
+
+SCM
+gacela_SDL_SetAlpha (SCM surface, SCM flag, SCM alpha)
+{
+  return scm_from_int (SDL_SetAlpha (get_surface_address (surface), scm_to_int (flag), scm_to_int (alpha)));
 }
 
 SCM
 gacela_SDL_LoadBMP (SCM file)
 {
-  return scm_from_int ((int)SDL_LoadBMP (scm_to_locale_string (file)));
+  SDL_Surface *image = SDL_LoadBMP (scm_to_locale_string (file));
+
+  if (image) {
+    return make_surface (file, image);
+  }
+  else {
+    return SCM_BOOL_F;
+  }
 }
 
 SCM
 gacela_IMG_Load (SCM filename)
 {
-  return scm_from_int ((int)IMG_Load (scm_to_locale_string (filename)));
+  SDL_Surface *image = IMG_Load (scm_to_locale_string (filename));
+
+  if (image) {
+    return make_surface (filename, image);
+  }
+  else {
+    return SCM_BOOL_F;
+  }
 }
 
 SCM
@@ -183,6 +321,19 @@ gacela_SDL_EnableKeyRepeat (SCM delay, SCM interval)
   return scm_from_int (SDL_EnableKeyRepeat (scm_to_int (delay), scm_to_int (interval)));
 }
 
+SCM
+gacela_zoomSurface (SCM src, SCM zoomx, SCM zoomy, SCM smooth)
+{
+  SDL_Surface *image = zoomSurface (get_surface_address (src), scm_to_double (zoomx), scm_to_double (zoomy), scm_to_int (smooth));
+
+  if (image) {
+    return make_surface (get_surface_filename (src), image);
+  }
+  else {
+    return SCM_BOOL_F;
+  }
+}
+
 SCM
 gacela_Mix_OpenAudio (SCM frequency, SCM format, SCM channels, SCM chunksize)
 {
@@ -267,14 +418,18 @@ gacela_Mix_CloseAudio (void)
 }
 
 
-void*
-SDL_register_functions (void* data)
+void
+init_guile_SDL ()
 {
   surface_tag = scm_make_smob_type ("surface", sizeof (struct surface));
-  //  scm_set_smob_mark (surface_tag, mark_surface);
-  //  scm_set_smob_free (surface_tag, free_surface);
-  //  scm_set_smob_print (surface_tag, print_surface);
-  //  scm_set_smob_equalp (surface_tag, equalp_surface);
+  scm_set_smob_mark (surface_tag, mark_surface);
+  scm_set_smob_free (surface_tag, free_surface);
+  scm_set_smob_print (surface_tag, print_surface);
+  scm_c_define_gsubr ("surface-file", 1, 0, 0, get_surface_filename);
+  scm_c_define_gsubr ("surface-w", 1, 0, 0, get_surface_width);
+  scm_c_define_gsubr ("surface-h", 1, 0, 0, get_surface_height);
+  scm_c_define_gsubr ("surface-pixels", 1, 0, 0, get_surface_pixels);
+  scm_c_define_gsubr ("surface-format-BytesPerPixel", 1, 0, 0, get_surface_format_BytesPerPixel);
 
   scm_c_define ("SDL_INIT_TIMER", scm_from_int (SDL_INIT_TIMER));
   scm_c_define ("SDL_INIT_AUDIO", scm_from_int (SDL_INIT_AUDIO));
@@ -312,17 +467,46 @@ SDL_register_functions (void* data)
 
   scm_c_define ("MIX_DEFAULT_FORMAT", scm_from_int (MIX_DEFAULT_FORMAT));
 
+  scm_c_define ("SDL_NOEVENT", scm_from_int (SDL_NOEVENT));
+  scm_c_define ("SDL_ACTIVEEVENT", scm_from_int (SDL_ACTIVEEVENT));
+  scm_c_define ("SDL_KEYDOWN", scm_from_int (SDL_KEYDOWN));
+  scm_c_define ("SDL_KEYUP", scm_from_int (SDL_KEYUP));
+  scm_c_define ("SDL_MOUSEMOTION", scm_from_int (SDL_MOUSEMOTION));
+  scm_c_define ("SDL_MOUSEBUTTONDOWN", scm_from_int (SDL_MOUSEBUTTONDOWN));
+  scm_c_define ("SDL_MOUSEBUTTONUP", scm_from_int (SDL_MOUSEBUTTONUP));
+  scm_c_define ("SDL_JOYAXISMOTION", scm_from_int (SDL_JOYAXISMOTION));
+  scm_c_define ("SDL_JOYBALLMOTION", scm_from_int (SDL_JOYBALLMOTION));
+  scm_c_define ("SDL_JOYHATMOTION", scm_from_int (SDL_JOYHATMOTION));
+  scm_c_define ("SDL_JOYBUTTONDOWN", scm_from_int (SDL_JOYBUTTONDOWN));
+  scm_c_define ("SDL_JOYBUTTONUP", scm_from_int (SDL_JOYBUTTONUP));
+  scm_c_define ("SDL_QUIT", scm_from_int (SDL_QUIT));
+  scm_c_define ("SDL_SYSWMEVENT", scm_from_int (SDL_SYSWMEVENT));
+  scm_c_define ("SDL_EVENT_RESERVEDA", scm_from_int (SDL_EVENT_RESERVEDA));
+  scm_c_define ("SDL_EVENT_RESERVEDB", scm_from_int (SDL_EVENT_RESERVEDB));
+  scm_c_define ("SDL_VIDEORESIZE", scm_from_int (SDL_VIDEORESIZE));
+  scm_c_define ("SDL_VIDEOEXPOSE", scm_from_int (SDL_VIDEOEXPOSE));
+  scm_c_define ("SDL_EVENT_RESERVED2", scm_from_int (SDL_EVENT_RESERVED2));
+  scm_c_define ("SDL_EVENT_RESERVED3", scm_from_int (SDL_EVENT_RESERVED3));
+  scm_c_define ("SDL_EVENT_RESERVED4", scm_from_int (SDL_EVENT_RESERVED4));
+  scm_c_define ("SDL_EVENT_RESERVED5", scm_from_int (SDL_EVENT_RESERVED5));
+  scm_c_define ("SDL_EVENT_RESERVED6", scm_from_int (SDL_EVENT_RESERVED6));
+  scm_c_define ("SDL_EVENT_RESERVED7", scm_from_int (SDL_EVENT_RESERVED7));
+  scm_c_define ("SDL_USEREVENT", scm_from_int (SDL_USEREVENT));
+  scm_c_define ("SDL_NUMEVENTS", scm_from_int (SDL_NUMEVENTS));
+
   scm_c_define_gsubr ("SDL_Init", 1, 0, 0, gacela_SDL_Init);
   scm_c_define_gsubr ("SDL_Quit", 0, 0, 0, gacela_SDL_Quit);
   scm_c_define_gsubr ("SDL_SetVideoMode", 4, 0, 0, gacela_SDL_SetVideoMode);
+  scm_c_define_gsubr ("SDL_FreeSurface", 1, 0, 0, gacela_SDL_FreeSurface);
   scm_c_define_gsubr ("SDL_WM_SetCaption", 2, 0, 0, gacela_SDL_WM_SetCaption);
   scm_c_define_gsubr ("SDL_Flip", 1, 0, 0, gacela_SDL_Flip);
-  scm_c_define_gsubr ("SDL_FreeSurface", 1, 0, 0, gacela_SDL_FreeSurface);
   scm_c_define_gsubr ("SDL_Delay", 1, 0, 0, gacela_SDL_Delay);
   scm_c_define_gsubr ("SDL_GetTicks", 0, 0, 0, gacela_SDL_GetTicks);
   scm_c_define_gsubr ("SDL_DisplayFormat", 1, 0, 0, gacela_SDL_DisplayFormat);
+  scm_c_define_gsubr ("SDL_DisplayFormatAlpha", 1, 0, 0, gacela_SDL_DisplayFormatAlpha);
   scm_c_define_gsubr ("SDL_MapRGB", 4, 0, 0, gacela_SDL_MapRGB);
   scm_c_define_gsubr ("SDL_SetColorKey", 3, 0, 0, gacela_SDL_SetColorKey);
+  scm_c_define_gsubr ("SDL_SetAlpha", 3, 0, 0, gacela_SDL_SetAlpha);
   scm_c_define_gsubr ("SDL_LoadBMP", 1, 0, 0, gacela_SDL_LoadBMP);
   scm_c_define_gsubr ("IMG_Load", 1, 0, 0, gacela_IMG_Load);
   scm_c_define_gsubr ("SDL_GetVideoInfo", 0, 0, 0, gacela_SDL_GetVideoInfo);
@@ -330,6 +514,7 @@ SDL_register_functions (void* data)
   scm_c_define_gsubr ("SDL_PollEvent", 0, 0, 0, gacela_SDL_PollEvent);
   scm_c_define_gsubr ("SDL_GL_SwapBuffers", 0, 0, 0, gacela_SDL_GL_SwapBuffers);
   scm_c_define_gsubr ("SDL_EnableKeyRepeat", 2, 0, 0, gacela_SDL_EnableKeyRepeat);
+  scm_c_define_gsubr ("zoomSurface", 4, 0, 0, gacela_zoomSurface);
   scm_c_define_gsubr ("Mix_OpenAudio", 4, 0, 0, gacela_Mix_OpenAudio);
   scm_c_define_gsubr ("Mix_LoadMUS", 1, 0, 0, gacela_Mix_LoadMUS);
   scm_c_define_gsubr ("Mix_LoadWAV", 1, 0, 0, gacela_Mix_LoadWAV);
@@ -343,7 +528,4 @@ SDL_register_functions (void* data)
   scm_c_define_gsubr ("Mix_FreeMusic", 1, 0, 0, gacela_Mix_FreeMusic);
   scm_c_define_gsubr ("Mix_FreeChunk", 1, 0, 0, gacela_Mix_FreeChunk);
   scm_c_define_gsubr ("Mix_CloseAudio", 0, 0, 0, gacela_Mix_CloseAudio);
-  scm_c_define_gsubr ("make-surface", 1, 0, 0, gacela_make_surface);
-
-  return NULL;
 }