Hugo Hu / Mbed 2 deprecated BRAVEHEART

Dependencies:   mbed N5110 ShiftReg PinDetect

Revision:
12:8178fad5e660
Parent:
10:f2488a0ecab7
Child:
13:7ab71c7c311b
--- a/State.h	Fri May 08 22:10:54 2015 +0000
+++ b/State.h	Fri May 08 23:51:26 2015 +0000
@@ -43,7 +43,23 @@
         /** Draws an image to the lcd
         * @param img Array with the same size as the display, where 1 is opaque, 0 is blank.
         */
-        void drawImage(const int img[BANKS][WIDTH]); // Draws an image from array
+        //void drawImage(const int img[BANKS][WIDTH]); // Draws an image from array
+        
+        
+        /** Draws an image/sprite to the lcd
+        *   @param img const int array where a solid pixel equals 1, and a blank pixel equals zero
+        *   @param x Horizontal position of image (leftmost pixel)
+        *   @param y Vertical position of image (uppermost pixel)
+        *   See seperate program for how this array can be generated from an image file using SFML!
+        */
+        template<size_t rows, size_t cols>
+        void drawImage(const int (&img)[rows][cols], int x, int y);
+        
+        /** Draws an image/sprite to the lcd with origin in upper-left corner of the lcd
+        *   @param img Array where 1 corresponds to opaque and 0 corresponds to blank
+        */
+        template <size_t rows, size_t cols>
+        void drawImage(const int (&img)[rows][cols]) { drawImage(img, 0, 0); }
         
     protected:
         N5110 *lcd;
@@ -54,4 +70,27 @@
         
 };
 
+// Template functions needs to be declared in the header file
+// TODO: Add functions for inverse drawing
+template<size_t rows, size_t cols>
+void State::drawImage(const int (&img)[rows][cols], int x, int y)
+{
+    for (int i = 0; i < rows; ++i)
+    {
+        // Skip if outside dimensions of LCD
+        if (y + i < 0) continue;
+        else if (y + i >= HEIGHT) break; // Drawing top to bottom, so all succeding points will also be outside
+        
+        for (int j = 0; j < cols; ++j)
+        {
+            // Dimensions check. Draws left to right.
+            if (x + j < 0) continue;
+            else if (x + j >= WIDTH) break;
+            
+            if (img[i][j])
+                lcd->setPixel(x+j,y+i);
+                
+        }
+    }   
+}
 #endif
\ No newline at end of file