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:
Carl Worth 2008-05-21 12:06:37 -07:00
parent 8efb103600
commit ddcd6781a2
4 changed files with 72 additions and 9 deletions

View file

@ -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 *

View file

@ -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;

View file

@ -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

View file

@ -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,