[PATCH 2/5] surface: Make map_to_image return cairo_image_surface_t*

Andrea Canciani <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
This makes it easier to check that the funciton is returning the
correct type of surfaces.
---
 src/cairo-directfb-surface.c            |   13 +++++++------
 src/cairo-gl-surface.c                  |   16 ++++++++--------
 src/cairo-image-surface-inline.h        |    6 ++++++
 src/cairo-image-surface-private.h       |    2 +-
 src/cairo-image-surface.c               |    4 ++--
 src/cairo-os2-surface.c                 |    2 +-
 src/cairo-quartz-image-surface.c        |    2 +-
 src/cairo-quartz-surface.c              |    2 +-
 src/cairo-surface-backend-private.h     |    2 +-
 src/cairo-surface-observer.c            |    2 +-
 src/cairo-surface-subsurface.c          |    2 +-
 src/cairo-surface.c                     |    2 +-
 src/cairo-xcb-surface.c                 |   18 +++++++++++-------
 src/cairo-xlib-surface.c                |    4 ++--
 src/cairo-xlib-xcb-surface.c            |    2 +-
 src/skia/cairo-skia-surface.cpp         |    3 ++-
 src/win32/cairo-win32-display-surface.c |    8 ++++----
 17 files changed, 51 insertions(+), 39 deletions(-)

diff --git a/src/cairo-directfb-surface.c b/src/cairo-directfb-surface.c
index fd187bd..494ec07 100644
--- a/src/cairo-directfb-surface.c
+++ b/src/cairo-directfb-surface.c
@@ -40,7 +40,7 @@
 #include "cairo-compositor-private.h"
 #include "cairo-default-context-private.h"
 #include "cairo-error-private.h"
-#include "cairo-image-surface-private.h"
+#include "cairo-image-surface-inline.h"
 #include "cairo-pattern-private.h"
 #include "cairo-surface-backend-private.h"
 #include "cairo-surface-fallback-private.h"
