Added circle and line support

Revision:
1:14c8b85b34d0
Parent:
0:8439874eb019
Child:
2:d99e9681356b
--- a/NokiaLCD.cpp	Mon Oct 04 05:56:19 2010 +0000
+++ b/NokiaLCD.cpp	Mon Oct 04 08:14:06 2010 +0000
@@ -459,6 +459,109 @@
     return;
 }
 
+void NokiaLCD::line(int x0, int y0, int x1, int y1, int colour) {
+    int   dx = 0, dy = 0;
+    int   dx_sym = 0, dy_sym = 0;
+    int   dx_x2 = 0, dy_x2 = 0;
+    int   di = 0;
+
+    _cs = 0;            // Chipselect the LCD. 
+
+    dx = x1-x0;
+    dy = y1-y0;
+
+
+    if(dx == 0)           /* vertical line */
+    {
+        for(int y=y0; y<y1; y++){
+            _window(x0, y, 1, 1);
+            _putp(colour);
+        }
+        return;
+    }
+
+    if(dx > 0)
+    {
+        dx_sym = 1;
+    }
+    else
+    {
+        dx_sym = -1;
+    }
+
+
+    if(dy == 0)           /* horizontal line */
+    {
+        for(int x=x0; x<x1; x++){
+            _window(x, y0, 1, 1);
+            _putp(colour);
+        }
+        return;
+    }
+
+
+    if(dy > 0)
+    {
+        dy_sym = 1;
+    }
+    else
+    {
+        dy_sym = -1;
+    }
+
+    dx = dx_sym*dx;
+    dy = dy_sym*dy;
+
+    dx_x2 = dx*2;
+    dy_x2 = dy*2;
+
+    if(dx >= dy)
+    {
+        di = dy_x2 - dx;
+        while(x0 != x1)
+        {
+
+            _window(x0, y0, 1, 1);
+            _putp(colour);
+            x0 += dx_sym;
+            if(di<0)
+            {
+                di += dy_x2;
+            }
+            else
+            {
+                di += dy_x2 - dx_x2;
+                y0 += dy_sym;
+            }
+        }
+        _window(x0, y0, 1, 1);
+        _putp(colour);
+    }
+    else
+    {
+        di = dx_x2 - dy;
+        while(y0 != y1)
+        {
+            _window(x0, y0, 1, 1);
+            _putp(colour);
+            y0 += dy_sym;
+            if(di < 0)
+            {
+                di += dx_x2;
+            }
+            else
+            {
+                di += dx_x2 - dy_x2;
+                x0 += dx_sym;
+            }
+        }
+        _window(x0, y, 1, 1);
+        _putp(colour);
+    }
+    _cs = 1;
+    return;
+}
+
 void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) {
     _cs = 0;
     _window(x, y, width, height);