/*
 * gauche-sdl.c - Gauche SDL binding
 *
 *  Copyright(C) 2003 by Michael Vess (mvess@michaelvess.com)
 *
 *  Permission to use, copy, modify, distribute this software and
 *  accompanying documentation for any purpose is hereby granted,
 *  provided that existing copyright notices are retained in all
 *  copies and that this notice is included verbatim in all
 *  distributions.
 *  This software is provided as is, without express or implied
 *  warranty.  In no circumstances the author(s) shall be liable
 *  for any damages arising out of the use of this software.
 *
 *  $Id: gauche-sdl.c,v 1.5 2003/09/10 17:21:40 mikiso Exp $
 */

#include <gauche.h>
#include <gauche/extend.h>
#include "gauche-sdl.h"

/*****************************************************************************
 * Video
 */

/* Rect */

static void sdl_rect_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-rect %d %d %d %d>",
              SCM_SDL_RECT(obj)->x,
              SCM_SDL_RECT(obj)->y,
              SCM_SDL_RECT(obj)->w,
              SCM_SDL_RECT(obj)->h);
}

static int sdl_rect_compare(ScmObj x, ScmObj y, int equalp)
{
   if (equalp) {
      if (SCM_SDL_RECT(x)->x == SCM_SDL_RECT(y)->x
          && SCM_SDL_RECT(x)->y == SCM_SDL_RECT(y)->y
          && SCM_SDL_RECT(x)->w == SCM_SDL_RECT(y)->w
          && SCM_SDL_RECT(x)->h == SCM_SDL_RECT(y)->h) {
         return 0;
      } else {
         return -1;
      }
   } else {
      Scm_Error("can't order %S and %S", x, y);
      return 0;               /* dummy */
   }
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlRectClass,
                         sdl_rect_print, sdl_rect_compare, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);

/* Color */

static void sdl_color_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-color %d %d %d>",
              SCM_SDL_COLOR(obj)->r,
              SCM_SDL_COLOR(obj)->g,
              SCM_SDL_COLOR(obj)->b);
}

static int sdl_color_compare(ScmObj x, ScmObj y, int equalp)
{
   if (equalp) {
      if (SCM_SDL_COLOR(x)->r == SCM_SDL_COLOR(y)->r
          && SCM_SDL_COLOR(x)->g == SCM_SDL_COLOR(y)->g
          && SCM_SDL_COLOR(x)->b == SCM_SDL_COLOR(y)->b) {
         return 0;
      } else {
         return -1;
      }
   } else {
      Scm_Error("can't order %S and %S", x, y);
      return 0;               /* dummy */
   }
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlColorClass,
                         sdl_color_print, sdl_color_compare, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);

/* Palette */

static void sdl_palette_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-palette>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlPaletteClass,
                         sdl_palette_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);

/* PixelFormat */

static void sdl_pixel_format_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-pixel-format>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlPixelFormatClass,
                         sdl_pixel_format_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);

/* Surface */
void sdl_surface_finalize(ScmObj obj, void *data)
{
   SDL_FreeSurface(SCM_SDL_SURFACE(obj));
}

static void sdl_surface_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-surface %d %d %d>",
              SCM_SDL_SURFACE(obj)->w,
              SCM_SDL_SURFACE(obj)->h,
              SCM_SDL_SURFACE(obj)->flags);
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlSurfaceClass,
                         sdl_surface_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);

/* VideoInfo */
static void sdl_video_info_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-video-info>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlVideoInfoClass,
                         sdl_video_info_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);

/* Overlay */
void sdl_overlay_finalize(ScmObj obj, void *data)
{
   SDL_FreeYUVOverlay(SCM_SDL_OVERLAY(obj));
}

static void sdl_overlay_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-overlay %d %d>",
              SCM_SDL_OVERLAY(obj)->w,
              SCM_SDL_OVERLAY(obj)->h);
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlOverlayClass,
                         sdl_overlay_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/*****************************************************************************
 * Mouse
 */

/* Cursor */
void sdl_cursor_finalize(ScmObj obj, void *data)
{
   SDL_FreeCursor(SCM_SDL_CURSOR(obj));
}

static void sdl_cursor_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-cursor>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlCursorClass,
                         sdl_cursor_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/*****************************************************************************
 * Event
 */

/* Event */
static void sdl_event_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-event>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlEventClass,
                         sdl_event_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/*****************************************************************************
 * Joystick
 */

