From 57819ae3c219252db98df5eefa36499a6b77970c Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=B8ren=20Sandmann?= Date: Sun, 8 Jun 2008 23:53:35 -0400 Subject: [PATCH] Fix bug in pixman_compute_composite_region() It was using the output region as the input. Add and use pixman_region16_copy_from_region32(). --- pixman/pixman-compute-region.c | 9 ++++++--- pixman/pixman-private.h | 9 +++++---- pixman/pixman-region16.c | 27 +++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/pixman/pixman-compute-region.c b/pixman/pixman-compute-region.c index 859f02e..fa0dd99 100644 --- a/pixman/pixman-compute-region.c +++ b/pixman/pixman-compute-region.c @@ -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; diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h index 7f46ccd..951632c 100644 --- a/pixman/pixman-private.h +++ b/pixman/pixman-private.h @@ -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 diff --git a/pixman/pixman-region16.c b/pixman/pixman-region16.c index 8d4a050..1a0edfe 100644 --- a/pixman/pixman-region16.c +++ b/pixman/pixman-region16.c @@ -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" -- 2.7.4