branch update for HEAD-2003050101
[reactos.git] / drivers / dd / vga / display / objects / lineto.c
1 #include "../vgaddi.h"
2 #include "../vgavideo/vgavideo.h"
3
4
5 BOOL STDCALL
6 DrvLineTo(SURFOBJ *Surface,
7           CLIPOBJ *Clip,
8           BRUSHOBJ *Brush,
9           LONG x1,
10           LONG y1,
11           LONG x2,
12           LONG y2,
13           RECTL *RectBounds,
14           MIX mix)
15
16 // FIXME: Use ClipObj and RectBounds to clip the line where required
17 // FIXME: Use Mix to perform ROPs
18
19 {
20   LONG deltax, deltay, x, y, d, i, xchange, ychange, error, iSolidColor, hx, vy;
21
22   iSolidColor = Brush->iSolidColor; // FIXME: Brush Realization...
23
24   // FIXME: Implement clipping
25
26   x = x1;
27   y = y1;
28   deltax = x2 - x1;
29   deltay = y2 - y1;
30
31   if (deltax < 0)
32     {
33     xchange = -1;
34     deltax = - deltax;
35     hx = x2;
36     x--;
37     }
38   else
39     {
40     xchange = 1;
41     hx = x1;
42     }
43
44   if (deltay < 0)
45     {
46     ychange = -1;
47     deltay = - deltay;
48     vy = y2;
49     y--;
50     }
51   else
52     {
53     ychange = 1;
54     vy = y1;
55     };
56
57   if (y1 == y2)
58     {
59     return vgaHLine(hx, y1, deltax, iSolidColor);
60     }
61   if (x1 == x2)
62     {
63     return vgaVLine(x1, vy, deltay, iSolidColor);
64     }
65
66   // Using individual pixels to draw a line neither horizontal or vertical
67   // Set up the VGA masking for individual pixels
68
69   error = 0;
70
71   if (deltax < deltay)
72     {
73     for (i = 0; i < deltay; i++)
74       {
75       vgaPutPixel(x, y, iSolidColor);
76       y = y + ychange;
77       error = error + deltax;
78
79       if (deltay <= error)
80         {
81         x = x + xchange;
82         error = error - deltay;
83         }
84       }
85     }
86    else
87     {
88     for (i = 0; i < deltax; i++)
89       {
90       vgaPutPixel(x, y, iSolidColor);
91       x = x + xchange;
92       error = error + deltay;
93       if (deltax <= error)
94         {
95         y = y + ychange;
96         error = error - deltax;
97         }
98       }
99    }
100
101    return TRUE;
102 }