@@ -171,7 +171,7 @@ _cairo_dfb_surface_finish (void *abstract_surface)
     return _cairo_image_surface_finish (abstract_surface);
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_dfb_surface_map_to_image (void *abstract_surface,
 				 const cairo_rectangle_int_t *extents)
 {
@@ -184,7 +184,7 @@ _cairo_dfb_surface_map_to_image (void *abstract_surface,
 	int pitch;
 
 	if (buffer->Lock (buffer, DSLF_READ | DSLF_WRITE, &data, &pitch))
-	    return _cairo_surface_create_in_error(_cairo_error (CAIRO_STATUS_NO_MEMORY));
+	    return _cairo_image_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
 
 	image = pixman_image_create_bits (surface->image.pixman_format,
 					  surface->image.width,
@@ -192,19 +192,20 @@ _cairo_dfb_surface_map_to_image (void *abstract_surface,
 					  data, pitch);
 	if (image == NULL) {
 	    buffer->Unlock (buffer);
-	    return _cairo_surface_create_in_error(_cairo_error (CAIRO_STATUS_NO_MEMORY));
+	    return _cairo_image_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
 	}
 	_cairo_image_surface_init (&surface->image, image, surface->image.pixman_format);
     }
 
-    return _cairo_image_surface_map_to_image (&surface->image, extents);
+    return _cairo_surface_map_to_image (&surface->image.base, extents);
 }
 
 static cairo_int_status_t
 _cairo_dfb_surface_unmap_image (void *abstract_surface,
 				cairo_image_surface_t *image)
 {
-    return CAIRO_INT_STATUS_SUCCESS;
+    cairo_dfb_surface_t *surface = abstract_surface;
+    return _cairo_surface_unmap_image (&surface->image.base, image);
 }
 
 static cairo_status_t
diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c
index f480260..56a9025 100644
--- a/src/cairo-gl-surface.c
+++ b/src/cairo-gl-surface.c
@@ -46,7 +46,7 @@
 #include "cairo-compositor-private.h"
 #include "cairo-default-context-private.h"
 #include "cairo-error-private.h"
-#include "cairo-image-surface-private.h"
+#include "cairo-image-surface-inline.h"
 #include "cairo-surface-backend-private.h"
 
 static const cairo_surface_backend_t _cairo_gl_surface_backend;
@@ -973,7 +973,7 @@ _cairo_gl_surface_finish (void *abstract_surface)
     return _cairo_gl_context_release (ctx, status);
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_gl_surface_map_to_image (void      *abstract_surface,
 				const cairo_rectangle_int_t   *extents)
 {
@@ -1038,15 +1038,15 @@ _cairo_gl_surface_map_to_image (void      *abstract_surface,
 							extents->height,
 							-1);
     if (unlikely (image->base.status))
-	return &image->base;
+	return image;
 
     if (surface->base.serial == 0)
-	return &image->base;
+	return image;
 
     status = _cairo_gl_context_acquire (surface->base.device, &ctx);
     if (unlikely (status)) {
 	cairo_surface_destroy (&image->base);
-	return _cairo_surface_create_in_error (status);
+	return _cairo_image_surface_create_in_error (status);
     }
 
     cairo_surface_set_device_offset (&image->base, -extents->x, -extents->y);
@@ -1080,7 +1080,7 @@ _cairo_gl_surface_map_to_image (void      *abstract_surface,
     status = _cairo_gl_context_release (ctx, status);
     if (unlikely (status)) {
 	cairo_surface_destroy (&image->base);
-	return _cairo_surface_create_in_error (status);
+	return _cairo_image_surface_create_in_error (status);
     }
 
     /* We must invert the image manualy if we lack GL_MESA_pack_invert */
@@ -1093,7 +1093,7 @@ _cairo_gl_surface_map_to_image (void      *abstract_surface,
 	    row = malloc (image->stride);
 	    if (unlikely (row == NULL)) {
 		cairo_surface_destroy (&image->base);
-		return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
+		return _cairo_image_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
 	    }
 	}
 
@@ -1109,7 +1109,7 @@ _cairo_gl_surface_map_to_image (void      *abstract_surface,
 	    free(row);
     }
 
-    return &image->base;
+    return image;
 }
 
 static cairo_surface_t *
diff --git a/src/cairo-image-surface-inline.h b/src/cairo-image-surface-inline.h
index 95cbb99..d529bde 100644
--- a/src/cairo-image-surface-inline.h
+++ b/src/cairo-image-surface-inline.h
@@ -42,6 +42,12 @@
 
 CAIRO_BEGIN_DECLS
 
+static inline cairo_image_surface_t *
+_cairo_image_surface_create_in_error (cairo_status_t status)
+{
+    return (cairo_image_surface_t *) _cairo_surface_create_in_error (status);
+}
+
 static inline void
 _cairo_image_surface_set_parent (cairo_image_surface_t *image,
 				 cairo_surface_t *parent)
diff --git a/src/cairo-image-surface-private.h b/src/cairo-image-surface-private.h
index 6f5f05b..8f7364c 100644
--- a/src/cairo-image-surface-private.h
+++ b/src/cairo-image-surface-private.h
@@ -151,7 +151,7 @@ _cairo_image_surface_init (cairo_image_surface_t *surface,
 			   pixman_image_t	*pixman_image,
 			   pixman_format_code_t	 pixman_format);
 
-cairo_private cairo_surface_t *
+cairo_private cairo_image_surface_t *
 _cairo_image_surface_map_to_image (void *abstract_other,
 				   const cairo_rectangle_int_t *extents);
 
diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c
index 00369b6..33f6160 100644
--- a/src/cairo-image-surface.c
+++ b/src/cairo-image-surface.c
@@ -794,7 +794,7 @@ _cairo_image_surface_snapshot (void *abstract_surface)
     return &clone->base;
 }
 
-cairo_surface_t *
+cairo_image_surface_t *
 _cairo_image_surface_map_to_image (void *abstract_other,
 				   const cairo_rectangle_int_t *extents)
 {
@@ -814,7 +814,7 @@ _cairo_image_surface_map_to_image (void *abstract_other,
 							other->stride);
 
     cairo_surface_set_device_offset (surface, -extents->x, -extents->y);
-    return surface;
+    return (cairo_image_surface_t *) surface;
 }
 
 cairo_int_status_t
diff --git a/src/cairo-os2-surface.c b/src/cairo-os2-surface.c
index 19646fb..edef42e 100644
--- a/src/cairo-os2-surface.c
+++ b/src/cairo-os2-surface.c
@@ -585,7 +585,7 @@ _cairo_os2_surface_release_source_image (void                  *abstract_surface
     DosReleaseMutexSem (surface->hmtx_use_private_fields);
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_os2_surface_map_to_image (void *abstract_surface,
 				 const cairo_rectangle_int_t *extents)
 {
diff --git a/src/cairo-quartz-image-surface.c b/src/cairo-quartz-image-surface.c
index 763ce96..da10a98 100644
--- a/src/cairo-quartz-image-surface.c
+++ b/src/cairo-quartz-image-surface.c
@@ -107,7 +107,7 @@ _cairo_quartz_image_surface_acquire_source_image (void *asurface,
     return CAIRO_STATUS_SUCCESS;
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_quartz_image_surface_map_to_image (void *asurface,
 					  const cairo_rectangle_int_t *extents)
 {
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index d216261..3010988 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -1553,7 +1553,7 @@ _cairo_quartz_surface_release_source_image (void *abstract_surface,
 }
 
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_quartz_surface_map_to_image (void *abstract_surface,
 				    const cairo_rectangle_int_t *extents)
 {
diff --git a/src/cairo-surface-backend-private.h b/src/cairo-surface-backend-private.h
index fbaa912..c275ce6 100644
--- a/src/cairo-surface-backend-private.h
+++ b/src/cairo-surface-backend-private.h
@@ -63,7 +63,7 @@ struct _cairo_surface_backend {
 				 int			 width,
 				 int			 height);
 
-    cairo_surface_t *
+    cairo_image_surface_t *
     (*map_to_image)		(void			*surface,
 				 const cairo_rectangle_int_t  *extents);
     cairo_int_status_t
diff --git a/src/cairo-surface-observer.c b/src/cairo-surface-observer.c
index 9247bc4..1922398 100644
--- a/src/cairo-surface-observer.c
+++ b/src/cairo-surface-observer.c
@@ -474,7 +474,7 @@ _cairo_surface_observer_create_similar_image (void *other,
     return NULL;
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_surface_observer_map_to_image (void *abstract_surface,
 				      const cairo_rectangle_int_t *extents)
 {
diff --git a/src/cairo-surface-subsurface.c b/src/cairo-surface-subsurface.c
index dfea05c..020b961 100644
--- a/src/cairo-surface-subsurface.c
+++ b/src/cairo-surface-subsurface.c
@@ -84,7 +84,7 @@ _cairo_surface_subsurface_create_similar_image (void *other,
 							   width, height);
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_surface_subsurface_map_to_image (void *abstract_surface,
 					const cairo_rectangle_int_t *extents)
 {
diff --git a/src/cairo-surface.c b/src/cairo-surface.c
index 99cbfbe..e28e115 100644
--- a/src/cairo-surface.c
+++ b/src/cairo-surface.c
@@ -638,7 +638,7 @@ _cairo_surface_map_to_image (cairo_surface_t  *surface,
 
     /* TODO: require map_to_image != NULL */
     if (surface->backend->map_to_image)
-	image = (cairo_image_surface_t *) surface->backend->map_to_image (surface, extents);
+	image = surface->backend->map_to_image (surface, extents);
 
     if (image == NULL)
 	image = _cairo_image_surface_clone_subimage (surface, extents);
diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c
index c6a1d29..489e17e 100644
--- a/src/cairo-xcb-surface.c
+++ b/src/cairo-xcb-surface.c
@@ -45,8 +45,8 @@
 
 #include "cairo-composite-rectangles-private.h"
 #include "cairo-default-context-private.h"
+#include "cairo-image-surface-inline.h"
 #include "cairo-list-inline.h"
-#include "cairo-image-surface-private.h"
 #include "cairo-surface-backend-private.h"
 
 #if CAIRO_HAS_XLIB_XCB_FUNCTIONS
@@ -755,12 +755,13 @@ _cairo_xcb_surface_flush (void *abstract_surface)
     return status;
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_xcb_surface_map_to_image (void *abstract_surface,
 				 const cairo_rectangle_int_t *extents)
 {
     cairo_xcb_surface_t *surface = abstract_surface;
     cairo_surface_t *image;
+    cairo_status_t status;
 
     if (surface->fallback)
 	return surface->fallback->base.backend->map_to_image (&surface->fallback->base, extents);
@@ -768,8 +769,11 @@ _cairo_xcb_surface_map_to_image (void *abstract_surface,
     image = _get_image (surface, TRUE,
 			extents->x, extents->y,
 			extents->width, extents->height);
-    if (unlikely (image->status))
-	return image;
+    status = cairo_surface_status (image);
+    if (unlikely (status)) {
+	cairo_surface_destroy(image);
+	return _cairo_image_surface_create_in_error (status);
+    }
 
     /* Do we have a deferred clear and this image surface does NOT cover the
      * whole xcb surface? Have to apply the clear in that case, else
@@ -778,16 +782,16 @@ _cairo_xcb_surface_map_to_image (void *abstract_surface,
     if (surface->deferred_clear &&
 	! (extents->width == surface->width &&
 	   extents->height == surface->height)) {
-	cairo_status_t status = _cairo_xcb_surface_clear (surface);
+	status = _cairo_xcb_surface_clear (surface);
 	if (unlikely (status)) {
 	    cairo_surface_destroy(image);
-	    return _cairo_surface_create_in_error (status);
+	    return _cairo_image_surface_create_in_error (status);
 	}
     }
     surface->deferred_clear = FALSE;
 
     cairo_surface_set_device_offset (image, -extents->x, -extents->y);
-    return image;
+    return (cairo_image_surface_t *) image;
 }
 
 static cairo_int_status_t
diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c
index ae2153b..9dadca6 100644
--- a/src/cairo-xlib-surface.c
+++ b/src/cairo-xlib-surface.c
@@ -1278,7 +1278,7 @@ _cairo_xlib_surface_release_source_image (void                   *abstract_surfa
     cairo_surface_destroy (&image->base);
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_xlib_surface_map_to_image (void                    *abstract_surface,
 				  const cairo_rectangle_int_t   *extents)
 {
@@ -1287,7 +1287,7 @@ _cairo_xlib_surface_map_to_image (void                    *abstract_surface,
     image = _get_image_surface (abstract_surface, extents);
     cairo_surface_set_device_offset (image, -extents->x, -extents->y);
 
-    return image;
+    return (cairo_image_surface_t *) image;
 }
 
 static cairo_int_status_t
diff --git a/src/cairo-xlib-xcb-surface.c b/src/cairo-xlib-xcb-surface.c
index caa9bd3..1df5de8 100644
--- a/src/cairo-xlib-xcb-surface.c
+++ b/src/cairo-xlib-xcb-surface.c
@@ -116,7 +116,7 @@ _cairo_xlib_xcb_surface_create_similar_image (void			*abstract_other,
     return cairo_surface_create_similar_image (&surface->xcb->base, format, width, height);
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_xlib_xcb_surface_map_to_image (void *abstract_surface,
 				      const cairo_rectangle_int_t *extents)
 {
diff --git a/src/skia/cairo-skia-surface.cpp b/src/skia/cairo-skia-surface.cpp
index 71bebb0..cc76cfb 100644
--- a/src/skia/cairo-skia-surface.cpp
+++ b/src/skia/cairo-skia-surface.cpp
@@ -90,7 +90,7 @@ _cairo_skia_surface_finish (void *asurface)
     return CAIRO_STATUS_SUCCESS;
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_skia_surface_map_to_image (void *asurface,
 				  const cairo_rectangle_int_t *extents)
 {
@@ -98,6 +98,7 @@ _cairo_skia_surface_map_to_image (void *asurface,
 
     surface->bitmap->lockPixels ();
 
+    /* XXX: Broken! */
     if (extents->width < surface->image.width ||
 	extents->height < surface->image.height)
     {
diff --git a/src/win32/cairo-win32-display-surface.c b/src/win32/cairo-win32-display-surface.c
index 7efa7d8..0d4c5f9 100644
--- a/src/win32/cairo-win32-display-surface.c
+++ b/src/win32/cairo-win32-display-surface.c
@@ -427,7 +427,7 @@ _cairo_win32_display_surface_finish (void *abstract_surface)
     return CAIRO_STATUS_SUCCESS;
 }
 
-static cairo_surface_t *
+static cairo_image_surface_t *
 _cairo_win32_display_surface_map_to_image (void                    *abstract_surface,
 					   const cairo_rectangle_int_t   *extents)
 {
@@ -464,13 +464,13 @@ _cairo_win32_display_surface_map_to_image (void                    *abstract_sur
     surface = to_win32_display_surface (surface->fallback);
 done:
     GdiFlush();
-    return _cairo_image_surface_map_to_image (surface->image, extents);
+    return _cairo_surface_map_to_image (&surface->image->base, extents);
 
 err:
     cairo_surface_destroy (surface->fallback);
     surface->fallback = NULL;
 
-    return _cairo_surface_create_in_error (status);
+    return _cairo_image_surface_create_in_error (status);
 }
 
 static cairo_int_status_t
@@ -499,7 +499,7 @@ _cairo_win32_display_surface_unmap_image (void                    *abstract_surf
 	    _cairo_damage_add_rectangle (surface->fallback->damage, &r);
     }
 
-    return CAIRO_INT_STATUS_SUCCESS;
+    return _cairo_surface_unmap_image (&surface->image->base, image);
 }
 
 static cairo_status_t
-- 
1.7.7.5 (Apple Git-26)

--
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.