[cairo-commit] boilerplate/cairo-boilerplate.c boilerplate/cairo-boilerplate-sdl.c boilerplate/cairo-boilerplate-sdl-private.h boilerplate/Makefile.sources build/configure.ac.features configure.ac src/cairo.h src/cairo-sdl.h src/cairo-sdl-surface.c src/Makefile.sources

Chris Wilson ickle at kemper.freedesktop.org
Thu Oct 30 10:07:02 PDT 2008


 boilerplate/Makefile.sources                |    3 
 boilerplate/cairo-boilerplate-sdl-private.h |   56 +++
 boilerplate/cairo-boilerplate-sdl.c         |   69 ++++
 boilerplate/cairo-boilerplate.c             |   13 
 build/configure.ac.features                 |    1 
 configure.ac                                |    8 
 src/Makefile.sources                        |    3 
 src/cairo-sdl-surface.c                     |  418 ++++++++++++++++++++++++++++
 src/cairo-sdl.h                             |   54 +++
 src/cairo.h                                 |    4 
 10 files changed, 628 insertions(+), 1 deletion(-)

New commits:
commit cf072c7203dfce989ee60e56352f548329d3d616
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Oct 30 14:35:49 2008 +0000

    [sdl] Add new backend.
    
    Add a new backend to allow easy interoperability with the Simple
    DirectMedia Layer.

diff --git a/boilerplate/Makefile.sources b/boilerplate/Makefile.sources
index 92de9d2..44eeb39 100644
--- a/boilerplate/Makefile.sources
+++ b/boilerplate/Makefile.sources
@@ -36,6 +36,9 @@ cairo_boilerplate_ps_sources = cairo-boilerplate-ps.c
 cairo_boilerplate_quartz_private = cairo-boilerplate-quartz-private.h
 cairo_boilerplate_quartz_sources = cairo-boilerplate-quartz.c
 
+cairo_boilerplate_sdl_private = cairo-boilerplate-sdl-private.h
+cairo_boilerplate_sdl_sources = cairo-boilerplate-sdl.c
+
 cairo_boilerplate_svg_private = cairo-boilerplate-svg-private.h
 cairo_boilerplate_svg_sources = cairo-boilerplate-svg.c
 
