Hugo Hu / Mbed 2 deprecated BRAVEHEART

Dependencies:   mbed N5110 ShiftReg PinDetect

Revision:
13:7ab71c7c311b
Parent:
12:8178fad5e660
Child:
17:d6a3b29cab31
diff -r 8178fad5e660 -r 7ab71c7c311b State.h
--- a/State.h	Fri May 08 23:51:26 2015 +0000
+++ b/State.h	Sat May 09 13:56:14 2015 +0000
@@ -47,19 +47,16 @@
         
         
         /** Draws an image/sprite to the lcd
+        *   Only the solid pixels are drawn. If two images overlap, the second image drawn will
+        *   not clear pixels which are solid in the first image.
         *   @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)
+        *   @param Inverses images. Default value is false
         *   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); }
+        void drawImage(const int (&img)[rows][cols], int x = 0, int y = 0, bool inverse = false, bool flipX = false, bool flipY = false);
         
     protected:
         N5110 *lcd;
@@ -73,22 +70,30 @@
 // 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)
+void State::drawImage(const int (&img)[rows][cols], int x, int y, bool inverse, bool flipX, bool flipY)
 {
+    int targetX, targetY; // The position on the lcd we are writing to
+    
     for (int i = 0; i < rows; ++i)
     {
+        targetY = (flipY) ? (y + (rows-1) - i) : (y + 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
+        if (targetY < 0) continue;
+        else if (targetY >= HEIGHT) continue;
         
         for (int j = 0; j < cols; ++j)
         {
+            targetX = (flipX) ? (x + ((cols - 1) - j)) : (x + j);
+            
             // Dimensions check. Draws left to right.
-            if (x + j < 0) continue;
-            else if (x + j >= WIDTH) break;
+            if (targetX < 0) continue;
+            else if (targetX >= WIDTH) continue;
             
-            if (img[i][j])
-                lcd->setPixel(x+j,y+i);
+            int solid = img[i][j]; 
+            
+            if ((solid && !inverse) || (!solid && inverse))
+                lcd->setPixel(targetX, targetY);
                 
         }
     }