X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcairo.c;h=68c3eb81a0f96e54b9ef89da8dd86b5c41a3c290;hb=a456c361c0d324475da63d8420a2f0b108b61243;hp=674d91488877d642320dbc36626736a98233227e;hpb=46314efbf9cb7131ed36e3611f79ce3f55e6f570;p=pspp-builds.git diff --git a/src/output/cairo.c b/src/output/cairo.c index 674d9148..68c3eb81 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -188,13 +188,13 @@ opt (struct output_driver *d, struct string_map *options, const char *key, static struct xr_driver * xr_allocate (const char *name, int device_type, struct string_map *o) { + int paper_width, paper_length; struct output_driver *d; struct xr_driver *xr; xr = xzalloc (sizeof *xr); d = &xr->driver; output_driver_init (d, &cairo_driver_class, name, device_type); - xr->headers = true; xr->font_height = XR_POINT * 10; xr->fonts[XR_FONT_FIXED].string = parse_string (opt (d, o, "fixed-font", "monospace")); @@ -207,6 +207,19 @@ xr_allocate (const char *name, int device_type, struct string_map *o) xr->line_width = XR_POINT / 2; xr->page_number = 0; + xr->headers = parse_boolean (opt (d, o, "headers", "true")); + + 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")); + + if (xr->headers) + xr->top_margin += 3 * xr->font_height; + xr->width = paper_width - xr->left_margin - xr->right_margin; + xr->length = paper_length - xr->top_margin - xr->bottom_margin; + return xr; } @@ -261,26 +274,12 @@ xr_create (const char *file_name, enum settings_output_devices device_type, cairo_surface_t *surface; cairo_status_t status; double width_pt, length_pt; - int paper_width, paper_length; xr = xr_allocate (file_name, device_type, o); d = &xr->driver; - xr->headers = parse_boolean (opt (d, o, "headers", "true")); - - 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")); - - if (xr->headers) - xr->top_margin += 3 * xr->font_height; - xr->width = paper_width - xr->left_margin - xr->right_margin; - xr->length = paper_length - xr->top_margin - xr->bottom_margin; - - width_pt = paper_width / 1000.0; - length_pt = paper_length / 1000.0; + width_pt = (xr->width + xr->left_margin + xr->right_margin) / 1000.0; + length_pt = (xr->length + xr->top_margin + xr->bottom_margin) / 1000.0; if (file_type == XR_PDF) surface = cairo_pdf_surface_create (file_name, width_pt, length_pt); else if (file_type == XR_PS) @@ -921,8 +920,6 @@ struct xr_driver * xr_driver_create (cairo_t *cairo, struct string_map *options) { struct xr_driver *xr = xr_allocate ("cairo", 0, options); - xr->width = INT_MAX / 8; - xr->length = INT_MAX / 8; if (!xr_set_cairo (xr, cairo)) { output_driver_destroy (&xr->driver); @@ -931,6 +928,18 @@ xr_driver_create (cairo_t *cairo, struct string_map *options) return xr; } +/* Destroy XR, which should have been created with xr_driver_create(). Any + cairo_t added to XR is not destroyed, because it is owned by the client. */ +void +xr_driver_destroy (struct xr_driver *xr) +{ + if (xr != NULL) + { + xr->cairo = NULL; + output_driver_destroy (&xr->driver); + } +} + static struct xr_rendering * xr_rendering_create_text (struct xr_driver *xr, const char *text, cairo_t *cr) {