Implemented basic VGA routines
[reactos.git] / reactos / drivers / dd / vga / display / objects / lineto.c
1 #include "..\vgaddi.h"
2 #include "..\vgavideo\vgavideo.h"
3
4 #include <internal/i386/io.h>
5
6 BOOL VGADDILineTo(SURFOBJ *Surface, CLIPOBJ *Clip, BRUSHOBJ *Brush,
7 LONG x1, LONG y1, LONG x2, LONG y2,
8 RECTL *RectBounds, MIX mix)
9 {
10 ULONG x, y, d, i, length, xchange, ychange, error,
11 iSolidColor, hx, vy;
12 LONG deltax, deltay;
13
14 iSolidColor = Brush->iSolidColor; // FIXME: Brush Realization...
15
16 // FIXME: Implement clipping
17
18 x=x1;
19 y=y1;
20 deltax=x2-x1;
21 deltay=y2-y1;
22
23 if(deltax<0)
24 {
25 xchange=-1;
26 deltax=-deltax;
27 hx = x2;
28 } else
29 {
30 xchange=1;
31 hx = x1;
32 }
33
34 if(deltay<0)
35 {
36 ychange=-1;
37 deltay=-deltay;
38 vy = y2;
39 } else
40 {
41 ychange=1;
42 vy = y1;
43 };
44
45 if(y1==y2)
46 {
47 return vgaHLine(hx, y1, deltax, iSolidColor);
48 }
49 if(x1==x2)
50 {
51 return vgaVLine(x1, vy, deltay, iSolidColor);
52 }
53
54 error=0;
55 i=0;
56
57 if(deltax<deltay)
58 {
59 length=deltay+1;
60 while(i<length)
61 {
62 vgaPutPixel(x, y, iSolidColor);
63 y=y+ychange;
64 error=error+deltax;
65
66 if(error>deltay)
67 {
68 x=x+xchange;
69 error=error-deltay;
70 }
71 i=i+1;
72 }
73 } else
74 {
75 length=deltax+1;
76 while(i<length)
77 {
78 vgaPutPixel(x, y, iSolidColor);
79 x=x+xchange;
80 error=error+deltay;
81 if(error>deltax)
82 {
83 y=y+ychange;
84 error=error-deltax;
85 }
86 i=i+1;
87 }
88 }
89
90 return TRUE;
91 }