Avoid recursive DeleteDC calls.
[wine] / 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 #include <stdlib.h>
22 #include "windef.h"
23 #include "wingdi.h"
24 #include "wine/wingdi16.h"
25
26 /* ### start build ### */
27 extern WORD CALLBACK DDA_CallTo16_word_wwl(LINEDDAPROC16,WORD,WORD,LONG);
28 /* ### stop build ### */
29
30 struct linedda16_info
31 {
32     LINEDDAPROC16 proc;
33     LPARAM        param;
34 };
35
36
37 static void CALLBACK DDA_callback( INT x, INT y, LPARAM param )
38 {
39     const struct linedda16_info *info = (struct linedda16_info *)param;
40     DDA_CallTo16_word_wwl( info->proc, x, y, info->param );
41 }
42
43 /**********************************************************************
44  *           LineDDA   (GDI32.@)
45  */
46 BOOL WINAPI LineDDA(INT nXStart, INT nYStart, INT nXEnd, INT nYEnd,
47                         LINEDDAPROC callback, LPARAM lParam )
48 {
49     INT xadd = 1, yadd = 1;
50     INT err,erradd;
51     INT cnt;
52     INT dx = nXEnd - nXStart;
53     INT dy = nYEnd - nYStart;
54
55     if (dx < 0)  {
56       dx = -dx; xadd = -1;
57     }
58     if (dy < 0)  {
59       dy = -dy; yadd = -1;
60     }
61     if (dx > dy) { /* line is "more horizontal" */
62       err = 2*dy - dx; erradd = 2*dy - 2*dx;
63       for(cnt = 0;cnt <= dx; cnt++) {
64         callback(nXStart,nYStart,lParam);
65         if (err > 0) {
66           nYStart += yadd;
67           err += erradd;
68         } else  {
69           err += 2*dy;
70         }
71         nXStart += xadd;
72       }
73     } else  { /* line is "more vertical" */
74       err = 2*dx - dy; erradd = 2*dx - 2*dy;
75       for(cnt = 0;cnt <= dy; cnt++) {
76         callback(nXStart,nYStart,lParam);
77         if (err > 0) {
78           nXStart += xadd;
79           err += erradd;
80         } else  {
81           err += 2*dx;
82         }
83         nYStart += yadd;
84       }
85     }
86     return TRUE;
87 }
88
89
90 /**********************************************************************
91  *           LineDDA   (GDI.100)
92  */
93 void WINAPI LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd,
94                        INT16 nYEnd, LINEDDAPROC16 proc, LPARAM lParam )
95 {
96     struct linedda16_info info;
97     info.proc  = proc;
98     info.param = lParam;
99     LineDDA( nXStart, nYStart, nXEnd, nYEnd, DDA_callback, (LPARAM)&info );
100 }