From d0f110e2a90068d952671fb1f38966d2524fc214 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 27 Dec 2011 14:32:41 +0100 Subject: [PATCH] gdi32: Use the get_clipped_rects helper in the pen functions. --- dlls/gdi32/dibdrv/objects.c | 117 ++++++++++++++---------------------- 1 file changed, 44 insertions(+), 73 deletions(-) diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c index 96596dfe642..3b3d5a3af9e 100644 --- a/dlls/gdi32/dibdrv/objects.c +++ b/dlls/gdi32/dibdrv/objects.c @@ -540,66 +540,29 @@ static void bres_line_with_bias(const POINT *start, const struct line_params *pa static BOOL solid_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end, DWORD and, DWORD xor) { - const WINEREGION *clip = get_wine_region(pdev->clip); + struct clipped_rects clipped_rects; + RECT rect; + int i; if(start->y == end->y) { - RECT rect; - int i; - rect.left = start->x; rect.top = start->y; rect.right = end->x; rect.bottom = end->y + 1; order_end_points(&rect.left, &rect.right); - for(i = 0; i < clip->numRects; i++) - { - if(clip->rects[i].top >= rect.bottom) break; - if(clip->rects[i].bottom <= rect.top) continue; - /* Optimize the unclipped case */ - if(clip->rects[i].left <= rect.left && clip->rects[i].right >= rect.right) - { - pdev->dib.funcs->solid_rects(&pdev->dib, 1, &rect, and, xor); - break; - } - if(clip->rects[i].right > rect.left && clip->rects[i].left < rect.right) - { - RECT tmp = rect; - tmp.left = max(rect.left, clip->rects[i].left); - tmp.right = min(rect.right, clip->rects[i].right); - pdev->dib.funcs->solid_rects(&pdev->dib, 1, &tmp, and, xor); - } - } + if (!get_clipped_rects( &pdev->dib, &rect, pdev->clip, &clipped_rects )) return TRUE; + pdev->dib.funcs->solid_rects(&pdev->dib, clipped_rects.count, clipped_rects.rects, and, xor); } else if(start->x == end->x) { - RECT rect; - int i; - rect.left = start->x; rect.top = start->y; rect.right = end->x + 1; rect.bottom = end->y; order_end_points(&rect.top, &rect.bottom); - for(i = 0; i < clip->numRects; i++) - { - /* Optimize unclipped case */ - if(clip->rects[i].top <= rect.top && clip->rects[i].bottom >= rect.bottom && - clip->rects[i].left <= rect.left && clip->rects[i].right >= rect.right) - { - pdev->dib.funcs->solid_rects(&pdev->dib, 1, &rect, and, xor); - break; - } - if(clip->rects[i].top >= rect.bottom) break; - if(clip->rects[i].bottom <= rect.top) continue; - if(clip->rects[i].right > rect.left && clip->rects[i].left < rect.right) - { - RECT tmp = rect; - tmp.top = max(rect.top, clip->rects[i].top); - tmp.bottom = min(rect.bottom, clip->rects[i].bottom); - pdev->dib.funcs->solid_rects(&pdev->dib, 1, &tmp, and, xor); - } - } + if (!get_clipped_rects( &pdev->dib, &rect, pdev->clip, &clipped_rects )) return TRUE; + pdev->dib.funcs->solid_rects(&pdev->dib, clipped_rects.count, clipped_rects.rects, and, xor); } else { @@ -607,7 +570,6 @@ static BOOL solid_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end, DWORD struct line_params line_params; INT dx = end->x - start->x, dy = end->y - start->y; INT abs_dx = abs(dx), abs_dy = abs(dy); - INT i; clip_params.dx = abs_dx; clip_params.dy = abs_dy; @@ -630,12 +592,17 @@ static BOOL solid_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end, DWORD line_params.err_add_2 = 2 * abs_dx; } - for(i = 0; i < clip->numRects; i++) + rect.left = min( start->x, end->x ); + rect.top = min( start->y, end->y ); + rect.right = max( start->x, end->x ) + 1; + rect.bottom = max( start->y, end->y ) + 1; + if (!get_clipped_rects( &pdev->dib, &rect, pdev->clip, &clipped_rects )) return TRUE; + for (i = 0; i < clipped_rects.count; i++) { POINT clipped_start, clipped_end; int clip_status; - clip_status = clip_line(start, end, clip->rects + i, &clip_params, &clipped_start, &clipped_end); + clip_status = clip_line(start, end, clipped_rects.rects + i, &clip_params, &clipped_start, &clipped_end); if(clip_status) { int m = abs(clipped_start.x - start->x); @@ -659,9 +626,8 @@ static BOOL solid_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end, DWORD if(clip_status == 2) break; /* completely unclipped, so we can finish */ } } - } - release_wine_region(pdev->clip); + free_clipped_rects( &clipped_rects ); return TRUE; } @@ -724,7 +690,7 @@ static void dashed_pen_line_callback(dibdrv_physdev *pdev, INT x, INT y) static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end) { - const WINEREGION *clip = get_wine_region(pdev->clip); + struct clipped_rects clipped_rects; int i, dash_len; RECT rect; const dash_pos start_pos = pdev->dash_pos; @@ -750,15 +716,15 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end) l_to_r = FALSE; } - for(i = 0; i < clip->numRects; i++) + rect.left = min( start->x, end->x ); + rect.right = max( start->x, end->x ) + 1; + get_clipped_rects( &pdev->dib, &rect, pdev->clip, &clipped_rects ); + for (i = 0; i < clipped_rects.count; i++) { - if(clip->rects[i].top > start->y) break; - if(clip->rects[i].bottom <= start->y) continue; - - if(clip->rects[i].right > left && clip->rects[i].left <= right) + if(clipped_rects.rects[i].right > left && clipped_rects.rects[i].left <= right) { - int clipped_left = max(clip->rects[i].left, left); - int clipped_right = min(clip->rects[i].right - 1, right); + int clipped_left = max(clipped_rects.rects[i].left, left); + int clipped_right = min(clipped_rects.rects[i].right - 1, right); pdev->dash_pos = start_pos; @@ -828,14 +794,15 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end) t_to_b = FALSE; } - for(i = 0; i < clip->numRects; i++) + rect.top = min( start->y, end->y ); + rect.bottom = max( start->y, end->y ) + 1; + get_clipped_rects( &pdev->dib, &rect, pdev->clip, &clipped_rects ); + for (i = 0; i < clipped_rects.count; i++) { - if(clip->rects[i].top > bottom) break; - if(clip->rects[i].bottom <= top) continue; - if(clip->rects[i].right > start->x && clip->rects[i].left <= start->x) + if(clipped_rects.rects[i].right > start->x && clipped_rects.rects[i].left <= start->x) { - int clipped_top = max(clip->rects[i].top, top); - int clipped_bottom = min(clip->rects[i].bottom - 1, bottom); + int clipped_top = max(clipped_rects.rects[i].top, top); + int clipped_bottom = min(clipped_rects.rects[i].bottom - 1, bottom); pdev->dash_pos = start_pos; @@ -890,7 +857,6 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end) struct line_params line_params; INT dx = end->x - start->x, dy = end->y - start->y; INT abs_dx = abs(dx), abs_dy = abs(dy); - INT i; clip_params.dx = abs_dx; clip_params.dy = abs_dy; @@ -913,11 +879,16 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end) line_params.err_add_2 = 2 * abs_dx; } - for(i = 0; i < clip->numRects; i++) + rect.left = min( start->x, end->x ); + rect.top = min( start->y, end->y ); + rect.right = max( start->x, end->x ) + 1; + rect.bottom = max( start->y, end->y ) + 1; + get_clipped_rects( &pdev->dib, &rect, pdev->clip, &clipped_rects ); + for (i = 0; i < clipped_rects.count; i++) { POINT clipped_start, clipped_end; int clip_status; - clip_status = clip_line(start, end, clip->rects + i, &clip_params, &clipped_start, &clipped_end); + clip_status = clip_line(start, end, clipped_rects.rects + i, &clip_params, &clipped_start, &clipped_end); if(clip_status) { @@ -952,7 +923,7 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end) skip_dash(pdev, abs_dy); } - release_wine_region(pdev->clip); + free_clipped_rects( &clipped_rects ); return TRUE; } @@ -1256,7 +1227,7 @@ static HRGN get_wide_lines_region( dibdrv_physdev *pdev, int num, POINT *pts, BO static BOOL wide_pen_lines(dibdrv_physdev *pdev, int num, POINT *pts, BOOL close) { - const WINEREGION *data; + struct clipped_rects clipped_rects; rop_mask color; HRGN region; DWORD pen_color = get_pixel_color( pdev, pdev->pen_colorref, TRUE ); @@ -1264,14 +1235,14 @@ static BOOL wide_pen_lines(dibdrv_physdev *pdev, int num, POINT *pts, BOOL close calc_rop_masks( GetROP2(pdev->dev.hdc), pen_color, &color ); region = get_wide_lines_region( pdev, num, pts, close ); + if (pdev->clip) CombineRgn( region, region, pdev->clip, RGN_AND ); - if (CombineRgn( region, region, pdev->clip, RGN_AND ) != ERROR) + if (get_clipped_rects( &pdev->dib, NULL, region, &clipped_rects )) { - data = get_wine_region( region ); - solid_rects( &pdev->dib, data->numRects, data->rects, &color, NULL ); - release_wine_region( region ); + pdev->dib.funcs->solid_rects( &pdev->dib, clipped_rects.count, clipped_rects.rects, + color.and, color.xor ); + free_clipped_rects( &clipped_rects ); } - DeleteObject( region ); return TRUE; }