Fix destination fetching
authorSøren Sandmann Pedersen <ssp@redhat.com>
Sun, 12 Dec 2010 12:34:42 +0000 (07:34 -0500)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Tue, 18 Jan 2011 17:42:26 +0000 (12:42 -0500)
When fetching from destinations, we need to ignore transformations,
repeat and filtering. Currently we don't ignore them, which means all
kinds of bad things can happen.

This bug fixes this problem by directly calling the scanline fetchers
for destinations instead of going through the full
get_scanline_32/64().

pixman/pixman-bits-image.c

index 8cabfdc..98a2b6d 100644 (file)
@@ -1377,8 +1377,22 @@ _pixman_bits_image_src_iter_init (pixman_image_t *image,
 static uint32_t *
 dest_get_scanline_narrow (pixman_iter_t *iter, const uint32_t *mask)
 {
-    iter->image->bits.get_scanline_32 (
-       iter->image, iter->x, iter->y, iter->width, iter->buffer, mask);
+    pixman_image_t *image  = iter->image;
+    int             x      = iter->x;
+    int             y      = iter->y;
+    int             width  = iter->width;
+    uint32_t *     buffer = iter->buffer;
+
+    image->bits.fetch_scanline_32 (image, x, y, width, buffer, mask);
+    if (image->common.alpha_map)
+    {
+       x -= image->common.alpha_origin_x;
+       y -= image->common.alpha_origin_y;
+
+       image->common.alpha_map->fetch_scanline_32 (
+           (pixman_image_t *)image->common.alpha_map,
+           x, y, width, buffer, mask);
+    }
 
     return iter->buffer;
 }
@@ -1386,8 +1400,22 @@ dest_get_scanline_narrow (pixman_iter_t *iter, const uint32_t *mask)
 static uint32_t *
 dest_get_scanline_wide (pixman_iter_t *iter, const uint32_t *mask)
 {
-    iter->image->bits.get_scanline_64 (
-       iter->image, iter->x, iter->y, iter->width, iter->buffer, mask);
+    bits_image_t *  image  = &iter->image->bits;
+    int             x      = iter->x;
+    int             y      = iter->y;
+    int             width  = iter->width;
+    uint32_t *     buffer = iter->buffer;
+
+    image->fetch_scanline_64 (
+       (pixman_image_t *)image, x, y, width, buffer, mask);
+    if (image->common.alpha_map)
+    {
+       x -= image->common.alpha_origin_x;
+       y -= image->common.alpha_origin_y;
+
+       image->common.alpha_map->fetch_scanline_64 (
+           (pixman_image_t *)image->common.alpha_map, x, y, width, buffer, mask);
+    }
 
     return iter->buffer;
 }