summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Canciani <ranma42@gmail.com>2010-08-19 16:38:22 +0200
committerAndrea Canciani <ranma42@gmail.com>2010-09-09 11:31:55 +0200
commitc733ccddaea07ef948c21d62ff01df058caa0733 (patch)
treeaf36c293eb9c34e12d07be0c003abd6363a4a516
parentc445931ccb20390b706ce967e58d070f4c1d247a (diff)
avoid mesa extensionswip/gl
-rw-r--r--src/cairo-gl-surface.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c
index e53506cc6..b2b8001a7 100644
--- a/src/cairo-gl-surface.c
+++ b/src/cairo-gl-surface.c
@@ -724,9 +724,21 @@ _cairo_gl_surface_get_image (cairo_gl_surface_t *surface,
return CAIRO_INT_STATUS_UNSUPPORTED;
}
- image = (cairo_image_surface_t*)
- cairo_image_surface_create (cairo_format,
- interest->width, interest->height);
+ int stride = cpp * interest->width;
+ void *data = malloc (stride * interest->height);
+ if (_cairo_gl_surface_is_texture (surface))
+ image = (cairo_image_surface_t*)
+ cairo_image_surface_create_for_data (data,
+ cairo_format,
+ interest->width, interest->height,
+ stride);
+ else
+ image = (cairo_image_surface_t*)
+ cairo_image_surface_create_for_data (data + (interest->height - 1) * stride,
+ cairo_format,
+ interest->width, interest->height,
+ -stride);
+
if (unlikely (image->base.status))
return image->base.status;
@@ -742,14 +754,10 @@ _cairo_gl_surface_get_image (cairo_gl_surface_t *surface,
_cairo_gl_context_set_destination (ctx, surface);
glPixelStorei (GL_PACK_ALIGNMENT, 1);
- glPixelStorei (GL_PACK_ROW_LENGTH, image->stride / cpp);
- if (! _cairo_gl_surface_is_texture (surface) && GLEW_MESA_pack_invert)
- glPixelStorei (GL_PACK_INVERT_MESA, 1);
+ glPixelStorei (GL_PACK_ROW_LENGTH, stride / cpp);
glReadPixels (interest->x, interest->y,
interest->width, interest->height,
- format, type, image->data);
- if (! _cairo_gl_surface_is_texture (surface) && GLEW_MESA_pack_invert)
- glPixelStorei (GL_PACK_INVERT_MESA, 0);
+ format, type, data);
status = _cairo_gl_context_release (ctx, status);
if (unlikely (status)) {