SG12864A

Dependents:   SG12864A_TestProgram

Revision:
3:86e7fba29623
Parent:
2:91c03e41c927
Child:
4:200d1ea4e76e
--- a/SG12864A.cpp	Tue Jul 20 05:30:47 2010 +0000
+++ b/SG12864A.cpp	Tue Jul 20 07:23:15 2010 +0000
@@ -159,13 +159,17 @@
 void SG12864A::bufferPull(void) {
 }
 
-void SG12864A::bufferClear(void) {
+void SG12864A::bufferClear(bool reverse) {
     for (int i = 0; i < sizeof(buffer); i++) {
-        buffer[i] = 0x00;
+        if (reverse) {
+            buffer[i] = 0xFF;
+        } else {
+            buffer[i] = 0x00;
+        }
     }
 }
 
-void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
+void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
     /*
      * Bresenham's line algorithm
      */
@@ -190,9 +194,17 @@
     }
     for (int x = x1; x <= x2; x++) {
         if (steep) {
-            setPixel(y,x);
+            if (reverse) {
+                unsetPixel(y, x);
+            } else {
+                setPixel(y, x);
+            }
         } else {
-            setPixel(x,y);
+            if (reverse) {
+                unsetPixel(x, y);
+            } else {
+                setPixel(x, y);
+            }
         }
         error = error - deltay;
         if (error < 0) {
@@ -202,45 +214,67 @@
     }
 }
 
-void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
+void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
     for (int x = x1; x <= x2; x++) {
-        setPixel(x, y1);
-        setPixel(x, y2);
+        if (reverse) {
+            unsetPixel(x, y1);
+            unsetPixel(x, y2);
+        } else {
+            setPixel(x, y1);
+            setPixel(x, y2);
+        }
     }
     for (int y = y1; y <= y2; y++) {
-        setPixel(x1, y);
-        setPixel(x2, y);
-    }
-}
-
-void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
-    for (int x = x1; x <= x2; x++) {
-        for (int y = y1; y <= y2; y++) {
-            setPixel(x, y);
+        if (reverse) {
+            unsetPixel(x1, y);
+            unsetPixel(x2, y);
+        } else {
+            setPixel(x1, y);
+            setPixel(x2, y);
         }
     }
 }
 
-void SG12864A::bufferDrawString(const uint8_t x, const uint8_t y, const char * str) {
-    char *p = (char *)str;
+void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
+    for (int x = x1; x <= x2; x++) {
+        for (int y = y1; y <= y2; y++) {
+            if (reverse) {
+                unsetPixel(x, y);
+            } else {
+                setPixel(x, y);
+            }
+        }
+    }
+}
+
+void SG12864A::bufferDrawString(uint8_t x, uint8_t y, char * str, bool reverse) {
+    char *p = str;
     int cnt = 0;
     while (*p) {
-        bufferDrawChar(x + (FONT_X * cnt), y, *p);
+        bufferDrawChar(x + (FONT_X * cnt), y, *p, reverse);
         p++;
         cnt++;
     }
 }
 
-void SG12864A::bufferDrawChar(const uint8_t x, const uint8_t y, const char c) {
+void SG12864A::bufferDrawChar(uint8_t x, uint8_t y, char c, bool reverse) {
     if ((FONT_MIN_CODE <= c) &&(c <= FONT_MAX_CODE)) {
         int aofs = (c - FONT_MIN_CODE) * FONT_X;
         for (int i = 0; i < FONT_X; i++) {
             uint8_t pat = font5x7_data[aofs + i];
             for (int j = 0; j < FONT_Y; j++) {
                 if (pat & (1 << j)) {
-                    setPixel(x + i, y + j);
+                    if (reverse) {
+                        unsetPixel(x + i, y + j);
+                    } else {
+                        setPixel(x + i, y + j);
+                    }
                 } else {
-                    unsetPixel(x + i, y + j);
+                    if (reverse) {
+                        setPixel(x + i, y + j);
+                    } else {
+                        unsetPixel(x + i, y + j);
+                    }
                 }
             }
         }
@@ -249,15 +283,42 @@
             uint8_t pat = (i % 2) ? 0x55 : 0xAA;
             for (int j = 0; j < FONT_Y; j++) {
                 if (pat & (1 << j)) {
-                    setPixel(x + i, y + j);
+                    if (reverse) {
+                        unsetPixel(x + i, y + j);
+                    } else {
+                        setPixel(x + i, y + j);
+                    }
                 } else {
-                    unsetPixel(x + i, y + j);
+                    if (reverse) {
+                        setPixel(x + i, y + j);
+                    } else {
+                        unsetPixel(x + i, y + j);
+                    }
                 }
             }
         }
     }
 }
 
+void SG12864A::bufferDrawCheckbox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool state, bool reverse) {
+    bufferDrawBox(x1, y1, x2, y2, reverse);
+    if (state) {
+        bufferDrawLine(x1, y1, x2, y2, reverse);
+        bufferDrawLine(x1, y2, x2, y1, reverse);
+    }
+}
+
+void SG12864A::bufferDrawProgressbar(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, int min, int max, int value, bool horizontal, bool reverse) {
+    bufferDrawBox(x1, y1, x2, y2, reverse);
+    if ((value < min) || (max < value)) {
+        return;
+    }
+    int tmp_max = max - min;
+    int tmp_val = value - min;
+    int pix = ((x2 - x1) * tmp_val) / tmp_max;
+    bufferFillBox(x1 + 1, y1 + 1, x1 + pix - 1, y2 - 1, reverse);
+}
+
 /**
  * High Level Interface.
  *