Chris Taylor / Mbed 2 deprecated RETRO-CityRally

Dependencies:   mbed

Committer:
taylorza
Date:
Wed Jan 28 03:26:07 2015 +0000
Revision:
0:d85c449aca6d
Working maze scrolling, pre-maze compression

Who changed what in which revision?

UserRevisionLine numberNew contents of line
taylorza 0:d85c449aca6d 1 #include "Base.h"
taylorza 0:d85c449aca6d 2
taylorza 0:d85c449aca6d 3 #ifndef __CANVAS_H__
taylorza 0:d85c449aca6d 4 #define __CANVAS_H__
taylorza 0:d85c449aca6d 5
taylorza 0:d85c449aca6d 6 template <typename T>
taylorza 0:d85c449aca6d 7 class Canvas
taylorza 0:d85c449aca6d 8 {
taylorza 0:d85c449aca6d 9 public:
taylorza 0:d85c449aca6d 10 Canvas(T *pSurface)
taylorza 0:d85c449aca6d 11 {
taylorza 0:d85c449aca6d 12 _pSurface = pSurface;
taylorza 0:d85c449aca6d 13 }
taylorza 0:d85c449aca6d 14
taylorza 0:d85c449aca6d 15 inline void clear()
taylorza 0:d85c449aca6d 16 {
taylorza 0:d85c449aca6d 17 _pSurface->clear();
taylorza 0:d85c449aca6d 18 }
taylorza 0:d85c449aca6d 19
taylorza 0:d85c449aca6d 20 inline void setPixel(int x, int y, uint16_t color)
taylorza 0:d85c449aca6d 21 {
taylorza 0:d85c449aca6d 22 _pSurface->setPixel(x, y, color);
taylorza 0:d85c449aca6d 23 }
taylorza 0:d85c449aca6d 24
taylorza 0:d85c449aca6d 25 void drawLine(int x1, int y1, int x2, int y2, uint16_t color)
taylorza 0:d85c449aca6d 26 {
taylorza 0:d85c449aca6d 27 int dx = abs(x2 - x1);
taylorza 0:d85c449aca6d 28 int dy = abs(y2 - y1);
taylorza 0:d85c449aca6d 29
taylorza 0:d85c449aca6d 30 if (dx == 0)
taylorza 0:d85c449aca6d 31 {
taylorza 0:d85c449aca6d 32 if (y1 > y2) swap(y1, y2);
taylorza 0:d85c449aca6d 33 drawVertLine(x1, y1, y2, color);
taylorza 0:d85c449aca6d 34 return;
taylorza 0:d85c449aca6d 35 }
taylorza 0:d85c449aca6d 36 else if(dy == 0)
taylorza 0:d85c449aca6d 37 {
taylorza 0:d85c449aca6d 38 if (x1 > x2) swap(x1, x2);
taylorza 0:d85c449aca6d 39 drawHorizLine(x1, y1, x2, color);
taylorza 0:d85c449aca6d 40 return;
taylorza 0:d85c449aca6d 41 }
taylorza 0:d85c449aca6d 42
taylorza 0:d85c449aca6d 43 int sx = (x1 < x2) ? 1 : -1;
taylorza 0:d85c449aca6d 44 int sy = (y1 < y2) ? 1 : -1;
taylorza 0:d85c449aca6d 45 int err = dx - dy;
taylorza 0:d85c449aca6d 46 while(x1 != x2 || y1 != y2)
taylorza 0:d85c449aca6d 47 {
taylorza 0:d85c449aca6d 48 setPixel(x1, y1, color);
taylorza 0:d85c449aca6d 49 int e2 = err << 1;
taylorza 0:d85c449aca6d 50 if (e2 > -dy)
taylorza 0:d85c449aca6d 51 {
taylorza 0:d85c449aca6d 52 err -= dy;
taylorza 0:d85c449aca6d 53 x1 += sx;
taylorza 0:d85c449aca6d 54 }
taylorza 0:d85c449aca6d 55 if (e2 < dx)
taylorza 0:d85c449aca6d 56 {
taylorza 0:d85c449aca6d 57 err += dx;
taylorza 0:d85c449aca6d 58 y1 += sy;
taylorza 0:d85c449aca6d 59 }
taylorza 0:d85c449aca6d 60 }
taylorza 0:d85c449aca6d 61 setPixel(x2, y2, color);
taylorza 0:d85c449aca6d 62 }
taylorza 0:d85c449aca6d 63
taylorza 0:d85c449aca6d 64 void drawRect(int x1, int y1, int x2, int y2, uint16_t color)
taylorza 0:d85c449aca6d 65 {
taylorza 0:d85c449aca6d 66 if (x1 > x2) swap(x1, x2);
taylorza 0:d85c449aca6d 67 if (y1 > y2) swap(y1, y2);
taylorza 0:d85c449aca6d 68
taylorza 0:d85c449aca6d 69 drawHorizLine(x1, y1, x2, color);
taylorza 0:d85c449aca6d 70 drawHorizLine(x1, y2, x2, color);
taylorza 0:d85c449aca6d 71 drawVertLine(x1, y1, y2, color);
taylorza 0:d85c449aca6d 72 drawVertLine(x2, y1, y2, color);
taylorza 0:d85c449aca6d 73 }
taylorza 0:d85c449aca6d 74
taylorza 0:d85c449aca6d 75 void fillRect(int x1, int y1, int x2, int y2, uint16_t color)
taylorza 0:d85c449aca6d 76 {
taylorza 0:d85c449aca6d 77 if (x1 > x2) swap(x1, x2);
taylorza 0:d85c449aca6d 78 if (y1 > y2) swap(y1, y2);
taylorza 0:d85c449aca6d 79
taylorza 0:d85c449aca6d 80 for (int x = x1; x <= x2; ++x)
taylorza 0:d85c449aca6d 81 {
taylorza 0:d85c449aca6d 82 _pSurface->fastVLine(y1, y2, x, color);
taylorza 0:d85c449aca6d 83 }
taylorza 0:d85c449aca6d 84 }
taylorza 0:d85c449aca6d 85
taylorza 0:d85c449aca6d 86 void drawBitmap(int x, int y, T &bmp, int srcX, int srcY, int srcWidth, int srcHeight, bool transparent)
taylorza 0:d85c449aca6d 87 {
taylorza 0:d85c449aca6d 88 _pSurface->drawBitmap(x, y, bmp, srcX, srcY, srcWidth, srcHeight, transparent);
taylorza 0:d85c449aca6d 89 }
taylorza 0:d85c449aca6d 90
taylorza 0:d85c449aca6d 91 private:
taylorza 0:d85c449aca6d 92 void drawHorizLine(int x1, int y1, int x2, uint16_t color)
taylorza 0:d85c449aca6d 93 {
taylorza 0:d85c449aca6d 94 for(int x = x1; x <= x2; ++x) setPixel(x, y1, color);
taylorza 0:d85c449aca6d 95 }
taylorza 0:d85c449aca6d 96
taylorza 0:d85c449aca6d 97 void drawVertLine(int x1, int y1, int y2, uint16_t color)
taylorza 0:d85c449aca6d 98 {
taylorza 0:d85c449aca6d 99 for(int y = y1; y <= y2; ++y) setPixel(x1, y, color);
taylorza 0:d85c449aca6d 100 }
taylorza 0:d85c449aca6d 101
taylorza 0:d85c449aca6d 102 private:
taylorza 0:d85c449aca6d 103 T *_pSurface;
taylorza 0:d85c449aca6d 104 };
taylorza 0:d85c449aca6d 105
taylorza 0:d85c449aca6d 106 #endif // __CANVAS_H__