gdi32: Use the get_clipped_rects helper in the pen functions.

oldstable
Alexandre Julliard 2011-12-27 14:32:41 +01:00
parent 63ebfc591e
commit d0f110e2a9
1 changed files with 44 additions and 73 deletions

View File

@ -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;
}