surface: expose the device scale

This adds the new public functions
cairo_surface_set_device_scale and cairo_surface_get_device_scale and
updates old users of the internal functions.
This commit is contained in:
Alexander Larsson 2013-05-30 19:45:59 +02:00 committed by Chris Wilson
parent 38217d67fc
commit 7ab34f302b
6 changed files with 61 additions and 28 deletions

View file

@ -189,9 +189,9 @@ _cairo_default_context_push_group (void *abstract_cr, cairo_content_t content)
parent_surface->device_transform.x0 - extents.x,
parent_surface->device_transform.y0 - extents.y);
_cairo_surface_set_device_scale (group_surface,
parent_surface->device_transform.xx,
parent_surface->device_transform.yy);
cairo_surface_set_device_scale (group_surface,
parent_surface->device_transform.xx,
parent_surface->device_transform.yy);
/* If we have a current path, we need to adjust it to compensate for
* the device offset just applied. */

View file

@ -308,7 +308,7 @@ _paint_fallback_image (cairo_paginated_surface_t *surface,
image = _cairo_paginated_surface_create_image_surface (surface,
ceil (width * x_scale),
ceil (height * y_scale));
_cairo_surface_set_device_scale (image, x_scale, y_scale);
cairo_surface_set_device_scale (image, x_scale, y_scale);
/* set_device_offset just sets the x0/y0 components of the matrix;
* so we have to do the scaling manually. */
cairo_surface_set_device_offset (image, -x*x_scale, -y*y_scale);

View file

@ -500,9 +500,9 @@ cairo_surface_create_for_rectangle (cairo_surface_t *target,
surface->snapshot = NULL;
_cairo_surface_set_device_scale (&surface->base,
target->device_transform.xx,
target->device_transform.yy);
cairo_surface_set_device_scale (&surface->base,
target->device_transform.xx,
target->device_transform.yy);
return &surface->base;
}
@ -542,9 +542,9 @@ _cairo_surface_create_for_rectangle_int (cairo_surface_t *target,
surface->snapshot = NULL;
_cairo_surface_set_device_scale (&surface->base,
target->device_transform.xx,
target->device_transform.yy);
cairo_surface_set_device_scale (&surface->base,
target->device_transform.xx,
target->device_transform.yy);
return &surface->base;
}

View file

@ -1624,26 +1624,28 @@ cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface,
slim_hidden_def (cairo_surface_mark_dirty_rectangle);
/**
* _cairo_surface_set_device_scale:
* cairo_surface_set_device_scale:
* @surface: a #cairo_surface_t
* @sx: a scale factor in the X direction
* @sy: a scale factor in the Y direction
*
* Private function for setting an extra scale factor to affect all
* drawing to a surface. This is used, for example, when replaying a
* recording surface to an image fallback intended for an eventual
* vector-oriented backend. Since the recording surface will record
* coordinates in one backend space, but the image fallback uses a
* different backend space, (differing by the fallback resolution
* scale factors), we need a scale factor correction.
* Sets an scale that is multiplied to the device coordinates determined
* by the CTM when drawing to @surface. One common use for this is to
* render to very high resolution display devices at a scale factor, so
* that code that assumes 1 pixel will be a certain size will still work.
* Setting a transformation via cairo_translate() isn't
* sufficient to do this, since functions like
* cairo_device_to_user() will expose the hidden scale.
*
* Caution: Not all places we use device transform correctly handle
* both a translate and a scale. An audit would be nice.
* Note that the scale affects drawing to the surface as well as
* using the surface in a source pattern.
*
* Since: 1.14
**/
void
_cairo_surface_set_device_scale (cairo_surface_t *surface,
double sx,
double sy)
cairo_surface_set_device_scale (cairo_surface_t *surface,
double sx,
double sy)
{
cairo_status_t status;
@ -1675,6 +1677,30 @@ _cairo_surface_set_device_scale (cairo_surface_t *surface,
_cairo_observers_notify (&surface->device_transform_observers, surface);
}
slim_hidden_def (cairo_surface_set_device_scale);
/**
* cairo_surface_get_device_scale:
* @surface: a #cairo_surface_t
* @x_scale: the scale in the X direction, in device units
* @y_scale: the scale in the Y direction, in device units
*
* This function returns the previous device offset set by
* cairo_surface_set_device_scale().
*
* Since: 1.14
**/
void
cairo_surface_get_device_scale (cairo_surface_t *surface,
double *x_scale,
double *y_scale)
{
if (x_scale)
*x_scale = surface->device_transform.xx;
if (y_scale)
*y_scale = surface->device_transform.yy;
}
slim_hidden_def (cairo_surface_get_device_scale);
/**
* cairo_surface_set_device_offset:

View file

@ -2455,6 +2455,16 @@ cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface,
int width,
int height);
cairo_public void
cairo_surface_set_device_scale (cairo_surface_t *surface,
double x_scale,
double y_scale);
cairo_public void
cairo_surface_get_device_scale (cairo_surface_t *surface,
double *x_scale,
double *y_scale);
cairo_public void
cairo_surface_set_device_offset (cairo_surface_t *surface,
double x_offset,

View file

@ -1420,11 +1420,6 @@ cairo_private_no_warn cairo_bool_t
_cairo_surface_get_extents (cairo_surface_t *surface,
cairo_rectangle_int_t *extents);
cairo_private void
_cairo_surface_set_device_scale (cairo_surface_t *surface,
double sx,
double sy);
cairo_private cairo_bool_t
_cairo_surface_has_device_transform (cairo_surface_t *surface) cairo_pure;
@ -1955,6 +1950,7 @@ slim_hidden_proto (cairo_surface_destroy);
slim_hidden_proto (cairo_surface_finish);
slim_hidden_proto (cairo_surface_flush);
slim_hidden_proto (cairo_surface_get_device_offset);
slim_hidden_proto (cairo_surface_get_device_scale);
slim_hidden_proto (cairo_surface_get_font_options);
slim_hidden_proto (cairo_surface_get_mime_data);
slim_hidden_proto (cairo_surface_has_show_text_glyphs);
@ -1962,6 +1958,7 @@ slim_hidden_proto (cairo_surface_mark_dirty);
slim_hidden_proto (cairo_surface_mark_dirty_rectangle);
slim_hidden_proto_no_warn (cairo_surface_reference);
slim_hidden_proto (cairo_surface_set_device_offset);
slim_hidden_proto (cairo_surface_set_device_scale);
slim_hidden_proto (cairo_surface_set_fallback_resolution);
slim_hidden_proto (cairo_surface_set_mime_data);
slim_hidden_proto (cairo_surface_show_page);