diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 9237d52f4..c0586b9e0 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -110,8 +110,6 @@ typedef struct _cairo_pdf_surface { double width; double height; - double x_dpi; - double y_dpi; cairo_array_t objects; cairo_array_t pages; @@ -138,7 +136,6 @@ typedef struct _cairo_pdf_surface { cairo_paginated_mode_t paginated_mode; } cairo_pdf_surface_t; -#define PDF_SURFACE_DPI_DEFAULT 300 #define PDF_SURFACE_MAX_GLYPHS_PER_FONT 256 static cairo_pdf_resource_t @@ -269,8 +266,6 @@ _cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *output, surface->width = width; surface->height = height; - surface->x_dpi = PDF_SURFACE_DPI_DEFAULT; - surface->y_dpi = PDF_SURFACE_DPI_DEFAULT; _cairo_array_init (&surface->objects, sizeof (cairo_pdf_object_t)); _cairo_array_init (&surface->pages, sizeof (cairo_pdf_resource_t)); @@ -412,36 +407,6 @@ _extract_pdf_surface (cairo_surface_t *surface, return CAIRO_STATUS_SUCCESS; } -/** - * cairo_pdf_surface_set_dpi: - * @surface: a PDF cairo_surface_t - * @x_dpi: horizontal dpi - * @y_dpi: vertical dpi - * - * Set the horizontal and vertical resolution for image fallbacks. - * When the pdf backend needs to fall back to image overlays, it will - * use this resolution. These DPI values are not used for any other - * purpose, (in particular, they do not have any bearing on the size - * passed to cairo_pdf_surface_create() nor on the CTM). - **/ -void -cairo_pdf_surface_set_dpi (cairo_surface_t *surface, - double x_dpi, - double y_dpi) -{ - cairo_pdf_surface_t *pdf_surface; - cairo_status_t status; - - status = _extract_pdf_surface (surface, &pdf_surface); - if (status) { - _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_TYPE_MISMATCH); - return; - } - - pdf_surface->x_dpi = x_dpi; - pdf_surface->y_dpi = y_dpi; -} - /** * cairo_pdf_surface_set_size: * @surface: a PDF cairo_surface_t diff --git a/src/cairo-pdf.h b/src/cairo-pdf.h index bbbe9bd8b..53699d418 100644 --- a/src/cairo-pdf.h +++ b/src/cairo-pdf.h @@ -54,11 +54,6 @@ cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, double width_in_points, double height_in_points); -cairo_public void -cairo_pdf_surface_set_dpi (cairo_surface_t *surface, - double x_dpi, - double y_dpi); - void cairo_pdf_surface_set_size (cairo_surface_t *surface, double width_in_points, diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index 2ed12f15f..4e019e1b8 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -67,8 +67,6 @@ typedef struct cairo_ps_surface { double height; double max_width; double max_height; - double x_dpi; - double y_dpi; int num_pages; @@ -84,7 +82,6 @@ typedef struct cairo_ps_surface { } cairo_ps_surface_t; -#define PS_SURFACE_DPI_DEFAULT 300.0 #define PS_SURFACE_MAX_GLYPHS_PER_FONT 256 static cairo_status_t @@ -376,8 +373,6 @@ _cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream, surface->height = height; surface->max_width = width; surface->max_height = height; - surface->x_dpi = PS_SURFACE_DPI_DEFAULT; - surface->y_dpi = PS_SURFACE_DPI_DEFAULT; surface->paginated_mode = CAIRO_PAGINATED_MODE_ANALYZE; surface->num_pages = 0; @@ -519,36 +514,6 @@ _extract_ps_surface (cairo_surface_t *surface, return CAIRO_STATUS_SUCCESS; } -/** - * cairo_ps_surface_set_dpi: - * @surface: a PostScript cairo_surface_t - * @x_dpi: horizontal dpi - * @y_dpi: vertical dpi - * - * Set the horizontal and vertical resolution for image fallbacks. - * When the ps backend needs to fall back to image overlays, it will - * use this resolution. These DPI values are not used for any other - * purpose, (in particular, they do not have any bearing on the size - * passed to cairo_ps_surface_create() nor on the CTM). - **/ -void -cairo_ps_surface_set_dpi (cairo_surface_t *surface, - double x_dpi, - double y_dpi) -{ - cairo_ps_surface_t *ps_surface; - cairo_status_t status; - - status = _extract_ps_surface (surface, &ps_surface); - if (status) { - _cairo_surface_set_error (surface, status); - return; - } - - ps_surface->x_dpi = x_dpi; - ps_surface->y_dpi = y_dpi; -} - /** * cairo_ps_surface_set_size: * @surface: a PostScript cairo_surface_t diff --git a/src/cairo-ps.h b/src/cairo-ps.h index 2e1d98835..a61d12d00 100644 --- a/src/cairo-ps.h +++ b/src/cairo-ps.h @@ -73,11 +73,6 @@ cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface); cairo_public void cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface); -cairo_public void -cairo_ps_surface_set_dpi (cairo_surface_t *surface, - double x_dpi, - double y_dpi); - CAIRO_END_DECLS #else /* CAIRO_HAS_PS_SURFACE */ diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 39b018cf5..1f0a6b630 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -55,6 +55,8 @@ const cairo_surface_t _cairo_surface_nil = { }, /* user_data */ 0.0, /* device_x_offset */ 0.0, /* device_y_offset */ + 0.0, /* x_fallback_resolution */ + 0.0, /* y_fallback_resolution */ 0, /* next_clip_serial */ 0 /* current_clip_serial */ }; @@ -73,6 +75,8 @@ const cairo_surface_t _cairo_surface_nil_file_not_found = { }, /* user_data */ 0.0, /* device_x_offset */ 0.0, /* device_y_offset */ + 0.0, /* x_fallback_resolution */ + 0.0, /* y_fallback_resolution */ 0, /* next_clip_serial */ 0 /* current_clip_serial */ }; @@ -91,6 +95,8 @@ const cairo_surface_t _cairo_surface_nil_read_error = { }, /* user_data */ 0.0, /* device_x_offset */ 0.0, /* device_y_offset */ + 0.0, /* x_fallback_resolution */ + 0.0, /* y_fallback_resolution */ 0, /* next_clip_serial */ 0 /* current_clip_serial */ }; @@ -200,6 +206,9 @@ _cairo_surface_init (cairo_surface_t *surface, surface->device_x_offset = 0.0; surface->device_y_offset = 0.0; + surface->x_fallback_resolution = CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT; + surface->y_fallback_resolution = CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT; + surface->clip = NULL; surface->next_clip_serial = 0; surface->current_clip_serial = 0; @@ -651,6 +660,38 @@ cairo_surface_get_device_offset (cairo_surface_t *surface, *y_offset = surface->device_y_offset; } +/** + * cairo_surface_set_fallback_resolution: + * @surface: a #cairo_surface_t + * @x_pixels_per_inch: horizontal setting for pixels per inch + * @y_pixels_per_inch: vertical setting for pixels per inch + * + * Set the horizontal and vertical resolution for image fallbacks. + * + * When certain operations aren't supported natively by a backend, + * cairo will fallback by rendering operations to an image and then + * overlaying that image onto the output. For backends that are + * natively vector-oriented, this function can be used to set the + * resolution used for these image fallbacks, (larger values will + * result in more detailed images, but also larger file sizes). + * + * Some examples of natively vector-oriented backends are the ps, pdf, + * and svg backends. + * + * For backends that are natively raster-oriented, image fallbacks are + * still possible, but they are always performed at the native + * device resolution. So this function has no effect on those + * backends. + **/ +void +cairo_surface_set_fallback_resolution (cairo_surface_t *surface, + double x_pixels_per_inch, + double y_pixels_per_inch) +{ + surface->x_fallback_resolution = x_pixels_per_inch; + surface->y_fallback_resolution = y_pixels_per_inch; +} + cairo_bool_t _cairo_surface_has_device_offset_or_scale (cairo_surface_t *surface) { @@ -1934,3 +1975,6 @@ _cairo_surface_copy_pattern_for_destination (const cairo_pattern_t *pattern, _cairo_pattern_transform (pattern_out, &device_to_surface); } } + +/* LocalWords: rasterized + */ diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index 79575da52..73d119b2f 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -53,8 +53,6 @@ #define CAIRO_SVG_DTOSTR_BUFFER_LEN 30 -#define CAIRO_SVG_DEFAULT_DPI 300 - typedef struct cairo_svg_document cairo_svg_document_t; typedef struct cairo_svg_surface cairo_svg_surface_t; @@ -84,8 +82,6 @@ struct cairo_svg_document { double width; double height; - double x_dpi; - double y_dpi; xmlDocPtr xml_doc; xmlNodePtr xml_node_defs; @@ -265,38 +261,6 @@ _extract_svg_surface (cairo_surface_t *surface, return CAIRO_STATUS_SUCCESS; } -/** - * cairo_svg_surface_set_dpi: - * @surface: a svg cairo_surface_t - * @x_dpi: horizontal dpi - * @y_dpi: vertical dpi - * - * Set the horizontal and vertical resolution for image fallbacks. - * When the svg backend needs to fall back to image overlays, it will - * use this resolution. These DPI values are not used for any other - * purpose (in particular, they do not have any bearing on the size - * passed to cairo_pdf_surface_create() nor on the CTM). - **/ - -void -cairo_svg_surface_set_dpi (cairo_surface_t *abstract_surface, - double x_dpi, - double y_dpi) -{ - cairo_svg_surface_t *surface; - cairo_status_t status; - - status = _extract_svg_surface (abstract_surface, &surface); - if (status) { - _cairo_surface_set_error (abstract_surface, - CAIRO_STATUS_SURFACE_TYPE_MISMATCH); - return; - } - - surface->document->x_dpi = x_dpi; - surface->document->y_dpi = y_dpi; -} - /** * cairo_svg_surface_restrict_to_version: * @surface: a SVG #cairo_surface_t @@ -1841,8 +1805,6 @@ _cairo_svg_document_create (cairo_output_stream_t *output_stream, document->finished = FALSE; document->width = width; document->height = height; - document->x_dpi = CAIRO_SVG_DEFAULT_DPI; - document->y_dpi = CAIRO_SVG_DEFAULT_DPI; document->surface_id = 0; document->linear_pattern_id = 0; diff --git a/src/cairo-svg.h b/src/cairo-svg.h index 637231ba3..d28993680 100644 --- a/src/cairo-svg.h +++ b/src/cairo-svg.h @@ -55,11 +55,6 @@ cairo_svg_surface_create_for_stream (cairo_write_func_t write_func, double width_in_points, double height_in_points); -cairo_public void -cairo_svg_surface_set_dpi (cairo_surface_t *surface, - double x_dpi, - double y_dpi); - cairo_public void cairo_svg_surface_restrict_to_version (cairo_surface_t *surface, cairo_svg_version_t version); diff --git a/src/cairo.h b/src/cairo.h index 5b2b4edc4..61e9fe9d3 100644 --- a/src/cairo.h +++ b/src/cairo.h @@ -1317,6 +1317,11 @@ cairo_surface_get_device_offset (cairo_surface_t *surface, double *x_offset, double *y_offset); +cairo_public void +cairo_surface_set_fallback_resolution (cairo_surface_t *surface, + double x_pixels_per_inch, + double y_pixels_per_inch); + /* Image-surface functions */ /** diff --git a/src/cairoint.h b/src/cairoint.h index 04d5146ee..c055b349a 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -858,6 +858,9 @@ struct _cairo_surface { double device_x_offset; double device_y_offset; + double x_fallback_resolution; + double y_fallback_resolution; + cairo_clip_t *clip; /* @@ -1033,6 +1036,8 @@ typedef struct _cairo_traps { #define CAIRO_GSTATE_MITER_LIMIT_DEFAULT 10.0 #define CAIRO_GSTATE_DEFAULT_FONT_SIZE 10.0 +#define CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT 300.0 + typedef struct _cairo_gstate cairo_gstate_t; typedef struct _cairo_stroke_face { diff --git a/test/cairo-test.c b/test/cairo-test.c index 300563850..0103e46ad 100644 --- a/test/cairo-test.c +++ b/test/cairo-test.c @@ -1158,7 +1158,7 @@ create_ps_surface (cairo_test_t *test, free (ptc); return NULL; } - cairo_ps_surface_set_dpi (surface, 72., 72.); + cairo_surface_set_fallback_resolution (surface, 72., 72.); if (content == CAIRO_CONTENT_COLOR) { ptc->target = surface; @@ -1259,7 +1259,7 @@ create_pdf_surface (cairo_test_t *test, free (ptc); return NULL; } - cairo_pdf_surface_set_dpi (surface, 72., 72.); + cairo_surface_set_fallback_resolution (surface, 72., 72.); if (content == CAIRO_CONTENT_COLOR) { ptc->target = surface; @@ -1369,7 +1369,7 @@ create_svg_surface (cairo_test_t *test, free (ptc); return NULL; } - cairo_svg_surface_set_dpi (surface, 72., 72.); + cairo_surface_set_fallback_resolution (surface, 72., 72.); if (content == CAIRO_CONTENT_COLOR) { ptc->target = surface; diff --git a/test/fallback-resolution.c b/test/fallback-resolution.c index 0028301b0..421755d9b 100644 --- a/test/fallback-resolution.c +++ b/test/fallback-resolution.c @@ -58,7 +58,7 @@ main (void) cairo_pdf_test_force_fallbacks (); for (i = 0; i < sizeof(dpi) / sizeof (dpi[0]); i++) { - cairo_pdf_surface_set_dpi (surface, dpi[i], dpi[i]); + cairo_surface_set_fallback_resolution (surface, dpi[i], dpi[i]); cairo_arc (cr, SIZE / 2.0, SIZE / 2.0, 0.75 * SIZE / 2.0, 0, 2.0 * M_PI);