xref: /reactos/win32ss/gdi/gdi32/objects/linedda.c (revision c2c66aff)
1 /*
2  * GDI drawing functions.
3  *
4  * Copyright 1993, 1994 Alexandre Julliard
5  * Copyright 1997 Bertho A. Stultiens
6  *           1999 Huw D M Davies
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22 /*
23  * COPYRIGHT:        See COPYING in the top level directory
24  * PROJECT:          ReactOS GDI32
25  * PURPOSE:          LineDDA Function
26  * FILE:             win32ss/gdi/gdi32/objects/linedda.c
27  * PROGRAMER:        Steven Edwards
28  * REVISION HISTORY: 2003/11/15 sedwards Created, 2009/04 gschneider Updated
29  * NOTES:            Adapted from Wine
30  */
31 
32 #include <precomp.h>
33 
34 #include <debug.h>
35 
36 /**********************************************************************
37  *           LineDDA   (GDI32.@)
38  * @implemented
39  */
LineDDA(INT nXStart,INT nYStart,INT nXEnd,INT nYEnd,LINEDDAPROC callback,LPARAM lParam)40 BOOL WINAPI LineDDA(INT nXStart, INT nYStart, INT nXEnd, INT nYEnd,
41                     LINEDDAPROC callback, LPARAM lParam )
42 {
43     INT xadd = 1, yadd = 1;
44     INT err,erradd;
45     INT cnt;
46     INT dx = nXEnd - nXStart;
47     INT dy = nYEnd - nYStart;
48 
49     if (dx < 0)
50     {
51         dx = -dx;
52         xadd = -1;
53     }
54     if (dy < 0)
55     {
56         dy = -dy;
57         yadd = -1;
58     }
59     if (dx > dy)  /* line is "more horizontal" */
60     {
61         err = 2*dy - dx;
62         erradd = 2*dy - 2*dx;
63         for(cnt = 0; cnt < dx; cnt++)
64         {
65             callback(nXStart,nYStart,lParam);
66             if (err > 0)
67             {
68                 nYStart += yadd;
69                 err += erradd;
70             }
71             else err += 2*dy;
72             nXStart += xadd;
73         }
74     }
75     else   /* line is "more vertical" */
76     {
77         err = 2*dx - dy;
78         erradd = 2*dx - 2*dy;
79         for(cnt = 0; cnt < dy; cnt++)
80         {
81             callback(nXStart,nYStart,lParam);
82             if (err > 0)
83             {
84                 nXStart += xadd;
85                 err += erradd;
86             }
87             else err += 2*dx;
88             nYStart += yadd;
89         }
90     }
91     return TRUE;
92 }
93 
94