Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed N5110 ShiftReg PinDetect
Diff: State.h
- Revision:
- 13:7ab71c7c311b
- Parent:
- 12:8178fad5e660
- Child:
- 17:d6a3b29cab31
--- 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); } }