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 // RK043FN48H.h - DISCO_F746NG display
karpent 0:566855d63a2f 3 //
karpent 0:566855d63a2f 4
karpent 0:566855d63a2f 5 #include "RK043FN48H.h"
karpent 0:566855d63a2f 6
karpent 0:566855d63a2f 7 static Layer _selectedLayer = Foreground;
karpent 0:566855d63a2f 8
karpent 0:566855d63a2f 9 RK043FN48H::RK043FN48H()
karpent 0:566855d63a2f 10 {
karpent 0:566855d63a2f 11 BSP_LCD_Init();
karpent 0:566855d63a2f 12
karpent 0:566855d63a2f 13 FbBackgroundStartAdress = LCD_FB_START_ADDRESS;
karpent 0:566855d63a2f 14 FbForegroundStartAdress = LCD_FB_START_ADDRESS+(BSP_LCD_GetXSize()*BSP_LCD_GetYSize()*4);
karpent 0:566855d63a2f 15
karpent 0:566855d63a2f 16 BSP_LCD_LayerDefaultInit(0, FbBackgroundStartAdress);
karpent 0:566855d63a2f 17 BSP_LCD_LayerDefaultInit(1, FbForegroundStartAdress);
karpent 0:566855d63a2f 18
karpent 0:566855d63a2f 19 BSP_LCD_DisplayOn();
karpent 0:566855d63a2f 20
karpent 0:566855d63a2f 21 actualDrawProp[0].TextColor = LCD_COLOR_WHITE;
karpent 0:566855d63a2f 22 actualDrawProp[0].BackColor = LCD_COLOR_BLACK;
karpent 0:566855d63a2f 23 actualDrawProp[0].pFont = &Font16; // &LCD_DEFAULT_FONT
karpent 2:02b7b78e8510 24 _selectedFont[0] = GrFont(Courier16);
karpent 0:566855d63a2f 25
karpent 2:02b7b78e8510 26 actualDrawProp[1].TextColor = LCD_COLOR_WHITE; // & ALPHA_MASK;
karpent 0:566855d63a2f 27 actualDrawProp[1].BackColor = LCD_COLOR_BLACK & ALPHA_MASK;
karpent 0:566855d63a2f 28 actualDrawProp[1].pFont = &Font16; // &LCD_DEFAULT_FONT
karpent 2:02b7b78e8510 29 _selectedFont[1] = GrFont(Courier16);
karpent 0:566855d63a2f 30
karpent 0:566855d63a2f 31 // Initialize layer 0 properties
karpent 0:566855d63a2f 32 SetActiveLayer(Background);
karpent 0:566855d63a2f 33 SetBackgroundColor(actualDrawProp[0].BackColor);
karpent 0:566855d63a2f 34 Clear();
karpent 0:566855d63a2f 35 SetForegroundColor(actualDrawProp[0].TextColor);
karpent 0:566855d63a2f 36 BSP_LCD_SetFont(&Font16);
karpent 0:566855d63a2f 37
karpent 0:566855d63a2f 38 // Initialize layer 1 properties
karpent 0:566855d63a2f 39 SetActiveLayer(Foreground);
karpent 0:566855d63a2f 40 SetBackgroundColor(actualDrawProp[1].BackColor);
karpent 0:566855d63a2f 41 Clear();
karpent 0:566855d63a2f 42 SetForegroundColor(actualDrawProp[1].TextColor);
karpent 0:566855d63a2f 43 BSP_LCD_SetFont(&Font16);
karpent 0:566855d63a2f 44
karpent 0:566855d63a2f 45 // Set layers transparency
karpent 0:566855d63a2f 46 SetLayersTransparency(0xFF, 0xFF);
karpent 0:566855d63a2f 47 SetLayersVisibility(true, true);
karpent 0:566855d63a2f 48
karpent 0:566855d63a2f 49 _cursorPos[Background].X = 0;
karpent 0:566855d63a2f 50 _cursorPos[Background].Y = 0;
karpent 0:566855d63a2f 51 _cursorPos[Foreground].X = 0;
karpent 0:566855d63a2f 52 _cursorPos[Foreground].Y = 0;
karpent 0:566855d63a2f 53 }
karpent 0:566855d63a2f 54
karpent 0:566855d63a2f 55
karpent 0:566855d63a2f 56 RK043FN48H::~RK043FN48H()
karpent 0:566855d63a2f 57 {
karpent 0:566855d63a2f 58 BSP_LCD_DeInit();
karpent 0:566855d63a2f 59 }
karpent 0:566855d63a2f 60
karpent 0:566855d63a2f 61
karpent 0:566855d63a2f 62 void RK043FN48H::Clear()
karpent 0:566855d63a2f 63 {
karpent 0:566855d63a2f 64 BSP_LCD_Clear(actualDrawProp[_selectedLayer].BackColor);
karpent 0:566855d63a2f 65 }
karpent 0:566855d63a2f 66
karpent 0:566855d63a2f 67
karpent 0:566855d63a2f 68 void RK043FN48H::Clear(uint32_t color)
karpent 0:566855d63a2f 69 {
karpent 0:566855d63a2f 70 BSP_LCD_Clear(color);
karpent 0:566855d63a2f 71 }
karpent 0:566855d63a2f 72
karpent 0:566855d63a2f 73
karpent 0:566855d63a2f 74 void RK043FN48H::ClearLayer(Layer layer, uint32_t color)
karpent 0:566855d63a2f 75 {
karpent 0:566855d63a2f 76 Layer oldLayer = GetActiveLayer();
karpent 0:566855d63a2f 77
karpent 0:566855d63a2f 78 SetActiveLayer(layer);
karpent 0:566855d63a2f 79 Clear(color);
karpent 0:566855d63a2f 80 SetActiveLayer(oldLayer);
karpent 0:566855d63a2f 81 }
karpent 0:566855d63a2f 82
karpent 0:566855d63a2f 83
karpent 0:566855d63a2f 84 void RK043FN48H::SetBackgroundColor(uint32_t color)
karpent 0:566855d63a2f 85 {
karpent 0:566855d63a2f 86 actualDrawProp[_selectedLayer].BackColor = color;
karpent 0:566855d63a2f 87 BSP_LCD_SetBackColor(actualDrawProp[_selectedLayer].BackColor);
karpent 0:566855d63a2f 88 }
karpent 0:566855d63a2f 89
karpent 0:566855d63a2f 90
karpent 0:566855d63a2f 91 void RK043FN48H::SetForegroundColor(uint32_t color)
karpent 0:566855d63a2f 92 {
karpent 0:566855d63a2f 93 actualDrawProp[_selectedLayer].TextColor = color;
karpent 0:566855d63a2f 94 BSP_LCD_SetTextColor(actualDrawProp[_selectedLayer].TextColor);
karpent 0:566855d63a2f 95 }
karpent 0:566855d63a2f 96
karpent 0:566855d63a2f 97
karpent 0:566855d63a2f 98 void RK043FN48H::SetDrawColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha)
karpent 0:566855d63a2f 99 {
karpent 0:566855d63a2f 100 // Calculate display pixel value for selected color
karpent 0:566855d63a2f 101 uint32_t color = red << 16 | green << 8 | blue | alpha << 24;
karpent 0:566855d63a2f 102 SetForegroundColor(color);
karpent 0:566855d63a2f 103 }
karpent 0:566855d63a2f 104
karpent 0:566855d63a2f 105 uint32_t RK043FN48H::GetDrawColor()
karpent 0:566855d63a2f 106 {
karpent 0:566855d63a2f 107 return actualDrawProp[_selectedLayer].TextColor;
karpent 0:566855d63a2f 108 }
karpent 0:566855d63a2f 109
karpent 2:02b7b78e8510 110 void RK043FN48H::SetClearColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha)
karpent 2:02b7b78e8510 111 {
karpent 2:02b7b78e8510 112 // Calculate display pixel value for selected color
karpent 2:02b7b78e8510 113 uint32_t color = red << 16 | green << 8 | blue | alpha << 24;
karpent 2:02b7b78e8510 114 SetBackgroundColor(color);
karpent 2:02b7b78e8510 115 }
karpent 2:02b7b78e8510 116
karpent 2:02b7b78e8510 117 uint32_t RK043FN48H::GetClearColor()
karpent 2:02b7b78e8510 118 {
karpent 2:02b7b78e8510 119 return actualDrawProp[_selectedLayer].BackColor;
karpent 2:02b7b78e8510 120 }
karpent 0:566855d63a2f 121
karpent 0:566855d63a2f 122 void RK043FN48H::DrawPoint(int posX, int posY, uint32_t colorMask)
karpent 0:566855d63a2f 123 {
karpent 0:566855d63a2f 124 if( posX >= 0 && posX < DisplayWidth() && posY >=0 && posY < DisplayHeight()) {
karpent 0:566855d63a2f 125 BSP_LCD_DrawPixel(posX, posY, colorMask);
karpent 0:566855d63a2f 126 }
karpent 0:566855d63a2f 127 }
karpent 0:566855d63a2f 128
karpent 0:566855d63a2f 129
karpent 0:566855d63a2f 130 //void RK043FN48H::DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
karpent 0:566855d63a2f 131 //{
karpent 0:566855d63a2f 132 // BSP_LCD_DrawLine(x1, y1, x2, y2);
karpent 0:566855d63a2f 133 //}
karpent 0:566855d63a2f 134
karpent 0:566855d63a2f 135
karpent 0:566855d63a2f 136 void RK043FN48H::CopyBitmap(Layer layer, uint8_t * bitmap, uint32_t width, uint32_t height, uint32_t rgbGolorCode)
karpent 0:566855d63a2f 137 {
karpent 0:566855d63a2f 138 // Check size
karpent 0:566855d63a2f 139 if(width > DisplayWidth() || height > DisplayHeight())
karpent 0:566855d63a2f 140 return;
karpent 0:566855d63a2f 141
karpent 0:566855d63a2f 142 ClearLayer(layer, 0x00000000);
karpent 0:566855d63a2f 143
karpent 0:566855d63a2f 144 uint16_t maxCol = width / 8; // 60 columns
karpent 0:566855d63a2f 145 if ((width % 8) != 0)
karpent 0:566855d63a2f 146 {
karpent 0:566855d63a2f 147 maxCol++;
karpent 0:566855d63a2f 148 }
karpent 0:566855d63a2f 149
karpent 0:566855d63a2f 150 for (int y = 0; y < height; y++) {
karpent 0:566855d63a2f 151 for (int col = 0; col < maxCol; col++) {
karpent 0:566855d63a2f 152 uint8_t shift = bitmap[y*maxCol + col];
karpent 0:566855d63a2f 153 for (int pos = 0; pos < 8; pos++) {
karpent 0:566855d63a2f 154 int x = (col << 3) + pos; // x = col * 8 + pos
karpent 0:566855d63a2f 155 if (x >= width)
karpent 0:566855d63a2f 156 break;
karpent 0:566855d63a2f 157
karpent 0:566855d63a2f 158 if(shift & 1 << pos)
karpent 0:566855d63a2f 159 {
karpent 0:566855d63a2f 160 DrawPoint(x, y, rgbGolorCode);
karpent 0:566855d63a2f 161 }
karpent 0:566855d63a2f 162 }
karpent 0:566855d63a2f 163 }
karpent 0:566855d63a2f 164 }
karpent 0:566855d63a2f 165 }
karpent 0:566855d63a2f 166
karpent 0:566855d63a2f 167
karpent 0:566855d63a2f 168 uint16_t RK043FN48H::DisplayWidth()
karpent 0:566855d63a2f 169 {
karpent 0:566855d63a2f 170 return BSP_LCD_GetXSize();
karpent 0:566855d63a2f 171 }
karpent 0:566855d63a2f 172
karpent 0:566855d63a2f 173
karpent 0:566855d63a2f 174 uint16_t RK043FN48H::DisplayHeight()
karpent 0:566855d63a2f 175 {
karpent 0:566855d63a2f 176 return BSP_LCD_GetYSize();
karpent 0:566855d63a2f 177 }
karpent 0:566855d63a2f 178
karpent 0:566855d63a2f 179
karpent 0:566855d63a2f 180 void RK043FN48H::SetActiveLayer(Layer layer)
karpent 0:566855d63a2f 181 {
karpent 0:566855d63a2f 182 _selectedLayer = layer;
karpent 0:566855d63a2f 183
karpent 0:566855d63a2f 184 BSP_LCD_SelectLayer((uint32_t)layer);
karpent 0:566855d63a2f 185 }
karpent 0:566855d63a2f 186
karpent 0:566855d63a2f 187
karpent 0:566855d63a2f 188 Layer RK043FN48H::GetActiveLayer()
karpent 0:566855d63a2f 189 {
karpent 0:566855d63a2f 190 return _selectedLayer;
karpent 0:566855d63a2f 191 }
karpent 0:566855d63a2f 192
karpent 0:566855d63a2f 193
karpent 0:566855d63a2f 194 void RK043FN48H::SetLayersTransparency( uint8_t background, uint8_t foreground)
karpent 0:566855d63a2f 195 {
karpent 0:566855d63a2f 196 BSP_LCD_SetTransparency(0, background);
karpent 0:566855d63a2f 197 BSP_LCD_SetTransparency(1, foreground);
karpent 0:566855d63a2f 198 }
karpent 0:566855d63a2f 199
karpent 0:566855d63a2f 200
karpent 0:566855d63a2f 201 void RK043FN48H::SetLayersVisibility( bool background, bool foreground)
karpent 0:566855d63a2f 202 {
karpent 0:566855d63a2f 203 BSP_LCD_SetLayerVisible(0, background ? ENABLE : DISABLE);
karpent 0:566855d63a2f 204 BSP_LCD_SetLayerVisible(1, foreground ? ENABLE : DISABLE);
karpent 0:566855d63a2f 205 }
karpent 0:566855d63a2f 206
karpent 0:566855d63a2f 207
karpent 2:02b7b78e8510 208 //==============================================================================
karpent 2:02b7b78e8510 209 //
karpent 2:02b7b78e8510 210 // Text output
karpent 2:02b7b78e8510 211 //
karpent 2:02b7b78e8510 212 //==============================================================================
karpent 0:566855d63a2f 213
karpent 2:02b7b78e8510 214 void RK043FN48H::GotoXY(int x, int y)
karpent 2:02b7b78e8510 215 {
karpent 2:02b7b78e8510 216 _cursorPos[_selectedLayer].X = x;
karpent 2:02b7b78e8510 217 _cursorPos[_selectedLayer].Y = y;
karpent 2:02b7b78e8510 218 }
karpent 2:02b7b78e8510 219
karpent 2:02b7b78e8510 220 void RK043FN48H::gotoNewLine(int width, int height)
karpent 2:02b7b78e8510 221 {
karpent 2:02b7b78e8510 222 GotoXY(0, _cursorPos[_selectedLayer].X + height >= DisplayHeight() ? 0 : _cursorPos[_selectedLayer].Y + height);
karpent 2:02b7b78e8510 223 }
karpent 2:02b7b78e8510 224
karpent 2:02b7b78e8510 225 void RK043FN48H::putch(char ch)
karpent 2:02b7b78e8510 226 {
karpent 2:02b7b78e8510 227 int fontHeight = _selectedFont[_selectedLayer].Height();
karpent 2:02b7b78e8510 228 int fontWidth = _selectedFont[_selectedLayer].Width();
karpent 2:02b7b78e8510 229
karpent 2:02b7b78e8510 230 if(ch == 0x0A) // '/r'
karpent 2:02b7b78e8510 231 return;
karpent 2:02b7b78e8510 232
karpent 2:02b7b78e8510 233 if(ch == 0x0D) { // '/n'
karpent 2:02b7b78e8510 234 gotoNewLine(fontWidth, fontHeight);
karpent 2:02b7b78e8510 235 return;
karpent 2:02b7b78e8510 236 }
karpent 2:02b7b78e8510 237
karpent 2:02b7b78e8510 238 // Check that the character will fit on the screen
karpent 2:02b7b78e8510 239 if(_cursorPos[_selectedLayer].X + fontWidth >= DisplayWidth())
karpent 2:02b7b78e8510 240 {
karpent 2:02b7b78e8510 241 gotoNewLine(fontWidth, fontHeight);
karpent 2:02b7b78e8510 242 }
karpent 2:02b7b78e8510 243
karpent 2:02b7b78e8510 244 BSP_LCD_DisplayChar(_cursorPos[_selectedLayer].X, _cursorPos[_selectedLayer].Y, ch);
karpent 2:02b7b78e8510 245 GotoXY(_cursorPos[_selectedLayer].X + fontWidth, _cursorPos[_selectedLayer].Y);
karpent 2:02b7b78e8510 246 }
karpent 2:02b7b78e8510 247
karpent 2:02b7b78e8510 248
karpent 2:02b7b78e8510 249 void RK043FN48H::puts(const char * str)
karpent 2:02b7b78e8510 250 {
karpent 2:02b7b78e8510 251 for(int i=0; i < strlen(str); i++)
karpent 2:02b7b78e8510 252 putch(*(str+i));
karpent 2:02b7b78e8510 253 }
karpent 2:02b7b78e8510 254
karpent 2:02b7b78e8510 255
karpent 2:02b7b78e8510 256 void RK043FN48H::DrawText(int posX, int posY, char * str)
karpent 2:02b7b78e8510 257 {
karpent 2:02b7b78e8510 258 // Draw text horizontaly
karpent 2:02b7b78e8510 259 int fontWidth = _selectedFont[_selectedLayer].Width();
karpent 2:02b7b78e8510 260 int x = posX;
karpent 2:02b7b78e8510 261
karpent 2:02b7b78e8510 262 for(int i=0; i < strlen(str); i++)
karpent 2:02b7b78e8510 263 {
karpent 2:02b7b78e8510 264 BSP_LCD_DisplayChar(x, posY, str[i]);
karpent 2:02b7b78e8510 265 x += fontWidth;
karpent 2:02b7b78e8510 266 }
karpent 2:02b7b78e8510 267 }
karpent 2:02b7b78e8510 268
karpent 2:02b7b78e8510 269
karpent 2:02b7b78e8510 270