blob: 360604cda10b29ac5684b7712bbd2a84561c4875 [file] [log] [blame]
Alexandre Julliard401710d1993-09-04 10:09:32 +00001/*
2 * LineDDA
3 *
4 * Copyright 1993 Bob Amstadt
Alexandre Julliard59730ae1996-03-24 16:20:51 +00005 */
Alexandre Julliard401710d1993-09-04 10:09:32 +00006
Alexandre Julliardf41aeca1993-09-14 16:47:10 +00007#include <stdlib.h>
Alexandre Julliardfc296da2000-02-10 19:39:48 +00008#include "windef.h"
Marcus Meissner61afa331999-02-22 10:16:00 +00009#include "wingdi.h"
Huw D M Daviesa9f55c41999-05-08 12:45:18 +000010#include "wine/wingdi16.h"
Alexandre Julliard401710d1993-09-04 10:09:32 +000011
Alexandre Julliardf1aa3031996-08-05 17:42:43 +000012
13/**********************************************************************
14 * LineDDA32 (GDI32.248)
15 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000016BOOL WINAPI LineDDA(INT nXStart, INT nYStart, INT nXEnd, INT nYEnd,
17 LINEDDAPROC callback, LPARAM lParam )
Alexandre Julliardf1aa3031996-08-05 17:42:43 +000018{
Alexandre Julliarda3960291999-02-26 11:11:13 +000019 INT xadd = 1, yadd = 1;
20 INT err,erradd;
21 INT cnt;
22 INT dx = nXEnd - nXStart;
23 INT dy = nYEnd - nYStart;
Alexandre Julliardf41aeca1993-09-14 16:47:10 +000024
Alexandre Julliardfa68b751995-04-03 16:55:37 +000025 if (dx < 0) {
26 dx = -dx; xadd = -1;
Alexandre Julliardf41aeca1993-09-14 16:47:10 +000027 }
Alexandre Julliardfa68b751995-04-03 16:55:37 +000028 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 Julliardf1aa3031996-08-05 17:42:43 +000034 callback(nXStart,nYStart,lParam);
Alexandre Julliardfa68b751995-04-03 16:55:37 +000035 if (err > 0) {
36 nYStart += yadd;
37 err += erradd;
38 } else {
39 err += 2*dy;
Alexandre Julliardf41aeca1993-09-14 16:47:10 +000040 }
Alexandre Julliardfa68b751995-04-03 16:55:37 +000041 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 Julliardf1aa3031996-08-05 17:42:43 +000046 callback(nXStart,nYStart,lParam);
Alexandre Julliardfa68b751995-04-03 16:55:37 +000047 if (err > 0) {
48 nXStart += xadd;
49 err += erradd;
50 } else {
51 err += 2*dx;
52 }
53 nYStart += yadd;
54 }
Alexandre Julliardf41aeca1993-09-14 16:47:10 +000055 }
Alexandre Julliardf1aa3031996-08-05 17:42:43 +000056 return TRUE;
Alexandre Julliard401710d1993-09-04 10:09:32 +000057}