Re: Recording surfaces fail to replay onto SVG surfaces

Adrian Johnson <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
On 12/10/17 21:01, Antonio Ospite wrote:
> On Thu, 5 Oct 2017 20:54:53 +1030
> ajohnson at redneon.com (Adrian Johnson) wrote:
> 
>> I've pushed a fix for painting unbounded recordings to the SVG surface.
>>
> 
> Hi
> 
> I too experienced a similar problem recently.
> 
> The changes in 5a9dba9929d9 seem to fix the original test case of
> replaying to an SVG surface, but only for the first time: I noticed that
> replaying a second time still fails, producing an empty SVG.

I'll have a look this weekend.

> BTW, these seems to be regressions as 1.14.10 works fine in both cases.
> 
> I also noticed that the generated files look a little different when
> using the current master: groups and links are used for the replayed
> surfaces, while with 1.14.10 the replayed elements are drawn ungrouped,
> I don't know if the regression is related to this change.
> 
> I can bisect if necessary.

I did that with the previous fix. It doesn't help as the problem is not
due to a change in the svg backend. It is just the svg code hasn't been
kept up to date with changes to the core code.

> 
> See the following test program, it works as (I think) it should with
> 1.14.10, but not with the current master (d5b634da6159):
> 
> ----------------------------------------------------------------------
> #include <stdio.h>
> #include <cairo/cairo.h>
> #include <cairo/cairo-svg.h>
> 
> #ifndef M_PI
> #define M_PI 3.14159265358979323846
> #endif
> 
> static void save_as_svg(cairo_surface_t *surface, double width, double height, const char *filename)
> {
> 	cairo_surface_t *output;
> 	cairo_t *ctx;
> 
> 	output = cairo_svg_surface_create(filename, width, height);
> 
> 	ctx = cairo_create(output);
> 
> 	cairo_set_source_surface(ctx, surface, 0.0, 0.0);
> 	cairo_paint(ctx);
> 
> 	cairo_destroy(ctx);
> 	cairo_surface_destroy(output);
> }
> 
> static void save_as_png(cairo_surface_t *surface, double width, double height, const char *filename)
> {
> 	cairo_surface_t *output;
> 	cairo_t *ctx;
> 
> 	output = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
> 	ctx = cairo_create(output);
> 
> 	cairo_set_source_surface(ctx, surface, 0.0, 0.0);
> 	cairo_paint(ctx);
> 	cairo_surface_write_to_png(output, filename);
> 
> 	cairo_destroy(ctx);
> 	cairo_surface_destroy(output);
> }
> 
> int main(void)
> {
> 	cairo_surface_t *surface;
> 	cairo_t *ctx;
> 	double x;
> 	double y;
> 	double width;
> 	double height;
> 
> 	surface = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, NULL);
> 
> 	ctx = cairo_create(surface);
> 
> 	cairo_rectangle(ctx, 0.0, 0.0, 300, 300);
> 	cairo_set_source_rgb(ctx, 0.3, 0.6, 0.8);
> 	cairo_fill(ctx);
> 
> 	cairo_arc(ctx, 150, 150, 100, 0, 2 * M_PI);
> 	cairo_set_source_rgb(ctx, 1, 1, 1);
> 	cairo_stroke(ctx);
> 
> 	cairo_destroy(ctx);
> 
> 	cairo_recording_surface_ink_extents(surface, &x, &y, &width, &height);
> 	printf("recording surface ink extents: %f, %f, %f, %f\n", x, y, width, height);
> 
> 	/* SVG output */
> 	save_as_svg(surface, width, height, "svg_first_time.svg");
> 	save_as_svg(surface, width, height, "svg_second_time.svg");
> 
> 	/* PNG output for comparison */
> 	save_as_png(surface, width, height, "png_reference_output.png");
> 
> 	cairo_surface_destroy(surface);
> 	return 0;
> }
> ----------------------------------------------------------------------
> 
> Ciao,
>    Antonio
> 

-- 
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.