[cairo] Recording surfaces fail to replay onto SVG surfaces
Antonio Ospite
ao2 at ao2.it
Thu Oct 12 10:31:53 UTC 2017
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.
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.
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
--
Antonio Ospite
https://ao2.it
https://twitter.com/ao2it
A: Because it messes up the order in which people normally read text.
See http://en.wikipedia.org/wiki/Posting_style
Q: Why is top-posting such a bad thing?
More information about the cairo
mailing list