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/.
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
++) {
46 static void osdGridBufferConstrainRect(int *x
, int *y
, int *w
, int *h
, int totalWidth
, int totalHeight
)
65 int extraWidth
= maxX
- totalWidth
+ 1;
70 int extraHeight
= maxY
- totalHeight
+ 1;
71 if (extraHeight
> 0) {
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
);
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
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
];