Tiny graphics library for STM32F746G-DISCO board
Dependents: RadarDemo 3DDemo RadarDemoT
Canvas.cpp@3:1ddc4aa1e5cb, 2016-11-11 (annotated)
- Committer:
- karpent
- Date:
- Fri Nov 11 12:05:16 2016 +0000
- Revision:
- 3:1ddc4aa1e5cb
- Parent:
- 2:02b7b78e8510
Missing method DrawChar() added, DrawText() corrected.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
karpent | 0:566855d63a2f | 1 | // |
karpent | 0:566855d63a2f | 2 | // Canvas.cpp - Simple canvas. |
karpent | 0:566855d63a2f | 3 | // |
karpent | 0:566855d63a2f | 4 | |
karpent | 0:566855d63a2f | 5 | #include "Canvas.h" |
karpent | 0:566855d63a2f | 6 | #include "stdlib.h" |
karpent | 0:566855d63a2f | 7 | |
karpent | 0:566855d63a2f | 8 | Canvas::Canvas(void) |
karpent | 0:566855d63a2f | 9 | { |
karpent | 0:566855d63a2f | 10 | Reset(); |
karpent | 0:566855d63a2f | 11 | } |
karpent | 0:566855d63a2f | 12 | |
karpent | 0:566855d63a2f | 13 | |
karpent | 0:566855d63a2f | 14 | Canvas::Canvas(uint16_t width, uint16_t height) |
karpent | 0:566855d63a2f | 15 | { |
karpent | 2:02b7b78e8510 | 16 | Reset(); |
karpent | 0:566855d63a2f | 17 | SetSize(width, height); |
karpent | 0:566855d63a2f | 18 | } |
karpent | 0:566855d63a2f | 19 | |
karpent | 0:566855d63a2f | 20 | |
karpent | 0:566855d63a2f | 21 | Canvas::~Canvas() |
karpent | 0:566855d63a2f | 22 | { |
karpent | 0:566855d63a2f | 23 | free(_planeBitmap); |
karpent | 0:566855d63a2f | 24 | } |
karpent | 0:566855d63a2f | 25 | |
karpent | 0:566855d63a2f | 26 | |
karpent | 0:566855d63a2f | 27 | void Canvas::Reset() |
karpent | 0:566855d63a2f | 28 | { |
karpent | 0:566855d63a2f | 29 | _width = 0; |
karpent | 0:566855d63a2f | 30 | _height = 0; |
karpent | 0:566855d63a2f | 31 | |
karpent | 0:566855d63a2f | 32 | _planeBitmap = (uint8_t *)NULL; |
karpent | 0:566855d63a2f | 33 | _planeBitmapSize = 0; |
karpent | 2:02b7b78e8510 | 34 | |
karpent | 2:02b7b78e8510 | 35 | _drawColor = 0xFFFFFFFF; |
karpent | 2:02b7b78e8510 | 36 | _clearColor = 0xFF000000; |
karpent | 0:566855d63a2f | 37 | } |
karpent | 0:566855d63a2f | 38 | |
karpent | 0:566855d63a2f | 39 | |
karpent | 0:566855d63a2f | 40 | uint16_t Canvas::DisplayWidth() |
karpent | 0:566855d63a2f | 41 | { |
karpent | 0:566855d63a2f | 42 | return _width; |
karpent | 0:566855d63a2f | 43 | } |
karpent | 0:566855d63a2f | 44 | |
karpent | 0:566855d63a2f | 45 | |
karpent | 0:566855d63a2f | 46 | uint16_t Canvas::DisplayHeight() |
karpent | 0:566855d63a2f | 47 | { |
karpent | 0:566855d63a2f | 48 | return _height; |
karpent | 0:566855d63a2f | 49 | } |
karpent | 0:566855d63a2f | 50 | |
karpent | 1:871f62b5f150 | 51 | void Canvas::SetDrawColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) |
karpent | 1:871f62b5f150 | 52 | { |
karpent | 1:871f62b5f150 | 53 | _drawColor = alpha; |
karpent | 1:871f62b5f150 | 54 | _drawColor = (_drawColor << 8) | red; |
karpent | 1:871f62b5f150 | 55 | _drawColor = (_drawColor << 8) | green; |
karpent | 1:871f62b5f150 | 56 | _drawColor = (_drawColor << 8) | blue; |
karpent | 1:871f62b5f150 | 57 | } |
karpent | 1:871f62b5f150 | 58 | |
karpent | 2:02b7b78e8510 | 59 | |
karpent | 2:02b7b78e8510 | 60 | uint32_t Canvas::GetDrawColor() |
karpent | 2:02b7b78e8510 | 61 | { |
karpent | 2:02b7b78e8510 | 62 | return _drawColor; |
karpent | 2:02b7b78e8510 | 63 | } |
karpent | 2:02b7b78e8510 | 64 | |
karpent | 2:02b7b78e8510 | 65 | |
karpent | 2:02b7b78e8510 | 66 | void Canvas::SetClearColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) |
karpent | 2:02b7b78e8510 | 67 | { |
karpent | 2:02b7b78e8510 | 68 | _clearColor = alpha; |
karpent | 2:02b7b78e8510 | 69 | _clearColor = (_clearColor << 8) | red; |
karpent | 2:02b7b78e8510 | 70 | _clearColor = (_clearColor << 8) | green; |
karpent | 2:02b7b78e8510 | 71 | _clearColor = (_clearColor << 8) | blue; |
karpent | 2:02b7b78e8510 | 72 | } |
karpent | 2:02b7b78e8510 | 73 | |
karpent | 2:02b7b78e8510 | 74 | |
karpent | 2:02b7b78e8510 | 75 | uint32_t Canvas::GetClearColor() |
karpent | 2:02b7b78e8510 | 76 | { |
karpent | 2:02b7b78e8510 | 77 | return _clearColor; |
karpent | 2:02b7b78e8510 | 78 | } |
karpent | 2:02b7b78e8510 | 79 | |
karpent | 2:02b7b78e8510 | 80 | |
karpent | 0:566855d63a2f | 81 | void Canvas::DrawPoint(int posX, int posY, uint32_t colorMask) |
karpent | 0:566855d63a2f | 82 | { |
karpent | 0:566855d63a2f | 83 | if ((posX >= 0) && (posX < DisplayWidth()) && (posY >= 0) && (posY < DisplayHeight())) { |
karpent | 0:566855d63a2f | 84 | |
karpent | 0:566855d63a2f | 85 | uint32_t shift = posX % PLANE_BITMAP_ELEMENT_BITS; |
karpent | 0:566855d63a2f | 86 | uint32_t col = posX / PLANE_BITMAP_ELEMENT_BITS; |
karpent | 0:566855d63a2f | 87 | |
karpent | 0:566855d63a2f | 88 | uint32_t colsNum = DisplayWidth() / PLANE_BITMAP_ELEMENT_BITS; |
karpent | 2:02b7b78e8510 | 89 | if ((DisplayWidth() % PLANE_BITMAP_ELEMENT_BITS) > 0) { |
karpent | 0:566855d63a2f | 90 | colsNum++; |
karpent | 0:566855d63a2f | 91 | } |
karpent | 0:566855d63a2f | 92 | |
karpent | 0:566855d63a2f | 93 | uint32_t position = posY * colsNum + col; |
karpent | 0:566855d63a2f | 94 | |
karpent | 0:566855d63a2f | 95 | if (colorMask) |
karpent | 0:566855d63a2f | 96 | _planeBitmap[position] |= 1 << shift; |
karpent | 0:566855d63a2f | 97 | else |
karpent | 0:566855d63a2f | 98 | _planeBitmap[position] &= ~(1 << shift); |
karpent | 0:566855d63a2f | 99 | } |
karpent | 0:566855d63a2f | 100 | } |
karpent | 0:566855d63a2f | 101 | |
karpent | 0:566855d63a2f | 102 | |
karpent | 0:566855d63a2f | 103 | bool Canvas::SetSize(uint16_t width, uint16_t height) |
karpent | 0:566855d63a2f | 104 | { |
karpent | 0:566855d63a2f | 105 | _width = width; |
karpent | 0:566855d63a2f | 106 | _height = height; |
karpent | 0:566855d63a2f | 107 | |
karpent | 0:566855d63a2f | 108 | int cols = _width / PLANE_BITMAP_ELEMENT_BITS; |
karpent | 2:02b7b78e8510 | 109 | if ((_width % PLANE_BITMAP_ELEMENT_BITS) != 0) { |
karpent | 0:566855d63a2f | 110 | cols++; |
karpent | 0:566855d63a2f | 111 | } |
karpent | 0:566855d63a2f | 112 | |
karpent | 0:566855d63a2f | 113 | _planeBitmapSize = cols * _height; |
karpent | 0:566855d63a2f | 114 | |
karpent | 2:02b7b78e8510 | 115 | if ((_planeBitmap = IsSet() ? (uint8_t *)realloc((void *)_planeBitmap, _planeBitmapSize) : (uint8_t *)malloc(_planeBitmapSize)) == NULL) { |
karpent | 0:566855d63a2f | 116 | Reset(); |
karpent | 0:566855d63a2f | 117 | return false; |
karpent | 0:566855d63a2f | 118 | } |
karpent | 0:566855d63a2f | 119 | |
karpent | 0:566855d63a2f | 120 | Clear(); |
karpent | 0:566855d63a2f | 121 | |
karpent | 0:566855d63a2f | 122 | return true; |
karpent | 0:566855d63a2f | 123 | } |
karpent | 0:566855d63a2f | 124 | |
karpent | 0:566855d63a2f | 125 | |
karpent | 0:566855d63a2f | 126 | void Canvas::Clear(void) |
karpent | 0:566855d63a2f | 127 | { |
karpent | 0:566855d63a2f | 128 | memset(_planeBitmap, 0, _planeBitmapSize); |
karpent | 0:566855d63a2f | 129 | } |
karpent | 0:566855d63a2f | 130 | |
karpent | 0:566855d63a2f | 131 | |
karpent | 0:566855d63a2f | 132 | uint8_t* Canvas::GetBitmap(void) |
karpent | 0:566855d63a2f | 133 | { |
karpent | 0:566855d63a2f | 134 | return _planeBitmap; |
karpent | 0:566855d63a2f | 135 | } |
karpent | 0:566855d63a2f | 136 | |
karpent | 0:566855d63a2f | 137 | |
karpent | 0:566855d63a2f | 138 | bool Canvas::IsSet() |
karpent | 0:566855d63a2f | 139 | { |
karpent | 0:566855d63a2f | 140 | return _planeBitmapSize != NULL; |
karpent | 0:566855d63a2f | 141 | } |
karpent | 2:02b7b78e8510 | 142 | |
karpent | 2:02b7b78e8510 | 143 | |
karpent | 3:1ddc4aa1e5cb | 144 | void Canvas::DrawChar(int posX, int posY, char ch) |
karpent | 3:1ddc4aa1e5cb | 145 | { |
karpent | 3:1ddc4aa1e5cb | 146 | if (ch < 32) |
karpent | 3:1ddc4aa1e5cb | 147 | return; |
karpent | 3:1ddc4aa1e5cb | 148 | |
karpent | 3:1ddc4aa1e5cb | 149 | const sFONT *font = _selectedFont.GetSystemFont(); |
karpent | 3:1ddc4aa1e5cb | 150 | const uint8_t rowLen = font->Width/8 + 1; |
karpent | 3:1ddc4aa1e5cb | 151 | const uint8_t *pByte = font->table + (ch-32) * font->Height * rowLen; |
karpent | 3:1ddc4aa1e5cb | 152 | |
karpent | 3:1ddc4aa1e5cb | 153 | for (int rowY = 0; rowY < font->Height; rowY++) { |
karpent | 3:1ddc4aa1e5cb | 154 | for (int bx = 0; bx < rowLen; bx++) { |
karpent | 3:1ddc4aa1e5cb | 155 | for (int shift = 0; shift < 8; shift++) { |
karpent | 3:1ddc4aa1e5cb | 156 | DrawPoint( |
karpent | 3:1ddc4aa1e5cb | 157 | posX + bx * 8 + shift, |
karpent | 3:1ddc4aa1e5cb | 158 | posY + rowY, |
karpent | 3:1ddc4aa1e5cb | 159 | *pByte & (0x80 >> shift) |
karpent | 3:1ddc4aa1e5cb | 160 | ); |
karpent | 3:1ddc4aa1e5cb | 161 | } |
karpent | 3:1ddc4aa1e5cb | 162 | |
karpent | 3:1ddc4aa1e5cb | 163 | // Get next byte |
karpent | 3:1ddc4aa1e5cb | 164 | pByte++; |
karpent | 3:1ddc4aa1e5cb | 165 | } |
karpent | 3:1ddc4aa1e5cb | 166 | } |
karpent | 3:1ddc4aa1e5cb | 167 | } |
karpent | 3:1ddc4aa1e5cb | 168 | |
karpent | 3:1ddc4aa1e5cb | 169 | |
karpent | 2:02b7b78e8510 | 170 | void Canvas::DrawText(int posX, int posY, char * str) |
karpent | 2:02b7b78e8510 | 171 | { |
karpent | 2:02b7b78e8510 | 172 | // Draw text horizontaly |
karpent | 2:02b7b78e8510 | 173 | int x = posX; |
karpent | 2:02b7b78e8510 | 174 | |
karpent | 3:1ddc4aa1e5cb | 175 | for (int i = 0; i < strlen(str); i++) { |
karpent | 3:1ddc4aa1e5cb | 176 | DrawChar(x, posY, str[i]); |
karpent | 3:1ddc4aa1e5cb | 177 | x += _selectedFont.GetSystemFont()->Width; |
karpent | 2:02b7b78e8510 | 178 | } |
karpent | 2:02b7b78e8510 | 179 | } |