Example: simple loading and rendering: Librsvg Reference Manual

## Example: simple loading and rendering

The following program loads `hello.svg`, renders it scaled to fit within 640x480 pixels, and writes a `hello.png` file.

Note the following:

- `rsvg_handle_render_document()` will scale the document proportionally to fit the viewport you specify, and it will center the image within that viewport.

- Librsvg does not paint a background color by default, so in the following example all unfilled areas of the SVG will appear as fully transparent. If you wish to have a specific background, fill the viewport area yourself before rendering the SVG.

Example 1. Load and render an SVG document as a PNG

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    /* gcc -Wall -g -O2 -o load-and-render load-and-render.c `pkg-config --cflags --libs rsvg-2.0` */

    #include <stdlib.h>
    #include <librsvg/rsvg.h>

    #define WIDTH 640
    #define HEIGHT 480

    int
    main (void)
    {
      /* First, load an SVG document into an RsvgHandle */

      GError *error = NULL;
      GFile *file = g_file_new_for_path ("hello.svg");
      RsvgHandle *handle = rsvg_handle_new_from_gfile_sync (file, RSVG_HANDLE_FLAGS_NONE, NULL, &error);

      if (!handle)
        {
          g_printerr ("could not load: %s", error->message);
          exit (1);
        }

      /* Create a Cairo image surface and a rendering context for it */

      cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT);
      cairo_t *cr = cairo_create (surface);

      /* Render the handle scaled proportionally into that whole surface */

      RsvgRectangle viewport = {
        .x = 0.0,
        .y = 0.0,
        .width = WIDTH,
        .height = HEIGHT,
      };

      if (!rsvg_handle_render_document (handle, cr, &viewport, &error))
        {
          g_printerr ("could not render: %s", error->message);
          exit (1);
        }

      /* Write a PNG file */

      if (cairo_surface_write_to_png (surface, "hello.png") != CAIRO_STATUS_SUCCESS)
        {
          g_printerr ("could not write output file");
          exit (1);
        }

      /* Free our memory and we are done! */

      cairo_destroy (cr);
      cairo_surface_destroy (surface);
      g_object_unref (handle);
      g_object_unref (file);
      return 0;
    }