Blackbox device type 'file' (SITL) considered working when file handler is available
[inav.git] / src / main / drivers / osd.c
blob54e9753a97ce538cdc48112b85edd010aa4405b1
1 /*
2 * This file is part of INAV.
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
6 * You can obtain one at http://mozilla.org/MPL/2.0/.
8 * Alternatively, the contents of this file may be used under the terms
9 * of the GNU General Public License Version 3, as described below:
11 * This file is free software: you may copy, redistribute and/or modify
12 * it under the terms of the GNU General Public License as published by the
13 * Free Software Foundation, either version 3 of the License, or (at your
14 * option) any later version.
16 * This file is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
19 * Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see http://www.gnu.org/licenses/.
26 #include "platform.h"
28 #if defined(USE_OSD)
30 #include "drivers/display_canvas.h"
31 #include "drivers/osd.h"
32 #include "drivers/osd_symbols.h"
34 uint16_t osdCharacterGridBuffer[OSD_CHARACTER_GRID_BUFFER_SIZE] ALIGNED(4);
36 void osdCharacterGridBufferClear(void)
38 uint32_t *ptr = (uint32_t *)osdCharacterGridBuffer;
39 uint32_t *end = (uint32_t *)(ARRAYEND(osdCharacterGridBuffer));
40 uint32_t blank32 = SYM_BLANK << 24 | SYM_BLANK << 16 | SYM_BLANK << 8 | SYM_BLANK;
41 for (; ptr < end; ptr++) {
42 *ptr = blank32;
46 static void osdGridBufferConstrainRect(int *x, int *y, int *w, int *h, int totalWidth, int totalHeight)
48 if (*w < 0) {
49 *x += *w;
50 *w = -*w;
52 if (*h < 0) {
53 *y += *h;
54 *h = -*h;
56 if (*x < 0) {
57 *w -= *x;
58 *x = 0;
60 if (*y < 0) {
61 *h += *y;
62 *y = 0;
64 int maxX = *x + *w;
65 int extraWidth = maxX - totalWidth + 1;
66 if (extraWidth > 0) {
67 *w -= extraWidth;
69 int maxY = *y + *h;
70 int extraHeight = maxY - totalHeight + 1;
71 if (extraHeight > 0) {
72 *h -= extraHeight;
76 void osdGridBufferClearGridRect(int x, int y, int w, int h)
78 osdGridBufferConstrainRect(&x, &y, &w, &h, OSD_CHARACTER_GRID_MAX_WIDTH, OSD_CHARACTER_GRID_MAX_HEIGHT);
79 int maxX = x + w;
80 int maxY = y + h;
81 for (int ii = x; ii <= maxX; ii++) {
82 for (int jj = y; jj <= maxY; jj++) {
83 *osdCharacterGridBufferGetEntryPtr(ii, jj) = SYM_BLANK;
88 void osdGridBufferClearPixelRect(displayCanvas_t *canvas, int x, int y, int w, int h)
90 // Ensure we clear all grid slots that overlap with this rect
91 if (w < 0) {
92 x += w;
93 w = -w;
95 if (h < 0) {
96 y += h;
97 h = -h;
99 int gx = x / canvas->gridElementWidth;
100 int gy = y / canvas->gridElementHeight;
101 int gw = (w + canvas->gridElementWidth - 1) / canvas->gridElementWidth;
102 int gh = (h + canvas->gridElementHeight - 1) / canvas->gridElementHeight;
103 osdGridBufferClearGridRect(gx, gy, gw, gh);
106 uint16_t *osdCharacterGridBufferGetEntryPtr(unsigned x, unsigned y)
108 unsigned pos = y * OSD_CHARACTER_GRID_MAX_WIDTH + x;
109 return &osdCharacterGridBuffer[pos];
112 #endif