Re: Duplicate surface with different format
Krzysztof Kosiński <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <CAFLw2WQ1XTSr=KuvpHy5JHg2eers6V+zpFrMAZYCBUWYaiN05g@mail.gmail.com> |
2011/8/5 Carlos López Camey <[email protected]>: > I've a GtkDrawingArea and its surface has format CAIRO_FORMAT_INVALID > by _default_, i.e. "no such format exists or is supported" for that > surface's data. Is there a way to create a copy of my GtkDrawingArea > surface with any format I choose? Then I'd be able to query the data > knowing its format, I'm trying to get a coordinate RGBA values. The surface of GtkDrawingArea is an X11 surface, not an image surface. You cannot access its pixels directly, because it's in a different process (though I it would be possible if Cairo used XShm). To access the pixels, you need to copy the data to an image surface, e.g.: // depends on GTK version - in 2.x it's gdk_cairo_create(widget->window); cairo_t *widget_ct = ... // w and h can be had from widget's allocation cairo_surface_t *area_copy = cairo_image_surface_create(w, h, CAIRO_FORMAT_ARGB32); // get w and h cairo_t *ct = cairo_create(area_copy); cairo_set_source_surface(ct, cairo_get_target(widget_ct), 0, 0); cairo_set_operator(ct, CAIRO_OPERATOR_SOURCE); cairo_paint(ct); cairo_destroy(ct); unsigned char *pixels = cairo_image_surface_get_data(area_copy); // ...do something with pixels (Aside: I know that internally there is a backing client-side image surface for every X11 surface, which handles many operations not accelerated by the X server. I wonder why this backing surface is not exposed in Cairo API, even though it appears pixel access to X11 surfaces would be possible in almost all scenarios - either through reusing the backing surface, or by giving away a pointer directly into X server's address space through XShm) Regards, Krzysztof -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo