Re: Duplicate surface with different format

Carlos López Camey <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <CAMSgvCKn0A0dtFpRMx_4S3JbtL7Bo1c7wZ6CTZYdDxn4eLS8zg@mail.gmail.com>
Thank you Kyzystof, I wasn't clear to me that there were different
types of cairo_surface_t's so your response really helped me. I ended
getting the data from the corresponding pixbuf after all, for the
archives, here's how I did it:
http://stackoverflow.com/questions/6951878/getting-a-coordinates-pixel-color-from-a-gtkdrawingarea/7005803#7005803

Carlos.

2011/8/6 Krzysztof Kosiński <[email protected]>:
> 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
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.