Offset rendering in pixman_composite_trapezoids() by (x_dst, y_dst)
authorSøren Sandmann Pedersen <ssp@redhat.com>
Fri, 11 Mar 2011 12:52:57 +0000 (07:52 -0500)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Mon, 18 Apr 2011 20:27:29 +0000 (16:27 -0400)
Previously, this function would do coordinate calculations in such a
way that (x_dst, y_dst) would only affect the alignment of the source
image, but not of the traps, which would always be considered to be in
absolute destination coordinates. This is unlike the
pixman_image_composite() function which also registers the mask to the
destination.

This patch makes it so that traps are also offset by (x_dst, y_dst).

Also add a comment explaining how this function is supposed to
operate, and update tri-test.c and composite-trap-test.c to deal with
the new semantics.

demos/tri-test.c
pixman/pixman-trap.c
test/composite-traps-test.c

index ff4779e..a71869a 100644 (file)
@@ -36,7 +36,7 @@ main (int argc, char **argv)
                                dest_img,
                                PIXMAN_a8,
                                200, 200,
-                               35, 5,
+                               -5, 5,
                                ARRAY_LENGTH (tris), tris);
     show_image (dest_img);
     
index 2957a2b..c99f03e 100644 (file)
@@ -387,6 +387,19 @@ pixman_rasterize_trapezoid (pixman_image_t *          image,
     }
 }
 
+/*
+ * pixman_composite_trapezoids()
+ *
+ * All the trapezoids are conceptually rendered to an infinitely big image.
+ * The (0, 0) coordinates of this image are then aligned with the (x, y)
+ * coordinates of the source image, and then both images are aligned with
+ * the (x, y) coordinates of the destination. Then, in principle, compositing
+ * of these three images takes place across the entire destination.
+ *
+ * FIXME: However, there is currently a bug, where we restrict this compositing
+ * to the bounding box of the trapezoids. This is incorrect for operators such
+ * as SRC and IN where blank source pixels do have an effect on the destination.
+ */
 PIXMAN_EXPORT void
 pixman_composite_trapezoids (pixman_op_t               op,
                             pixman_image_t *           src,
@@ -419,14 +432,13 @@ pixman_composite_trapezoids (pixman_op_t          op,
            if (!pixman_trapezoid_valid (trap))
                continue;
            
-           pixman_rasterize_trapezoid (dst, trap, 0, 0);
+           pixman_rasterize_trapezoid (dst, trap, x_dst, y_dst);
        }
     }
     else
     {
        pixman_image_t *tmp;
        pixman_box32_t box;
-       int x_rel, y_rel;
        
        box.x1 = INT32_MAX;
        box.y1 = INT32_MAX;
@@ -482,11 +494,10 @@ pixman_composite_trapezoids (pixman_op_t          op,
            pixman_rasterize_trapezoid (tmp, trap, - box.x1, - box.y1);
        }
        
-       x_rel = box.x1 + x_src - x_dst;
-       y_rel = box.y1 + y_src - y_dst;
-       
        pixman_image_composite (op, src, tmp, dst,
-                               x_rel, y_rel, 0, 0, box.x1, box.y1,
+                               x_src + box.x1, y_src + box.y1,
+                               0, 0,
+                               x_dst + box.x1, y_dst + box.y1,
                                box.x2 - box.x1, box.y2 - box.y1);
        
        pixman_image_unref (tmp);
index cf30281..fa6d8a9 100644 (file)
@@ -252,6 +252,6 @@ test_composite (int      testnum,
 int
 main (int argc, const char *argv[])
 {
-    return fuzzer_test_main("composite traps", 40000, 0xA34F95C7,
+    return fuzzer_test_main("composite traps", 40000, 0xE3112106,
                            test_composite, argc, argv);
 }