From 5a57005178fc13b6f7e513458ca6dae72a3e5783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Thu, 1 Sep 2016 17:19:27 +0900 Subject: Factor out transform_region helper While we're at it, fix leaking the memory allocated for xRectangles. Reviewed-by: Alex Deucher --- src/radeon_kms.c | 73 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/src/radeon_kms.c b/src/radeon_kms.c index 711e84a2..7173b772 100644 --- a/src/radeon_kms.c +++ b/src/radeon_kms.c @@ -382,6 +382,45 @@ static Bool RADEONCreateScreenResources_KMS(ScreenPtr pScreen) } #ifdef RADEON_PIXMAP_SHARING + +static RegionPtr +transform_region(RegionPtr region, struct pict_f_transform *transform, + int w, int h) +{ + BoxPtr boxes = RegionRects(region); + int nboxes = RegionNumRects(region); + xRectanglePtr rects = malloc(nboxes * sizeof(*rects)); + RegionPtr transformed; + int nrects = 0; + BoxRec box; + int i; + + for (i = 0; i < nboxes; i++) { + box.x1 = boxes[i].x1; + box.x2 = boxes[i].x2; + box.y1 = boxes[i].y1; + box.y2 = boxes[i].y2; + pixman_f_transform_bounds(transform, &box); + + box.x1 = max(box.x1, 0); + box.y1 = max(box.y1, 0); + box.x2 = min(box.x2, w); + box.y2 = min(box.y2, h); + if (box.x1 >= box.x2 || box.y1 >= box.y2) + continue; + + rects[nrects].x = box.x1; + rects[nrects].y = box.y1; + rects[nrects].width = box.x2 - box.x1; + rects[nrects].height = box.y2 - box.y1; + nrects++; + } + + transformed = RegionFromRects(nrects, rects, CT_UNSORTED); + free(rects); + return transformed; +} + static RegionPtr dirty_region(PixmapDirtyUpdatePtr dirty) { @@ -390,36 +429,10 @@ dirty_region(PixmapDirtyUpdatePtr dirty) #ifdef HAS_DIRTYTRACKING_ROTATION if (dirty->rotation != RR_Rotate_0) { - BoxPtr boxes = RegionRects(damageregion); - int nboxes = RegionNumRects(damageregion); - xRectanglePtr rects = malloc(nboxes * sizeof(*rects)); - int dst_w = dirty->slave_dst->drawable.width; - int dst_h = dirty->slave_dst->drawable.height; - int nrects = 0; - BoxRec box; - int i; - - for (i = 0; i < nboxes; i++) { - box.x1 = boxes[i].x1; - box.x2 = boxes[i].x2; - box.y1 = boxes[i].y1; - box.y2 = boxes[i].y2; - pixman_f_transform_bounds(&dirty->f_inverse, &box); - - box.x1 = max(box.x1, 0); - box.y1 = max(box.y1, 0); - box.x2 = min(box.x2, dst_w); - box.y2 = min(box.y2, dst_h); - if (box.x1 >= box.x2 || box.y1 >= box.y2) - continue; - - rects[nrects].x = box.x1; - rects[nrects].y = box.y1; - rects[nrects].width = box.x2 - box.x1; - rects[nrects].height = box.y2 - box.y1; - nrects++; - } - dstregion = RegionFromRects(nrects, rects, CT_UNSORTED); + dstregion = transform_region(damageregion, + &dirty->f_inverse, + dirty->slave_dst->drawable.width, + dirty->slave_dst->drawable.height); } else #endif { -- cgit v1.2.3