mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-01-14 08:00:22 +01:00
BUGGY: Add surface_backend->acquire_source_image_transformed
This is an initial attempt at addressing the recently noticed fallback-resolution bug. It isn't working correctly yet. I'm just committing so that behdad can see what I'm up to.
This commit is contained in:
parent
8efb103600
commit
ddcd6781a2
4 changed files with 72 additions and 9 deletions
|
|
@ -182,17 +182,26 @@ _cairo_meta_surface_finish (void *abstract_surface)
|
|||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_meta_surface_acquire_source_image (void *abstract_surface,
|
||||
cairo_image_surface_t **image_out,
|
||||
void **image_extra)
|
||||
_cairo_meta_surface_acquire_source_image_transformed (
|
||||
void *abstract_surface,
|
||||
cairo_matrix_t *device_transform,
|
||||
cairo_image_surface_t **image_out,
|
||||
void **image_extra)
|
||||
{
|
||||
cairo_status_t status;
|
||||
cairo_meta_surface_t *surface = abstract_surface;
|
||||
cairo_surface_t *image;
|
||||
double width = surface->width_pixels;
|
||||
double height = surface->height_pixels;
|
||||
|
||||
cairo_matrix_transform_distance (device_transform, &width, &height);
|
||||
|
||||
image = _cairo_image_surface_create_with_content (surface->content,
|
||||
surface->width_pixels,
|
||||
surface->height_pixels);
|
||||
ceil (width),
|
||||
ceil (height));
|
||||
|
||||
_cairo_surface_set_device_scale (image,
|
||||
device_transform->xx, device_transform->yy);
|
||||
|
||||
status = _cairo_meta_surface_replay (&surface->base, image);
|
||||
if (status) {
|
||||
|
|
@ -206,6 +215,19 @@ _cairo_meta_surface_acquire_source_image (void *abstract_surface,
|
|||
return status;
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_meta_surface_acquire_source_image (void *abstract_surface,
|
||||
cairo_image_surface_t **image_out,
|
||||
void **image_extra)
|
||||
{
|
||||
cairo_matrix_t identity;
|
||||
|
||||
cairo_matrix_init_identity (&identity);
|
||||
|
||||
return _cairo_meta_surface_acquire_source_image_transformed (
|
||||
abstract_surface, &identity, image_out, image_extra);
|
||||
}
|
||||
|
||||
static void
|
||||
_cairo_meta_surface_release_source_image (void *abstract_surface,
|
||||
cairo_image_surface_t *image,
|
||||
|
|
@ -629,7 +651,13 @@ static const cairo_surface_backend_t cairo_meta_surface_backend = {
|
|||
_cairo_meta_surface_fill,
|
||||
_cairo_meta_surface_show_glyphs,
|
||||
|
||||
_cairo_meta_surface_snapshot
|
||||
_cairo_meta_surface_snapshot,
|
||||
|
||||
NULL, /* is_similar */
|
||||
NULL, /* reset */
|
||||
NULL, /* fill_stroke */
|
||||
|
||||
_cairo_meta_surface_acquire_source_image_transformed
|
||||
};
|
||||
|
||||
static cairo_path_fixed_t *
|
||||
|
|
|
|||
|
|
@ -1702,9 +1702,12 @@ _cairo_pattern_acquire_surface_for_surface (cairo_surface_pattern_t *pattern,
|
|||
{
|
||||
cairo_image_surface_t *image;
|
||||
|
||||
status = _cairo_surface_acquire_source_image (pattern->surface,
|
||||
&image,
|
||||
&attr->extra);
|
||||
status = _cairo_surface_acquire_source_image_transformed (
|
||||
pattern->surface,
|
||||
&dst->device_transform,
|
||||
&image,
|
||||
&attr->extra);
|
||||
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
|
|
|
|||
|
|
@ -968,6 +968,26 @@ _cairo_surface_acquire_source_image (cairo_surface_t *surface,
|
|||
image_out, image_extra));
|
||||
}
|
||||
|
||||
cairo_status_t
|
||||
_cairo_surface_acquire_source_image_transformed (cairo_surface_t *surface,
|
||||
cairo_matrix_t *device_transform,
|
||||
cairo_image_surface_t **image_out,
|
||||
void **image_extra)
|
||||
{
|
||||
assert (!surface->finished);
|
||||
|
||||
if (surface->status)
|
||||
return surface->status;
|
||||
|
||||
if (surface->backend->acquire_source_image_transformed == NULL)
|
||||
return _cairo_surface_acquire_source_image (surface,
|
||||
image_out, image_extra);
|
||||
|
||||
return _cairo_surface_set_error (surface,
|
||||
surface->backend->acquire_source_image_transformed (
|
||||
surface, device_transform, image_out, image_extra));
|
||||
}
|
||||
|
||||
/**
|
||||
* _cairo_surface_release_source_image:
|
||||
* @surface: a #cairo_surface_t
|
||||
|
|
|
|||
|
|
@ -738,6 +738,12 @@ struct _cairo_surface_backend {
|
|||
cairo_matrix_t *stroke_ctm_inverse,
|
||||
double stroke_tolerance,
|
||||
cairo_antialias_t stroke_antialias);
|
||||
|
||||
cairo_warn cairo_status_t
|
||||
(*acquire_source_image_transformed) (void *abstract_surface,
|
||||
cairo_matrix_t *device_trasnform,
|
||||
cairo_image_surface_t **image_out,
|
||||
void **image_extra);
|
||||
};
|
||||
|
||||
#include "cairo-surface-private.h"
|
||||
|
|
@ -1721,6 +1727,12 @@ _cairo_surface_acquire_source_image (cairo_surface_t *surface,
|
|||
cairo_image_surface_t **image_out,
|
||||
void **image_extra);
|
||||
|
||||
cairo_private cairo_status_t
|
||||
_cairo_surface_acquire_source_image_transformed (cairo_surface_t *surface,
|
||||
cairo_matrix_t *device_trasnform,
|
||||
cairo_image_surface_t **image_out,
|
||||
void **image_extra);
|
||||
|
||||
cairo_private void
|
||||
_cairo_surface_release_source_image (cairo_surface_t *surface,
|
||||
cairo_image_surface_t *image,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue