Revert "Fix scaling with large magnification"

This reverts commit e13be77f33609cb3fdae354ce1f2686ae865f9e0.
This commit is contained in:
Alexander Larsson 2010-08-31 11:48:13 +02:00 committed by Marc-André Lureau
parent deaf22e9bc
commit 4b0da43949

View File

@ -441,54 +441,6 @@ static void blit_image_rop_from_surface(SpiceCanvas *spice_canvas,
}
/* This creates a sub-image of an image (only works for pure subsets).
* This is required when scaling an image so that we can specify a low
* scaled_src_x/y value. Otherwise we can easily extend past the
* limit on src_x (16bit signed) resulting in black being drawn
*/
static pixman_image_t *create_sub_image(pixman_image_t *src,
int x, int y,
int width, int height,
int *sub_x, int *sub_y)
{
char *data;
int w, h, stride, bpp;
pixman_format_code_t format;
*sub_x = 0;
*sub_y = 0;
w = pixman_image_get_width(src);
h = pixman_image_get_height(src);
if (x == 0 && y == 0 &&
width == w && height == h) {
return pixman_image_ref(src);
}
data = (char *)pixman_image_get_data(src);
stride = pixman_image_get_stride(src);
format = spice_pixman_image_get_format(src);
bpp = PIXMAN_FORMAT_BPP(format);
if (bpp == 1) {
*sub_x = x % 8;
width += x % 8;
x = x / 8;
bpp = 1;
} else if (bpp == 4) {
*sub_x = x % 2;
width += x % 2;
x = x / 2;
bpp = 1;
} else {
bpp = bpp / 8;
}
return pixman_image_create_bits (format,
width, height,
(uint32_t *)(data + stride * y + bpp * x),
stride);
}
static void __scale_image(SpiceCanvas *spice_canvas,
pixman_region32_t *region,
@ -503,8 +455,6 @@ static void __scale_image(SpiceCanvas *spice_canvas,
pixman_transform_t transform;
pixman_fixed_t fsx, fsy;
int scaled_src_x, scaled_src_y;
pixman_image_t *sub_src;
int sub_src_x, sub_src_y;
fsx = ((pixman_fixed_48_16_t) src_width * 65536) / dest_width;
fsy = ((pixman_fixed_48_16_t) src_height * 65536) / dest_height;
@ -513,31 +463,27 @@ static void __scale_image(SpiceCanvas *spice_canvas,
pixman_transform_init_scale(&transform, fsx, fsy);
sub_src = create_sub_image(src,
src_x, src_y,
src_width, src_height,
&sub_src_x, &sub_src_y);
pixman_image_set_transform(sub_src, &transform);
pixman_image_set_repeat(sub_src, PIXMAN_REPEAT_NONE);
pixman_image_set_transform(src, &transform);
pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE);
ASSERT(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
pixman_image_set_filter(sub_src,
pixman_image_set_filter(src,
(scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST) ?
PIXMAN_FILTER_NEAREST : PIXMAN_FILTER_GOOD,
NULL, 0);
scaled_src_x = ((pixman_fixed_48_16_t)sub_src_x * 65536 + fsx/2 ) / fsx;
scaled_src_y = ((pixman_fixed_48_16_t)sub_src_y * 65536 + fsy/2 ) / fsy;
scaled_src_x = ((pixman_fixed_48_16_t)src_x * 65536 + fsx/2 ) / fsx;
scaled_src_y = ((pixman_fixed_48_16_t)src_y * 65536 + fsy/2 ) / fsy;
pixman_image_composite32(PIXMAN_OP_SRC,
sub_src, NULL, canvas->image,
src, NULL, canvas->image,
scaled_src_x, scaled_src_y, /* src */
0, 0, /* mask */
dest_x, dest_y, /* dst */
dest_width, dest_height);
pixman_image_unref(sub_src);
pixman_transform_init_identity(&transform);
pixman_image_set_transform(src, &transform);
pixman_image_set_clip_region32(canvas->image, NULL);
}
@ -585,8 +531,6 @@ static void __scale_image_rop(SpiceCanvas *spice_canvas,
int n_rects, i;
pixman_fixed_t fsx, fsy;
int scaled_src_x, scaled_src_y;
pixman_image_t *sub_src;
int sub_src_x, sub_src_y;
fsx = ((pixman_fixed_48_16_t) src_width * 65536) / dest_width;
fsy = ((pixman_fixed_48_16_t) src_height * 65536) / dest_height;
@ -601,32 +545,28 @@ static void __scale_image_rop(SpiceCanvas *spice_canvas,
pixman_transform_init_scale(&transform, fsx, fsy);
sub_src = create_sub_image(src,
src_x, src_y,
src_width, src_height,
&sub_src_x, &sub_src_y);
pixman_image_set_transform(sub_src, &transform);
pixman_image_set_repeat(sub_src, PIXMAN_REPEAT_NONE);
pixman_image_set_transform(src, &transform);
pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE);
ASSERT(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
pixman_image_set_filter(sub_src,
pixman_image_set_filter(src,
(scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST) ?
PIXMAN_FILTER_NEAREST : PIXMAN_FILTER_GOOD,
NULL, 0);
scaled_src_x = ((pixman_fixed_48_16_t)sub_src_x * 65536 + fsx/2 ) / fsx;
scaled_src_y = ((pixman_fixed_48_16_t)sub_src_y * 65536 + fsy/2 ) / fsy;
scaled_src_x = ((pixman_fixed_48_16_t)src_x * 65536 + fsx/2 ) / fsx;
scaled_src_y = ((pixman_fixed_48_16_t)src_y * 65536 + fsy/2 ) / fsy;
pixman_image_composite32(PIXMAN_OP_SRC,
sub_src, NULL, scaled,
src, NULL, scaled,
scaled_src_x, scaled_src_y, /* src */
0, 0, /* mask */
0, 0, /* dst */
dest_width,
dest_height);
pixman_image_unref(sub_src);
pixman_transform_init_identity(&transform);
pixman_image_set_transform(src, &transform);
/* Translate back */
pixman_region32_translate(region, dest_x, dest_y);
@ -790,8 +730,6 @@ static void __blend_scale_image(SpiceCanvas *spice_canvas,
pixman_image_t *mask, *dest;
pixman_fixed_t fsx, fsy;
int scaled_src_x, scaled_src_y;
pixman_image_t *sub_src;
int sub_src_x, sub_src_y;
fsx = ((pixman_fixed_48_16_t) src_width * 65536) / dest_width;
fsy = ((pixman_fixed_48_16_t) src_height * 65536) / dest_height;
@ -809,25 +747,20 @@ static void __blend_scale_image(SpiceCanvas *spice_canvas,
mask = pixman_image_create_solid_fill(&color);
}
sub_src = create_sub_image(src,
src_x, src_y,
src_width, src_height,
&sub_src_x, &sub_src_y);
pixman_image_set_transform(sub_src, &transform);
pixman_image_set_repeat(sub_src, PIXMAN_REPEAT_NONE);
pixman_image_set_transform(src, &transform);
pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE);
ASSERT(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
pixman_image_set_filter(sub_src,
pixman_image_set_filter(src,
(scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST) ?
PIXMAN_FILTER_NEAREST : PIXMAN_FILTER_GOOD,
NULL, 0);
scaled_src_x = ((pixman_fixed_48_16_t)sub_src_x * 65536 + fsx/2 ) / fsx;
scaled_src_y = ((pixman_fixed_48_16_t)sub_src_y * 65536 + fsy/2 ) / fsy;
scaled_src_x = ((pixman_fixed_48_16_t)src_x * 65536 + fsx/2 ) / fsx;
scaled_src_y = ((pixman_fixed_48_16_t)src_y * 65536 + fsy/2 ) / fsy;
pixman_image_composite32(PIXMAN_OP_OVER,
sub_src, mask, dest,
src, mask, dest,
scaled_src_x, scaled_src_y, /* src */
0, 0, /* mask */
dest_x, dest_y, /* dst */
@ -838,7 +771,8 @@ static void __blend_scale_image(SpiceCanvas *spice_canvas,
clear_dest_alpha(dest, dest_x, dest_y, dest_width, dest_height);
}
pixman_image_unref(sub_src);
pixman_transform_init_identity(&transform);
pixman_image_set_transform(src, &transform);
if (mask) {
pixman_image_unref(mask);
@ -955,8 +889,6 @@ static void __colorkey_scale_image(SpiceCanvas *spice_canvas,
int n_rects, i;
pixman_fixed_t fsx, fsy;
int scaled_src_x, scaled_src_y;
pixman_image_t *sub_src;
int sub_src_x, sub_src_y;
fsx = ((pixman_fixed_48_16_t) src_width * 65536) / dest_width;
fsy = ((pixman_fixed_48_16_t) src_height * 65536) / dest_height;
@ -971,29 +903,25 @@ static void __colorkey_scale_image(SpiceCanvas *spice_canvas,
pixman_transform_init_scale(&transform, fsx, fsy);
sub_src = create_sub_image(src,
src_x, src_y,
src_width, src_height,
&sub_src_x, &sub_src_y);
pixman_image_set_transform(sub_src, &transform);
pixman_image_set_repeat(sub_src, PIXMAN_REPEAT_NONE);
pixman_image_set_filter(sub_src,
pixman_image_set_transform(src, &transform);
pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE);
pixman_image_set_filter(src,
PIXMAN_FILTER_NEAREST,
NULL, 0);
scaled_src_x = ((pixman_fixed_48_16_t)sub_src_x * 65536 + fsx/2 ) / fsx;
scaled_src_y = ((pixman_fixed_48_16_t)sub_src_y * 65536 + fsy/2 ) / fsy;
scaled_src_x = ((pixman_fixed_48_16_t)src_x * 65536 + fsx/2 ) / fsx;
scaled_src_y = ((pixman_fixed_48_16_t)src_y * 65536 + fsy/2 ) / fsy;
pixman_image_composite32(PIXMAN_OP_SRC,
sub_src, NULL, scaled,
src, NULL, scaled,
scaled_src_x, scaled_src_y, /* src */
0, 0, /* mask */
0, 0, /* dst */
dest_width,
dest_height);
pixman_image_unref(sub_src);
pixman_transform_init_identity(&transform);
pixman_image_set_transform(src, &transform);
/* Translate back */
pixman_region32_translate(region, dest_x, dest_y);