From 13951851cbbd81f9850d8ba132e155e3196ab522 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 23 Aug 2010 18:20:09 +0200 Subject: region: Fix pixman_region_translate() clipping bug Fixes the region-translate test case by clipping region translations to the newly defined PIXMAN_REGION_MIN/MAX and using the newly introduced type overflow_int_t to check for the overflow. Also uses INT16_MAX or INT32_MAX for these values instead of relying on the size of short and int types. --- pixman/pixman-region.c | 42 +++++++++++++++++++++--------------------- pixman/pixman-region16.c | 4 ++++ pixman/pixman-region32.c | 4 ++++ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/pixman/pixman-region.c b/pixman/pixman-region.c index a6a4005..d72773c 100644 --- a/pixman/pixman-region.c +++ b/pixman/pixman-region.c @@ -2194,7 +2194,7 @@ PIXMAN_EXPORT PREFIX (_contains_rectangle) (region_type_t * region, PIXMAN_EXPORT void PREFIX (_translate) (region_type_t *region, int x, int y) { - int x1, x2, y1, y2; + overflow_int_t x1, x2, y1, y2; int nbox; box_type_t * pbox; @@ -2204,7 +2204,7 @@ PREFIX (_translate) (region_type_t *region, int x, int y) region->extents.x2 = x2 = region->extents.x2 + x; region->extents.y2 = y2 = region->extents.y2 + y; - if (((x1 - SHRT_MIN) | (y1 - SHRT_MIN) | (SHRT_MAX - x2) | (SHRT_MAX - y2)) >= 0) + if (((x1 - PIXMAN_REGION_MIN) | (y1 - PIXMAN_REGION_MIN) | (PIXMAN_REGION_MAX - x2) | (PIXMAN_REGION_MAX - y2)) >= 0) { if (region->data && (nbox = region->data->numRects)) { @@ -2219,7 +2219,7 @@ PREFIX (_translate) (region_type_t *region, int x, int y) return; } - if (((x2 - SHRT_MIN) | (y2 - SHRT_MIN) | (SHRT_MAX - x1) | (SHRT_MAX - y1)) <= 0) + if (((x2 - PIXMAN_REGION_MIN) | (y2 - PIXMAN_REGION_MIN) | (PIXMAN_REGION_MAX - x1) | (PIXMAN_REGION_MAX - y1)) <= 0) { region->extents.x2 = region->extents.x1; region->extents.y2 = region->extents.y1; @@ -2228,15 +2228,15 @@ PREFIX (_translate) (region_type_t *region, int x, int y) return; } - if (x1 < SHRT_MIN) - region->extents.x1 = SHRT_MIN; - else if (x2 > SHRT_MAX) - region->extents.x2 = SHRT_MAX; + if (x1 < PIXMAN_REGION_MIN) + region->extents.x1 = PIXMAN_REGION_MIN; + else if (x2 > PIXMAN_REGION_MAX) + region->extents.x2 = PIXMAN_REGION_MAX; - if (y1 < SHRT_MIN) - region->extents.y1 = SHRT_MIN; - else if (y2 > SHRT_MAX) - region->extents.y2 = SHRT_MAX; + if (y1 < PIXMAN_REGION_MIN) + region->extents.y1 = PIXMAN_REGION_MIN; + else if (y2 > PIXMAN_REGION_MAX) + region->extents.y2 = PIXMAN_REGION_MAX; if (region->data && (nbox = region->data->numRects)) { @@ -2249,22 +2249,22 @@ PREFIX (_translate) (region_type_t *region, int x, int y) pbox_out->x2 = x2 = pbox->x2 + x; pbox_out->y2 = y2 = pbox->y2 + y; - if (((x2 - SHRT_MIN) | (y2 - SHRT_MIN) | - (SHRT_MAX - x1) | (SHRT_MAX - y1)) <= 0) + if (((x2 - PIXMAN_REGION_MIN) | (y2 - PIXMAN_REGION_MIN) | + (PIXMAN_REGION_MAX - x1) | (PIXMAN_REGION_MAX - y1)) <= 0) { region->data->numRects--; continue; } - if (x1 < SHRT_MIN) - pbox_out->x1 = SHRT_MIN; - else if (x2 > SHRT_MAX) - pbox_out->x2 = SHRT_MAX; + if (x1 < PIXMAN_REGION_MIN) + pbox_out->x1 = PIXMAN_REGION_MIN; + else if (x2 > PIXMAN_REGION_MAX) + pbox_out->x2 = PIXMAN_REGION_MAX; - if (y1 < SHRT_MIN) - pbox_out->y1 = SHRT_MIN; - else if (y2 > SHRT_MAX) - pbox_out->y2 = SHRT_MAX; + if (y1 < PIXMAN_REGION_MIN) + pbox_out->y1 = PIXMAN_REGION_MIN; + else if (y2 > PIXMAN_REGION_MAX) + pbox_out->y2 = PIXMAN_REGION_MAX; pbox_out++; } diff --git a/pixman/pixman-region16.c b/pixman/pixman-region16.c index 46f5e26..d88d338 100644 --- a/pixman/pixman-region16.c +++ b/pixman/pixman-region16.c @@ -35,6 +35,7 @@ typedef pixman_box16_t box_type_t; typedef pixman_region16_data_t region_data_type_t; typedef pixman_region16_t region_type_t; +typedef int32_t overflow_int_t; typedef struct { int x, y; @@ -42,6 +43,9 @@ typedef struct { #define PREFIX(x) pixman_region##x +#define PIXMAN_REGION_MAX INT16_MAX +#define PIXMAN_REGION_MIN INT16_MIN + #include "pixman-region.c" /* This function exists only to make it possible to preserve the X ABI - diff --git a/pixman/pixman-region32.c b/pixman/pixman-region32.c index aeee86c..abd6b1a 100644 --- a/pixman/pixman-region32.c +++ b/pixman/pixman-region32.c @@ -33,6 +33,7 @@ typedef pixman_box32_t box_type_t; typedef pixman_region32_data_t region_data_type_t; typedef pixman_region32_t region_type_t; +typedef int64_t overflow_int_t; typedef struct { int x, y; @@ -40,4 +41,7 @@ typedef struct { #define PREFIX(x) pixman_region32##x +#define PIXMAN_REGION_MAX INT32_MAX +#define PIXMAN_REGION_MIN INT32_MIN + #include "pixman-region.c" -- cgit v1.2.3