Re: Recording surfaces fail to replay onto SVG surfaces

Adrian Johnson <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
Seems to be a bug with unbounded recording surfaces and SVG. As a
workaround if you specify an extents for the recording surface it works.


On 04/10/17 08:39, Antony Lee wrote:
> Hi all,
> 
> I am having an issue with replaying a recording surface onto an SVG
> surface.  A minimal example is included at the end of the email.
> 
> Briefly, the example sets up a recording surface and two 100x100
> surfaces -- one IMAGE and one SVG.  It then draws a 10x10 rectangle on
> each of them at position (10, 10) and saves the results (the IMAGE to a
> PNG).  Both resulting files display the box at the correct position.
> 
> The example then tries to replay the recording surface onto a separate
> 100x100 SVG surface, and also save that surface.  Unfortunately, this
> results in a blank SVG.  Note that if, instead, the recording surface is
> played onto a separate 100x100 IMAGE surface (code not included for
> simplicity), this works perfectly well (the resulting PNG also displays
> the box); so the basic setup of the recording surface seems correct.
> 
> I am using cairo 1.15.8 from Arch Linux.
> 
> Any help would be very welcome.  Thanks!
> 
> Antony Lee
> 
> 
> 
> === Example program; compile and run with:
>     gcc main.c $(pkg-config --cflags --libs cairo) -o main && ./main
> 
> #include <stddef.h>
> #include <cairo/cairo.h>
> #include <cairo/cairo-svg.h>
> 
> int main() {
>   cairo_surface_t* rec_surf =
> cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, NULL);
>   cairo_t* rec_ctx = cairo_create(rec_surf);
> 
>   cairo_surface_t* img_surf =
> cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 100, 100);
>   cairo_t* img_ctx = cairo_create(img_surf);
> 
>   cairo_surface_t* svg_surf = cairo_svg_surface_create("/tmp/test.svg",
> 100, 100);
>   cairo_t* svg_ctx = cairo_create(svg_surf);
> 
>   cairo_t* ctxs[3] = {rec_ctx, img_ctx, svg_ctx};
> 
>   for (unsigned i = 0; i < 3; ++i) {
>     cairo_rectangle(ctxs[i], 10, 10, 10, 10);
>     cairo_fill(ctxs[i]);
>   }
> 
>   // Dump image to png.
>   cairo_surface_write_to_png(img_surf, "/tmp/test.png");
> 
>   // Transfer recording surface to SVG.
>   cairo_surface_t* svg1_surf =
> cairo_svg_surface_create("/tmp/test1.svg", 100, 100);
>   cairo_t* svg1_ctx = cairo_create(svg1_surf);
>   cairo_set_source_surface(svg1_ctx, rec_surf, 0, 0);
>   cairo_paint(svg1_ctx);
> 
>   // Done.
>   for (unsigned i = 0; i < 3; ++i) {
>     if (cairo_status(ctxs[i])) {
>       return 1;
>     }
>   }
>   cairo_surface_finish(svg_surf);
>   cairo_surface_finish(svg1_surf);
>   for (unsigned i = 0; i < 3; ++i) {
>     cairo_surface_destroy(cairo_get_target(ctxs[i]));
>     cairo_destroy(ctxs[i]);
>   }
>   cairo_surface_destroy(svg1_surf);
>   cairo_destroy(svg1_ctx);
> }
> 
> 

-- 
cairo mailing list
[email protected]
https://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.