Recording surfaces fail to replay onto SVG surfaces

Antony Lee <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <CAGRr6BHCHYsAanWZRb_jwgUKNpvpVJmNGYeujFX=40s2F4qXyw@mail.gmail.com>
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.