Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 1 | /* |
| 2 | * LineDDA |
| 3 | * |
| 4 | * Copyright 1993 Bob Amstadt |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 5 | */ |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 6 | |
Alexandre Julliard | f41aeca | 1993-09-14 16:47:10 +0000 | [diff] [blame] | 7 | #include <stdlib.h> |
Alexandre Julliard | fc296da | 2000-02-10 19:39:48 +0000 | [diff] [blame] | 8 | #include "windef.h" |
Marcus Meissner | 61afa33 | 1999-02-22 10:16:00 +0000 | [diff] [blame] | 9 | #include "wingdi.h" |
Huw D M Davies | a9f55c4 | 1999-05-08 12:45:18 +0000 | [diff] [blame] | 10 | #include "wine/wingdi16.h" |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 11 | |
Alexandre Julliard | f1aa303 | 1996-08-05 17:42:43 +0000 | [diff] [blame] | 12 | |
| 13 | /********************************************************************** |
| 14 | * LineDDA32 (GDI32.248) |
| 15 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 16 | BOOL WINAPI LineDDA(INT nXStart, INT nYStart, INT nXEnd, INT nYEnd, |
| 17 | LINEDDAPROC callback, LPARAM lParam ) |
Alexandre Julliard | f1aa303 | 1996-08-05 17:42:43 +0000 | [diff] [blame] | 18 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 19 | INT xadd = 1, yadd = 1; |
| 20 | INT err,erradd; |
| 21 | INT cnt; |
| 22 | INT dx = nXEnd - nXStart; |
| 23 | INT dy = nYEnd - nYStart; |
Alexandre Julliard | f41aeca | 1993-09-14 16:47:10 +0000 | [diff] [blame] | 24 | |
Alexandre Julliard | fa68b75 | 1995-04-03 16:55:37 +0000 | [diff] [blame] | 25 | if (dx < 0) { |
| 26 | dx = -dx; xadd = -1; |
Alexandre Julliard | f41aeca | 1993-09-14 16:47:10 +0000 | [diff] [blame] | 27 | } |
Alexandre Julliard | fa68b75 | 1995-04-03 16:55:37 +0000 | [diff] [blame] | 28 | if (dy < 0) { |
| 29 | dy = -dy; yadd = -1; |
| 30 | } |
| 31 | if (dx > dy) { /* line is "more horizontal" */ |
| 32 | err = 2*dy - dx; erradd = 2*dy - 2*dx; |
| 33 | for(cnt = 0;cnt <= dx; cnt++) { |
Alexandre Julliard | f1aa303 | 1996-08-05 17:42:43 +0000 | [diff] [blame] | 34 | callback(nXStart,nYStart,lParam); |
Alexandre Julliard | fa68b75 | 1995-04-03 16:55:37 +0000 | [diff] [blame] | 35 | if (err > 0) { |
| 36 | nYStart += yadd; |
| 37 | err += erradd; |
| 38 | } else { |
| 39 | err += 2*dy; |
Alexandre Julliard | f41aeca | 1993-09-14 16:47:10 +0000 | [diff] [blame] | 40 | } |
Alexandre Julliard | fa68b75 | 1995-04-03 16:55:37 +0000 | [diff] [blame] | 41 | nXStart += xadd; |
| 42 | } |
| 43 | } else { /* line is "more vertical" */ |
| 44 | err = 2*dx - dy; erradd = 2*dx - 2*dy; |
| 45 | for(cnt = 0;cnt <= dy; cnt++) { |
Alexandre Julliard | f1aa303 | 1996-08-05 17:42:43 +0000 | [diff] [blame] | 46 | callback(nXStart,nYStart,lParam); |
Alexandre Julliard | fa68b75 | 1995-04-03 16:55:37 +0000 | [diff] [blame] | 47 | if (err > 0) { |
| 48 | nXStart += xadd; |
| 49 | err += erradd; |
| 50 | } else { |
| 51 | err += 2*dx; |
| 52 | } |
| 53 | nYStart += yadd; |
| 54 | } |
Alexandre Julliard | f41aeca | 1993-09-14 16:47:10 +0000 | [diff] [blame] | 55 | } |
Alexandre Julliard | f1aa303 | 1996-08-05 17:42:43 +0000 | [diff] [blame] | 56 | return TRUE; |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 57 | } |