- Move NCI generated files to arch-specific directories
[reactos.git] / reactos / dll / win32 / gdi32 / objects / linedda.c
1 /*
2 * LineDDA
3 *
4 * Copyright 1993 Bob Amstadt
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20 /*
21 * COPYRIGHT: See COPYING in the top level directory
22 * PROJECT: ReactOS GDI32
23 * PURPOSE: LineDDA Function
24 * FILE: lib/gdi32/objects/linedda.c
25 * PROGRAMER: Steven Edwards
26 * REVISION HISTORY: 2003/11/15 sedwards Created
27 * NOTES: Adapted from Wine
28 */
29
30 #include "precomp.h"
31
32 #include <debug.h>
33
34 /**********************************************************************
35 * LineDDA (GDI32.@)
36 * @implemented
37 */
38 BOOL STDCALL LineDDA(INT nXStart, INT nYStart, INT nXEnd, INT nYEnd,
39 LINEDDAPROC lpLineFunc, LPARAM lpData )
40 {
41 INT xadd = 1, yadd = 1;
42 INT err,erradd;
43 INT cnt;
44 INT dx = nXEnd - nXStart;
45 INT dy = nYEnd - nYStart;
46
47 // optimized for vertical and horizontal lines so we avoid unnecessary math
48 if(nXStart == nXEnd)
49 {
50 // vertical line - use dx,dy as temp variables so we don't waste stack space
51 if(nYStart < nYEnd)
52 {
53 dx = nYStart;
54 dy = nYEnd;
55 } else {
56 dx = nYEnd;
57 dy = nYStart;
58 }
59 for(cnt = dx; cnt <= dy; cnt++)
60 {
61 lpLineFunc(nXStart,cnt,lpData);
62 }
63 return TRUE;
64 }
65
66 if(nYStart == nYEnd)
67 {
68 // horizontal line - use dx,dy as temp variables so we don't waste stack space
69 if(nXStart < nXEnd)
70 {
71 dx = nXStart;
72 dy = nXEnd;
73 } else {
74 dx = nXEnd;
75 dy = nXStart;
76 }
77 for(cnt = dx; cnt <= dy; cnt++)
78 {
79 lpLineFunc(cnt, nYStart,lpData);
80 }
81 return TRUE;
82 }
83 // end of H/V line code
84 if (dx < 0) {
85 dx = -dx; xadd = -1;
86 }
87 if (dy < 0) {
88 dy = -dy; yadd = -1;
89 }
90 if (dx > dy) { /* line is "more horizontal" */
91 err = 2*dy - dx; erradd = 2*dy - 2*dx;
92 for(cnt = 0;cnt <= dx; cnt++) {
93 lpLineFunc(nXStart,nYStart,lpData);
94 if (err > 0) {
95 nYStart += yadd;
96 err += erradd;
97 } else {
98 err += 2*dy;
99 }
100 nXStart += xadd;
101 }
102 } else { /* line is "more vertical" */
103 err = 2*dx - dy; erradd = 2*dx - 2*dy;
104 for(cnt = 0;cnt <= dy; cnt++) {
105 lpLineFunc(nXStart,nYStart,lpData);
106 if (err > 0) {
107 nXStart += xadd;
108 err += erradd;
109 } else {
110 err += 2*dx;
111 }
112 nYStart += yadd;
113 }
114 }
115 return TRUE;
116 }