+struct surface
+{
+ SCM filename;
+ SDL_Surface *surface_address;
+};
+
+static scm_t_bits surface_tag;
+
+SCM
+make_surface (SCM file, SDL_Surface *surface_address)
+{
+ SCM smob;
+ struct surface *surface;
+
+ surface = (struct surface *) scm_gc_malloc (sizeof (struct surface), "surface");
+
+ surface->filename = SCM_BOOL_F;
+ surface->surface_address = NULL;
+
+ SCM_NEWSMOB (smob, surface_tag, surface);
+
+ 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_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 (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;
+}
+
+