/* Joystick */
static void sdl_joystick_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-joystick>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlJoystickClass,
                         sdl_joystick_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/*****************************************************************************
 * Audio
 */

/* AudioSpec */
static void sdl_audio_spec_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-audio-spec>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlAudioSpecClass,
                         sdl_audio_spec_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/* AudioCVT */
static void sdl_audio_cvt_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-audio-cvt>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlAudioCVTClass,
                         sdl_audio_cvt_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);

/* Wav */
void sdl_wav_finalize(ScmObj obj, void *data)
{
   SDL_FreeWAV(SCM_U8VECTOR_ELEMENTS(SCM_SDL_WAV(obj)));
}

static void sdl_wav_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-wav>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlWAVClass,
                         sdl_wav_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/*****************************************************************************
 * CD
 */

/* CD */
static void sdl_cd_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-cd>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlCDClass,
                         sdl_cd_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/* CDtrack */
static void sdl_cd_track_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-cd-track>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlCDtrackClass,
                         sdl_cd_track_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/*****************************************************************************
 * Time
 */

static void sdl_timer_id_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-timer-id>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlTimerIdClass,
                         sdl_timer_id_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/*****************************************************************************
 * RWops
 */

/* RWops */
void sdl_rwops_finalize(ScmObj obj, void *data)
{
   SDL_FreeRW(SCM_SDL_RWOPS(obj));
}

static void sdl_rwops_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx)
{
   Scm_Printf(out, "#<sdl-rwops>");
}

SCM_DEFINE_BUILTIN_CLASS(Scm_SdlRWopsClass,
                         sdl_rwops_print, NULL, NULL, NULL,
                         SCM_CLASS_DEFAULT_CPL);


/*****************************************************************************
 * Initialization
 */

extern void Scm_Init_sdl_lib(ScmModule *mod);
extern void Scm_Init_sdl_syms(ScmModule *mod);

void Scm_Init_gauche_sdl(void)
{
   ScmModule *mod;
   SCM_INIT_EXTENSION(gauche_sdl);
   mod = SCM_MODULE(SCM_FIND_MODULE("sdl", TRUE));
   Scm_InitBuiltinClass(&Scm_SdlRectClass, "<sdl-rect>",
                        NULL, sizeof(Scm_SdlRectClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlColorClass, "<sdl-color>",
                        NULL, sizeof(Scm_SdlColorClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlPaletteClass, "<sdl-palette>",
                        NULL, sizeof(Scm_SdlPaletteClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlPixelFormatClass, "<sdl-pixel-format>",
                        NULL, sizeof(Scm_SdlPixelFormatClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlSurfaceClass, "<sdl-surface>",
                        NULL, sizeof(Scm_SdlSurfaceClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlVideoInfoClass, "<sdl-video-info>",
                        NULL, sizeof(Scm_SdlVideoInfoClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlOverlayClass, "<sdl-overlay>",
                        NULL, sizeof(Scm_SdlOverlayClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlSurfaceClass, "<sdl-surface>",
                        NULL, sizeof(Scm_SdlSurfaceClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlCursorClass, "<sdl-cursor>",
                        NULL, sizeof(Scm_SdlCursorClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlEventClass, "<sdl-event>",
                        NULL, sizeof(Scm_SdlEventClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlJoystickClass, "<sdl-joystick>",
                        NULL, sizeof(Scm_SdlJoystickClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlAudioSpecClass, "<sdl-audio-spec>",
                        NULL, sizeof(Scm_SdlAudioSpecClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlAudioCVTClass, "<sdl-Audio-cvt>",
                        NULL, sizeof(Scm_SdlAudioCVTClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlWAVClass, "<sdl-wav>",
                        NULL, sizeof(Scm_SdlWAVClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlCDClass, "<sdl-cd>",
                        NULL, sizeof(Scm_SdlCDClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlCDtrackClass, "<sdl-cd-track>",
                        NULL, sizeof(Scm_SdlCDtrackClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlTimerIdClass, "<sdl-timer-id>",
                        NULL, sizeof(Scm_SdlTimerIdClass)/sizeof(ScmObj),
                        mod);
   Scm_InitBuiltinClass(&Scm_SdlRWopsClass, "<sdl-rwops>",
                        NULL, sizeof(Scm_SdlRWopsClass)/sizeof(ScmObj),
                        mod);
   Scm_Init_sdl_lib(mod);
   Scm_Init_sdl_syms(mod);
}


syntax highlighted by Code2HTML, v. 0.9.1