+ free (string);
+
+ /* If the font description didn't include an explicit font size, then set it
+ to DEFAULT_POINTS. */
+ if (!(pango_font_description_get_set_fields (desc) & PANGO_FONT_MASK_SIZE))
+ pango_font_description_set_size (desc,
+ default_points / 1000.0 * PANGO_SCALE);
+
+ return desc;
+}
+
+
+static void
+apply_options (struct xr_driver *xr, struct string_map *o)
+{
+ struct output_driver *d = &xr->driver;
+
+ int paper_width, paper_length, i;
+
+ int font_points = parse_int (opt (d, o, "font-size", "10000"), 1000, 1000000);
+
+ for (i = 0; i < XR_N_FONTS; i++)
+ {
+ struct xr_font *font = &xr->fonts[i];
+
+ if (font->desc != NULL)
+ pango_font_description_free (font->desc);
+ }
+
+ xr->fonts[XR_FONT_FIXED].desc = parse_font (d, o, "fixed-font", "monospace",
+ font_points);
+ xr->fonts[XR_FONT_PROPORTIONAL].desc = parse_font (d, o, "prop-font",
+ "serif", font_points);
+ xr->fonts[XR_FONT_EMPHASIS].desc = parse_font (d, o, "emph-font",
+ "serif italic", font_points);
+
+ xr->line_gutter = parse_dimension (opt (d, o, "gutter", "3pt"));
+ xr->line_space = XR_POINT;
+ xr->line_width = XR_POINT / 2;
+ xr->page_number = 0;
+
+ parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &xr->bg);
+ parse_color (d, o, "foreground-color", "#000000000000", &xr->fg);
+
+ parse_paper_size (opt (d, o, "paper-size", ""), &paper_width, &paper_length);
+ xr->left_margin = parse_dimension (opt (d, o, "left-margin", ".5in"));
+ xr->right_margin = parse_dimension (opt (d, o, "right-margin", ".5in"));
+ xr->top_margin = parse_dimension (opt (d, o, "top-margin", ".5in"));
+ xr->bottom_margin = parse_dimension (opt (d, o, "bottom-margin", ".5in"));
+
+ xr->width = paper_width - xr->left_margin - xr->right_margin;
+ xr->length = paper_length - xr->top_margin - xr->bottom_margin;
+}
+
+static struct xr_driver *
+xr_allocate (const char *name, int device_type, struct string_map *o)
+{
+ struct xr_driver *xr = xzalloc (sizeof *xr);
+ struct output_driver *d = &xr->driver;
+
+ output_driver_init (d, &cairo_driver_class, name, device_type);
+
+ apply_options (xr, o);
+
+ return xr;
+}
+
+static bool
+xr_set_cairo (struct xr_driver *xr, cairo_t *cairo)
+{
+ int i;
+
+ xr->cairo = cairo;
+
+ cairo_set_line_width (xr->cairo, xr_to_pt (xr->line_width));
+
+ xr->char_width = 0;
+ xr->char_height = 0;
+ for (i = 0; i < XR_N_FONTS; i++)