diff options
author | Andrea Canciani <ranma42@gmail.com> | 2010-08-19 16:38:22 +0200 |
---|---|---|
committer | Andrea Canciani <ranma42@gmail.com> | 2010-09-09 11:31:55 +0200 |
commit | c733ccddaea07ef948c21d62ff01df058caa0733 (patch) | |
tree | af36c293eb9c34e12d07be0c003abd6363a4a516 | |
parent | c445931ccb20390b706ce967e58d070f4c1d247a (diff) |
avoid mesa extensionswip/gl
-rw-r--r-- | src/cairo-gl-surface.c | 26 |
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)) { |