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.
LCD_ST7735/Canvas.h@0:d85c449aca6d, 2015-01-28 (annotated)
- 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?
User | Revision | Line number | New 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__ |