Fix bug in pixman_compute_composite_region()
authorSøren Sandmann <sandmann@redhat.com>
Mon, 9 Jun 2008 03:53:35 +0000 (23:53 -0400)
committerSøren Sandmann <sandmann@redhat.com>
Mon, 9 Jun 2008 03:53:35 +0000 (23:53 -0400)
It was using the output region as the input. Add and use
pixman_region16_copy_from_region32().

pixman/pixman-compute-region.c
pixman/pixman-private.h
pixman/pixman-region16.c

index 859f02e..fa0dd99 100644 (file)
@@ -227,12 +227,15 @@ pixman_compute_composite_region (pixman_region16_t *      pRegion,
 
     pixman_region32_init (&r32);
     
-    if (!pixman_region32_copy_from_region16 (&r32, pRegion))
-       return FALSE;
-
     retval = pixman_compute_composite_region32 (&r32, pSrc, pMask, pDst,
                                                xSrc, ySrc, xMask, yMask, xDst, yDst,
                                                width, height);
+
+    if (retval)
+    {
+       if (!pixman_region16_copy_from_region32 (pRegion, &r32))
+           retval = FALSE;
+    }
     
     pixman_region32_fini (&r32);
     return retval;
index 7f46ccd..951632c 100644 (file)
@@ -694,10 +694,11 @@ pixman_image_can_get_solid (pixman_image_t *image);
 #define PIXMAN_EXPORT
 #endif
 
-/* Helper for 32 bit regions */
-pixman_bool_t
-pixman_region32_copy_from_region16 (pixman_region32_t *dst,
-                                   pixman_region16_t *src);
+/* Region Helpers */
+pixman_bool_t pixman_region32_copy_from_region16 (pixman_region32_t *dst,
+                                                 pixman_region16_t *src);
+pixman_bool_t pixman_region16_copy_from_region32 (pixman_region16_t *dst,
+                                                 pixman_region32_t *src);
 
 #ifdef PIXMAN_TIMING
 
index 8d4a050..1a0edfe 100644 (file)
@@ -40,4 +40,31 @@ typedef struct {
 
 #define PREFIX(x) pixman_region##x
 
+pixman_bool_t
+pixman_region16_copy_from_region32 (pixman_region16_t *dst,
+                                   pixman_region32_t *src)
+{
+    int n_boxes, i;
+    pixman_box32_t *boxes32;
+    pixman_box16_t *boxes16;
+    
+    boxes32 = pixman_region32_rectangles (src, &n_boxes);
+
+    boxes16 = pixman_malloc_ab (n_boxes, sizeof (pixman_box16_t));
+
+    if (!boxes16)
+       return FALSE;
+    
+    for (i = 0; i < n_boxes; ++i)
+    {
+       boxes16[i].x1 = boxes32[i].x1;
+       boxes16[i].y1 = boxes32[i].y1;
+       boxes16[i].x2 = boxes32[i].x2;
+       boxes16[i].y2 = boxes32[i].y2;
+    }
+
+    pixman_region_fini (dst);
+    return pixman_region_init_rects (dst, boxes16, n_boxes);
+}
+
 #include "pixman-region.c"