diff --git a/boilerplate/cairo-boilerplate-sdl-private.h b/boilerplate/cairo-boilerplate-sdl-private.h
new file mode 100644
index 0000000..9b5bdf7
--- /dev/null
+++ b/boilerplate/cairo-boilerplate-sdl-private.h
@@ -0,0 +1,56 @@
+/* Cairo - a vector graphics library with display and print output
+ *
+ * Copyright © 2008 Chris Wilson
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it either under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation
+ * (the "LGPL") or, at your option, under the terms of the Mozilla
+ * Public License Version 1.1 (the "MPL"). If you do not alter this
+ * notice, a recipient may use your version of this file under either
+ * the MPL or the LGPL.
+ *
+ * You should have received a copy of the LGPL along with this library
+ * in the file COPYING-LGPL-2.1; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the MPL along with this library
+ * in the file COPYING-MPL-1.1
+ *
+ * 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/
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
+ * OF ANY KIND, either express or implied. See the LGPL or the MPL for
+ * the specific language governing rights and limitations.
+ *
+ * The Original Code is the cairo graphics library.
+ *
+ * The Initial Developer of the Original Code is Chris Wilson.
+ */
+
+#ifndef CAIRO_BOILERPLATE_SDL_PRIVATE_H
+#define CAIRO_BOILERPLATE_SDL_PRIVATE_H
+
+#include <cairo.h>
+
+CAIRO_BEGIN_DECLS
+
+extern cairo_surface_t *
+_cairo_boilerplate_sdl_create_surface (const char			 *name,
+				       cairo_content_t		  content,
+				       int				  width,
+				       int				  height,
+				       int				  max_width,
+				       int				  max_height,
+				       cairo_boilerplate_mode_t	  mode,
+				       int                           id,
+				       void			**closure);
+
+extern void
+_cairo_boilerplate_sdl_cleanup (void* closure);
+
+CAIRO_END_DECLS
+
+#endif /* CAIRO_BOILERPLATE_SDL_PRIVATE_H */
diff --git a/boilerplate/cairo-boilerplate-sdl.c b/boilerplate/cairo-boilerplate-sdl.c
new file mode 100644
index 0000000..407c2ee
--- /dev/null
+++ b/boilerplate/cairo-boilerplate-sdl.c
@@ -0,0 +1,69 @@
+/* Cairo - a vector graphics library with display and print output
+ *
+ * Copyright © 2008 Chris Wilson
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it either under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation
+ * (the "LGPL") or, at your option, under the terms of the Mozilla
+ * Public License Version 1.1 (the "MPL"). If you do not alter this
+ * notice, a recipient may use your version of this file under either
+ * the MPL or the LGPL.
+ *
+ * You should have received a copy of the LGPL along with this library
+ * in the file COPYING-LGPL-2.1; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the MPL along with this library
+ * in the file COPYING-MPL-1.1
+ *
+ * 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/
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
+ * OF ANY KIND, either express or implied. See the LGPL or the MPL for
+ * the specific language governing rights and limitations.
+ *
+ * The Original Code is the cairo graphics library.
+ *
+ * The Initial Developer of the Original Code is Chris Wilson.
+ */
+
+#include "cairo-boilerplate.h"
+#include "cairo-boilerplate-sdl-private.h"
+
+#include <cairo-sdl.h>
+
+void
+_cairo_boilerplate_sdl_cleanup (void *closure)
+{
+    SDL_Quit ();
+}
+
+cairo_surface_t *
+_cairo_boilerplate_sdl_create_surface (const char		 *name,
+				       cairo_content_t		  content,
+				       int			  width,
+				       int			  height,
+				       int			  max_width,
+				       int			  max_height,
+				       cairo_boilerplate_mode_t	  mode,
+				       int			  id,
+				       void			**closure)
+{
+    SDL_Surface *screen;
+    cairo_surface_t *surface;
+
+    if (SDL_Init (SDL_INIT_VIDEO) < 0)
+	return NULL;
+
+    screen = SDL_SetVideoMode (width, height, 24, SDL_SWSURFACE);
+    if (screen == NULL)
+	return NULL;
+
+    surface = cairo_sdl_surface_create (screen);
+    SDL_FreeSurface (screen);
+
+    return surface;
+}
diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c
index 13b14eb..ee238ee 100644
--- a/boilerplate/cairo-boilerplate.c
+++ b/boilerplate/cairo-boilerplate.c
@@ -47,6 +47,9 @@
 #if CAIRO_HAS_QUARTZ_SURFACE
 #include "cairo-boilerplate-quartz-private.h"
 #endif
+#if CAIRO_HAS_SDL_SURFACE
+#include "cairo-boilerplate-sdl-private.h"
+#endif
 #if CAIRO_HAS_SVG_SURFACE
 #include "cairo-boilerplate-svg-private.h"
 #endif
@@ -586,6 +589,16 @@ static cairo_boilerplate_target_t targets[] =
       cairo_surface_write_to_png,
       _cairo_boilerplate_directfb_cleanup},
 #endif
+
+#if CAIRO_HAS_SDL_SURFACE
+    { "sdl", NULL, CAIRO_SURFACE_TYPE_SDL, CAIRO_CONTENT_COLOR, 0,
+      _cairo_boilerplate_sdl_create_surface, NULL,
+      NULL,
+      _cairo_boilerplate_get_image_surface,
+      cairo_surface_write_to_png,
+      _cairo_boilerplate_sdl_cleanup
+    },
+#endif
 };
 
 cairo_boilerplate_target_t **
