Tiny graphics library for STM32F746G-DISCO board

Dependents:   RadarDemo 3DDemo RadarDemoT

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?

UserRevisionLine numberNew 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 }