Alexandre Julliard : gdi32: Add a helper function to initialize Bresenham parameters for line drawing.
Alexandre Julliard
julliard at winehq.org
Mon Jul 30 14:18:51 CDT 2012
Module: wine
Branch: master
Commit: 78d12e7fccafb16cf8df8e498e599665565a8624
URL: http://source.winehq.org/git/wine.git/?a=commit;h=78d12e7fccafb16cf8df8e498e599665565a8624
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Jul 30 12:02:34 2012 +0200
gdi32: Add a helper function to initialize Bresenham parameters for line drawing.
---
dlls/gdi32/dibdrv/objects.c | 105 ++++++++++++++++++------------------------
1 files changed, 45 insertions(+), 60 deletions(-)
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index 04548ce..026ea50 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -300,6 +300,39 @@ static inline DWORD calc_outcode(const POINT *pt, const RECT *clip)
return out;
}
+static void init_bres_params( const POINT *start, const POINT *end, bres_params *clip_params,
+ struct line_params *line_params, RECT *rect )
+{
+ INT dx = end->x - start->x, dy = end->y - start->y;
+ INT abs_dx = abs(dx), abs_dy = abs(dy);
+
+ clip_params->dx = abs_dx;
+ clip_params->dy = abs_dy;
+ clip_params->octant = get_octant_mask(dx, dy);
+ clip_params->bias = get_bias( clip_params->octant );
+
+ line_params->bias = clip_params->bias;
+ line_params->x_major = is_xmajor( clip_params->octant );
+ line_params->x_inc = is_x_increasing( clip_params->octant ) ? 1 : -1;
+ line_params->y_inc = is_y_increasing( clip_params->octant ) ? 1 : -1;
+
+ if (line_params->x_major)
+ {
+ line_params->err_add_1 = 2 * abs_dy - 2 * abs_dx;
+ line_params->err_add_2 = 2 * abs_dy;
+ }
+ else
+ {
+ line_params->err_add_1 = 2 * abs_dx - 2 * abs_dy;
+ line_params->err_add_2 = 2 * abs_dx;
+ }
+
+ 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;
+}
+
/******************************************************************************
* clip_line
*
@@ -570,34 +603,8 @@ static BOOL solid_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end, DWORD
{
bres_params clip_params;
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);
-
- clip_params.dx = abs_dx;
- clip_params.dy = abs_dy;
- clip_params.octant = get_octant_mask(dx, dy);
- clip_params.bias = get_bias( clip_params.octant );
-
- line_params.bias = clip_params.bias;
- line_params.x_major = is_xmajor( clip_params.octant );
- line_params.x_inc = is_x_increasing( clip_params.octant ) ? 1 : -1;
- line_params.y_inc = is_y_increasing( clip_params.octant ) ? 1 : -1;
-
- if (line_params.x_major)
- {
- line_params.err_add_1 = 2 * abs_dy - 2 * abs_dx;
- line_params.err_add_2 = 2 * abs_dy;
- }
- else
- {
- line_params.err_add_1 = 2 * abs_dx - 2 * abs_dy;
- line_params.err_add_2 = 2 * abs_dx;
- }
- 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;
+ init_bres_params( start, end, &clip_params, &line_params, &rect );
if (!get_clipped_rects( &pdev->dib, &rect, pdev->clip, &clipped_rects )) return TRUE;
for (i = 0; i < clipped_rects.count; i++)
{
@@ -612,12 +619,14 @@ static BOOL solid_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end, DWORD
if (line_params.x_major)
{
- line_params.err_start = 2 * abs_dy - abs_dx + m * 2 * abs_dy - n * 2 * abs_dx;
+ line_params.err_start = 2 * clip_params.dy - clip_params.dx
+ + m * 2 * clip_params.dy - n * 2 * clip_params.dx;
line_params.length = abs( clipped_end.x - clipped_start.x ) + 1;
}
else
{
- line_params.err_start = 2 * abs_dx - abs_dy + n * 2 * abs_dx - m * 2 * abs_dy;
+ line_params.err_start = 2 * clip_params.dx - clip_params.dy
+ + n * 2 * clip_params.dx - m * 2 * clip_params.dy;
line_params.length = abs( clipped_end.y - clipped_start.y ) + 1;
}
@@ -978,34 +987,8 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end)
{
bres_params clip_params;
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);
-
- clip_params.dx = abs_dx;
- clip_params.dy = abs_dy;
- clip_params.octant = get_octant_mask(dx, dy);
- clip_params.bias = get_bias( clip_params.octant );
- line_params.bias = clip_params.bias;
- line_params.x_major = is_xmajor( clip_params.octant );
- line_params.x_inc = is_x_increasing( clip_params.octant ) ? 1 : -1;
- line_params.y_inc = is_y_increasing( clip_params.octant ) ? 1 : -1;
-
- if (line_params.x_major)
- {
- line_params.err_add_1 = 2 * abs_dy - 2 * abs_dx;
- line_params.err_add_2 = 2 * abs_dy;
- }
- else
- {
- line_params.err_add_1 = 2 * abs_dx - 2 * abs_dy;
- line_params.err_add_2 = 2 * abs_dx;
- }
-
- 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;
+ init_bres_params( start, end, &clip_params, &line_params, &rect );
get_clipped_rects( &pdev->dib, &rect, pdev->clip, &clipped_rects );
for (i = 0; i < clipped_rects.count; i++)
{
@@ -1022,13 +1005,15 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end)
if (line_params.x_major)
{
- line_params.err_start = 2 * abs_dy - abs_dx + m * 2 * abs_dy - n * 2 * abs_dx;
+ line_params.err_start = 2 * clip_params.dy - clip_params.dx
+ + m * 2 * clip_params.dy - n * 2 * clip_params.dx;
line_params.length = abs( clipped_end.x - clipped_start.x ) + 1;
skip_dash(pdev, m);
}
else
{
- line_params.err_start = 2 * abs_dx - abs_dy + n * 2 * abs_dx - m * 2 * abs_dy;
+ line_params.err_start = 2 * clip_params.dx - clip_params.dy
+ + n * 2 * clip_params.dx - m * 2 * clip_params.dy;
line_params.length = abs( clipped_end.y - clipped_start.y ) + 1;
skip_dash(pdev, n);
}
@@ -1041,9 +1026,9 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end)
}
pdev->dash_pos = start_pos;
if(line_params.x_major)
- skip_dash(pdev, abs_dx);
+ skip_dash(pdev, clip_params.dx);
else
- skip_dash(pdev, abs_dy);
+ skip_dash(pdev, clip_params.dy);
}
free_clipped_rects( &clipped_rects );
More information about the wine-cvs
mailing list