diff --git a/build/configure.ac.features b/build/configure.ac.features
index d1be92a..9fa7086 100644
--- a/build/configure.ac.features
+++ b/build/configure.ac.features
@@ -373,6 +373,7 @@ AC_DEFUN([CAIRO_REPORT],
 	echo "  glitz:         $use_glitz"
 	echo "  BeOS:          $use_beos"
 	echo "  DirectFB:      $use_directfb"
+	echo "  SDL:           $use_sdl"
 	echo ""
 	echo "The following font backends:"
 	echo "  User:          yes (always builtin)"
diff --git a/configure.ac b/configure.ac
index cbde1b8..e14e14c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -156,6 +156,14 @@ CAIRO_ENABLE_SURFACE_BACKEND(beos, BeOS/Zeta, no, [
 
 dnl ===========================================================================
 
+CAIRO_ENABLE_SURFACE_BACKEND(sdl, SDL, no, [
+  sdl_REQUIRES="sdl >= 1.2"
+  PKG_CHECK_MODULES(sdl, $sdl_REQUIRES, , [AC_MSG_RESULT(no)
+  use_sdl="no (requires $sdl_REQUIRES http://www.libsdl.org)"])
+])
+
+dnl ===========================================================================
+
 CAIRO_ENABLE_FUNCTIONS(png, PNG, yes, [
   use_png=no
   AC_ARG_VAR([png_REQUIRES], [module name for libpng to search for using pkg-config])
diff --git a/src/Makefile.sources b/src/Makefile.sources
index 842aec2..7d6bfd6 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -242,3 +242,6 @@ cairo_glitz_sources = cairo-glitz-surface.c
 
 cairo_directfb_headers = cairo-directfb.h
 cairo_directfb_sources = cairo-directfb-surface.c
+
+cairo_sdl_headers = cairo-sdl.h
+cairo_sdl_sources = cairo-sdl-surface.c
diff --git a/src/cairo-sdl-surface.c b/src/cairo-sdl-surface.c
new file mode 100644
index 0000000..411573e
--- /dev/null
+++ b/src/cairo-sdl-surface.c
@@ -0,0 +1,418 @@
+/* Cairo - a vector graphics library with display and print output
+ *
+ * Copyright © 2008 Chris Wilson
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it either under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation
+ * (the "LGPL") or, at your option, under the terms of the Mozilla
+ * Public License Version 1.1 (the "MPL"). If you do not alter this
+ * notice, a recipient may use your version of this file under either
+ * the MPL or the LGPL.
+ *
+ * You should have received a copy of the LGPL along with this library
+ * in the file COPYING-LGPL-2.1; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the MPL along with this library
+ * in the file COPYING-MPL-1.1
+ *
+ * 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/
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
+ * OF ANY KIND, either express or implied. See the LGPL or the MPL for
+ * the specific language governing rights and limitations.
+ *
+ * The Original Code is the cairo graphics library.
+ *
+ * The Initial Developer of the Original Code is Chris Wilson.
+ */
+
+#include "cairoint.h"
+
+#include "cairo-sdl.h"
+
+typedef struct _cairo_sdl_surface {
+    cairo_surface_t base;
+
+    SDL_Surface *sdl;
+    cairo_image_surface_t *image;
+
+    cairo_region_t update;
+} cairo_sdl_surface_t;
+
+static const cairo_surface_backend_t _cairo_sdl_surface_backend;
+
+static cairo_surface_t *
+_cairo_sdl_surface_create_internal (SDL_Surface *sdl,
+				    cairo_surface_t *image)
+{
+    cairo_sdl_surface_t *surface;
+
+    surface = malloc (sizeof (cairo_sdl_surface_t));
+    if (surface == NULL)
+	return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
+
+    _cairo_surface_init (&surface->base,
+			 &_cairo_sdl_surface_backend,
+			 image->content);
+
+    surface->sdl = sdl;
+    sdl->refcount++;
+    surface->image = (cairo_image_surface_t *) cairo_surface_reference (image);
+
+    _cairo_region_init (&surface->update);
+
+    return &surface->base;
+}
+
+static cairo_surface_t *
+_cairo_sdl_surface_create_similar (void	       *abstract_src,
+				   cairo_content_t	content,
+				   int		width,
+				   int		height)
+{
+    return _cairo_image_surface_create_with_content (content, width, height);
+}
+
+static cairo_status_t
+_cairo_sdl_surface_finish (void *abstract_surface)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+
+    cairo_surface_destroy (&surface->image->base);
+    SDL_FreeSurface (surface->sdl);
+
+    _cairo_region_fini (&surface->update);
+
+    return CAIRO_STATUS_SUCCESS;
+}
+
+static cairo_status_t
+_cairo_sdl_surface_acquire_source_image (void                    *abstract_surface,
+					 cairo_image_surface_t  **image_out,
+					 void                   **image_extra)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+
+    SDL_LockSurface (surface->sdl);
+
+    *image_out = surface->image;
+    *image_extra = NULL;
+
+    return CAIRO_STATUS_SUCCESS;
+}
+
+static void
+_cairo_sdl_surface_release_source_image (void                   *abstract_surface,
+					 cairo_image_surface_t  *image,
+					 void                   *image_extra)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+
+    SDL_UnlockSurface (surface->sdl);
+}
+
+static cairo_status_t
+_cairo_sdl_surface_acquire_dest_image (void                    *abstract_surface,
+				       cairo_rectangle_int_t   *interest_rect,
+				       cairo_image_surface_t  **image_out,
+				       cairo_rectangle_int_t   *image_rect_out,
+				       void                   **image_extra)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+
+    SDL_LockSurface (surface->sdl);
+
+    image_rect_out->x = 0;
+    image_rect_out->y = 0;
+    image_rect_out->width  = surface->image->width;
+    image_rect_out->height = surface->image->height;
+
+    *image_out = surface->image;
+    *image_extra = NULL;
+
+    return CAIRO_STATUS_SUCCESS;
+}
+
+static void
+_cairo_sdl_surface_release_dest_image (void                    *abstract_surface,
+				       cairo_rectangle_int_t   *interest_rect,
+				       cairo_image_surface_t   *image,
+				       cairo_rectangle_int_t   *image_rect,
+				       void                    *image_extra)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+    cairo_status_t status;
+
+    SDL_UnlockSurface (surface->sdl);
+
+    status = _cairo_region_union_rect (&surface->update,
+				       &surface->update,
+				       interest_rect);
+    status = _cairo_surface_set_error (&surface->base, status);
+}
+
+static cairo_status_t
+_cairo_sdl_surface_clone_similar (void		*abstract_surface,
+				  cairo_surface_t	*src,
+				  int                  src_x,
+				  int                  src_y,
+				  int                  width,
+				  int                  height,
+				  int                 *clone_offset_x,
+				  int                 *clone_offset_y,
+				  cairo_surface_t    **clone_out)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+
+    if (src->backend == surface->base.backend) {
+	*clone_offset_x = *clone_offset_y = 0;
+	*clone_out = cairo_surface_reference (src);
+
+	return CAIRO_STATUS_SUCCESS;
+    } else if (_cairo_surface_is_image (src)) {
+	cairo_image_surface_t *image = (cairo_image_surface_t *) src;
+	cairo_format_masks_t masks;
+	cairo_surface_t *clone;
+	SDL_Surface *sdl;
+
+	_pixman_format_to_masks (image->pixman_format, &masks);
+
+	sdl = SDL_CreateRGBSurfaceFrom (image->data,
+					image->width,
+					image->height,
+					masks.bpp,
+					image->stride,
+					masks.red_mask,
+					masks.green_mask,
+					masks.blue_mask,
+					masks.alpha_mask);
+	if (sdl == NULL)
+	    return CAIRO_INT_STATUS_UNSUPPORTED;
+
+	clone = _cairo_sdl_surface_create_internal (sdl, &image->base);
+	SDL_FreeSurface (sdl);
+
+	if (clone->status)
+	    return clone->status;
+
+	*clone_offset_x = *clone_offset_y = 0;
+	*clone_out = clone;
+	return CAIRO_STATUS_SUCCESS;
+    }
+
+    return CAIRO_INT_STATUS_UNSUPPORTED;
+}
+
+static cairo_int_status_t
+_cairo_sdl_surface_composite (cairo_operator_t		op,
+			      cairo_pattern_t		*src_pattern,
+			      cairo_pattern_t		*mask_pattern,
+			      void			*abstract_dst,
+			      int			src_x,
+			      int			src_y,
+			      int			mask_x,
+			      int			mask_y,
+			      int			dst_x,
+			      int			dst_y,
+			      unsigned int		width,
+			      unsigned int		height)
+{
+    cairo_sdl_surface_t *dst = abstract_dst;
+    cairo_sdl_surface_t *src;
+    cairo_surface_attributes_t src_attr;
+    cairo_bool_t is_integer_translation;
+    int itx, ity;
+    cairo_int_status_t status;
+
+    /* under a few conditions we can perform a (hardware) blit...*/
+    if (op != CAIRO_OPERATOR_SOURCE)
+	return CAIRO_INT_STATUS_UNSUPPORTED;
+    if (mask_pattern)
+	return CAIRO_INT_STATUS_UNSUPPORTED;
+    if (dst->base.current_clip_serial != 0)
+	return CAIRO_INT_STATUS_UNSUPPORTED;
+
+    status = _cairo_pattern_acquire_surface (src_pattern, &dst->base,
+					     src_x, src_y, width, height,
+					     (cairo_surface_t **) &src,
+					     &src_attr);
+    if (status)
+	return status;
+
+    is_integer_translation =
+	_cairo_matrix_is_integer_translation (&src_attr.matrix, &itx, &ity);
+
+    status = CAIRO_INT_STATUS_UNSUPPORTED;
+    if (is_integer_translation &&
+	src_attr.extend == CAIRO_EXTEND_NONE &&
+	src_attr.filter == CAIRO_FILTER_NEAREST)
+    {
+	SDL_Rect src_rect;
+	SDL_Rect dst_rect;
+	cairo_rectangle_int_t rect;
+
+	src_rect.x = src_x + src_attr.x_offset + itx;
+	src_rect.y = src_y + src_attr.y_offset + ity;
+	src_rect.w = width;
+	src_rect.h = height;
+
+	dst_rect.x = dst_x;
+	dst_rect.y = dst_y;
+	dst_rect.w = width;
+	dst_rect.h = height;
+
+	SDL_BlitSurface (src->sdl, &src_rect, dst->sdl, &dst_rect);
+
+	rect.x = dst_x;
+	rect.y = dst_y;
+	rect.width  = width;
+	rect.height = height;
+	status = _cairo_region_union_rect (&dst->update,
+					   &dst->update,
+					   &rect);
+    }
+
+    _cairo_pattern_release_surface (src_pattern, &src->base, &src_attr);
+    return status;
+}
+
+static cairo_int_status_t
+_cairo_sdl_surface_set_clip_region (void *abstract_surface,
+				    cairo_region_t *region)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+
+    return _cairo_surface_set_clip_region (&surface->image->base,
+					   region,
+					   surface->base.current_clip_serial);
+}
+
+static cairo_int_status_t
+_cairo_sdl_surface_get_extents (void			  *abstract_surface,
+				cairo_rectangle_int_t   *rectangle)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+
+    rectangle->x = 0;
+    rectangle->y = 0;
+    rectangle->width  = surface->image->width;
+    rectangle->height = surface->image->height;
+
+    return CAIRO_STATUS_SUCCESS;
+}
+
+static void
+_cairo_sdl_surface_get_font_options (void                  *abstract_surface,
+				     cairo_font_options_t  *options)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+
+    cairo_surface_get_font_options (&surface->image->base, options);
+}
+
+static cairo_status_t
+_cairo_sdl_surface_flush (void                  *abstract_surface)
+{
+    cairo_sdl_surface_t *surface = abstract_surface;
+    cairo_box_int_t *boxes;
+    int n_boxes, i;
+    cairo_status_t status;
+
+    status = _cairo_region_get_boxes (&surface->update, &n_boxes, &boxes);
+    if (status)
+	return status;
+    if (n_boxes == 0)
+	return CAIRO_STATUS_SUCCESS;
+
+    for (i = 0; i < n_boxes; i++) {
+	SDL_UpdateRect (surface->sdl,
+			boxes[i].p1.x,
+			boxes[i].p1.y,
+			boxes[i].p2.x - boxes[i].p1.x,
+			boxes[i].p2.y - boxes[i].p1.y);
+    }
+
+    _cairo_region_boxes_fini (&surface->update, boxes);
+
+    _cairo_region_fini (&surface->update);
+    _cairo_region_init (&surface->update);
+
+    return CAIRO_STATUS_SUCCESS;
+}
+
+static const cairo_surface_backend_t _cairo_sdl_surface_backend = {
+    CAIRO_SURFACE_TYPE_SDL,
+    _cairo_sdl_surface_create_similar,
+    _cairo_sdl_surface_finish,
+    _cairo_sdl_surface_acquire_source_image,
+    _cairo_sdl_surface_release_source_image,
+    _cairo_sdl_surface_acquire_dest_image,
+    _cairo_sdl_surface_release_dest_image,
+    _cairo_sdl_surface_clone_similar,
+    _cairo_sdl_surface_composite,
+    NULL, /* fill rectangles */
+    NULL, /* composite traps */
+    NULL, /* copy_page */
+    NULL, /* show_page */
+    _cairo_sdl_surface_set_clip_region,
+    NULL, /* intersect_clip_path */
+    _cairo_sdl_surface_get_extents,
+    NULL, /* old_show_glyphs */
+    _cairo_sdl_surface_get_font_options,
+    _cairo_sdl_surface_flush, /* flush */
+    NULL, /* mark_dirty_rectangle */
+    NULL, /* font_fini */
+    NULL, /* glyph_fini */
+
+    NULL, /* paint */
+    NULL, /* mask */
+    NULL, /* stroke */
+    NULL, /* fill */
+    NULL, /* show_glyphs */
+    NULL, /* snapshot */
+    NULL, /* is_similar */
+
+    NULL, /* reset */
+};
+
+static cairo_surface_t *
+_cairo_image_surface_create_for_sdl (SDL_Surface *surface)
+{
+    cairo_format_masks_t masks;
+    pixman_format_code_t format;
+
+    masks.bpp = surface->format->BitsPerPixel;
+    masks.alpha_mask = surface->format->Amask;
+    masks.red_mask = surface->format->Rmask;
+    masks.green_mask = surface->format->Gmask;
+    masks.blue_mask = surface->format->Bmask;
+
+    if (! _pixman_format_from_masks (&masks, &format))
+	return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT));
+
+    return _cairo_image_surface_create_with_pixman_format (surface->pixels,
+							   format,
+							   surface->w,
+							   surface->h,
+							   surface->pitch);
+}
+
+cairo_surface_t *
+cairo_sdl_surface_create (SDL_Surface *sdl)
+{
+    cairo_surface_t *image;
+    cairo_surface_t *surface;
+
+    image = _cairo_image_surface_create_for_sdl (sdl);
+    if (image->status)
+	return image;
+
+    surface = _cairo_sdl_surface_create_internal (sdl, image);
+    cairo_surface_destroy (image);
+
+    return surface;
+}
diff --git a/src/cairo-sdl.h b/src/cairo-sdl.h
new file mode 100644
index 0000000..c5291a7
--- /dev/null
+++ b/src/cairo-sdl.h
@@ -0,0 +1,54 @@
+/* Cairo - a vector graphics library with display and print output
+ *
+ * Copyright © 2008 Chris Wilson
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it either under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation
+ * (the "LGPL") or, at your option, under the terms of the Mozilla
+ * Public License Version 1.1 (the "MPL"). If you do not alter this
+ * notice, a recipient may use your version of this file under either
+ * the MPL or the LGPL.
+ *
+ * You should have received a copy of the LGPL along with this library
+ * in the file COPYING-LGPL-2.1; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the MPL along with this library
+ * in the file COPYING-MPL-1.1
+ *
+ * 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/
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
+ * OF ANY KIND, either express or implied. See the LGPL or the MPL for
+ * the specific language governing rights and limitations.
+ *
+ * The Original Code is the cairo graphics library.
+ *
+ * The Initial Developer of the Original Code is Chris Wilson.
+ */
+
+#ifndef CAIRO_SDL_H
+#define CAIRO_SDL_H
+
+#include "cairo.h"
+
+#if CAIRO_HAS_SDL_SURFACE
+
+#include <SDL.h>
+
+CAIRO_BEGIN_DECLS
+
+cairo_public cairo_surface_t *
+cairo_sdl_surface_create (SDL_Surface *surface);
+
+CAIRO_END_DECLS
+
+#else  /* CAIRO_HAS_SDL_SURFACE */
+# error Cairo was not compiled with support for the SDL backend
+#endif /* CAIRO_HAS_SDL_SURFACE */
+
+#endif /* CAIRO_SDL_H */
+
diff --git a/src/cairo.h b/src/cairo.h
index cf4bc05..97d9455 100644
--- a/src/cairo.h
+++ b/src/cairo.h
@@ -1875,6 +1875,7 @@ cairo_surface_status (cairo_surface_t *surface);
  * @CAIRO_SURFACE_TYPE_OS2: The surface is of type os2
  * @CAIRO_SURFACE_TYPE_WIN32_PRINTING: The surface is a win32 printing surface
  * @CAIRO_SURFACE_TYPE_QUARTZ_IMAGE: The surface is of type quartz_image
+ * @CAIRO_SURFACE_TYPE_SDL: The surface is of type SDL, since 1.10
  *
  * #cairo_surface_type_t is used to describe the type of a given
  * surface. The surface types are also known as "backends" or "surface
@@ -1913,7 +1914,8 @@ typedef enum _cairo_surface_type {
     CAIRO_SURFACE_TYPE_SVG,
     CAIRO_SURFACE_TYPE_OS2,
     CAIRO_SURFACE_TYPE_WIN32_PRINTING,
-    CAIRO_SURFACE_TYPE_QUARTZ_IMAGE
+    CAIRO_SURFACE_TYPE_QUARTZ_IMAGE,
+    CAIRO_SURFACE_TYPE_SDL
 } cairo_surface_type_t;
 
 cairo_public cairo_surface_type_t


More information about the cairo-commit mailing list