embox

Форк
0
/
fb_overlay.c 
74 строки · 1.7 Кб
1
/**
2
 * @file text_overlay.c
3
 * @brief Some functions to put text to frame
4
 * @author Denis Deryugin <deryugin.denis@gmail.com>
5
 * @version
6
 * @date 14.12.2017
7
 */
8

9
#include <string.h>
10

11
#include <drivers/video/fb.h>
12
#include <drivers/video/font.h>
13

14
static struct fb_info *text_fb = 0;
15
static void *overlay_sw_base = 0;
16
struct font_desc const *font = &font_vga_8x16;
17

18
#define CHAR_WIDTH  8
19
#define CHAR_HEIGHT 16
20

21
void fb_overlay_init(struct fb_info *fbi, void *base) {
22
	text_fb = fbi;
23
	overlay_sw_base = base;
24
}
25

26
/**
27
 * @brief Print character to framebuffer (x, y), where coords are used as
28
 *        symbol coordinates, not pixels
29
 */
30
void fb_overlay_put_char(int x, int y, char ch) {
31
	char const *data;
32
	uint8_t *dest;
33

34
	int bytes_per_pixel = text_fb->var.bits_per_pixel / 8;
35

36
	data = font->data + (unsigned char)ch * CHAR_HEIGHT * CHAR_WIDTH / 8;
37

38
	dest = overlay_sw_base + bytes_per_pixel * x * CHAR_WIDTH +
39
		bytes_per_pixel * y * CHAR_HEIGHT * text_fb->var.xres;
40

41
	for (int i = 0; i < CHAR_HEIGHT; i++) {
42
		for (int j = 0; j < CHAR_WIDTH; j++) {
43
 			if ((*data) & (1 << (CHAR_WIDTH - j  - 1)))
44
				memset(dest, 0xFF, bytes_per_pixel);
45
			else
46
				memset(dest, 0x00, bytes_per_pixel);
47
			dest += bytes_per_pixel;
48
		}
49
		data++;
50
		dest -= CHAR_WIDTH * bytes_per_pixel;
51
		dest += text_fb->var.xres * bytes_per_pixel;
52
	}
53
}
54

55
/**
56
 * @brief Print message to fb starting at (x, y), coords are passed as
57
 *        symbol numbers, not pixels
58
 */
59
void fb_overlay_put_string(int x, int y, char *str) {
60
	while (*str) {
61
		fb_overlay_put_char(x++, y, *str);
62
		str++;
63
	}
64
}
65

66
/**
67
 * @brief Same as fb_overlay_put_string(), but stops on '\n'
68
 */
69
void fb_overlay_put_line(int x, int y, char *str) {
70
	while (*str && *str != '\n') {
71
		fb_overlay_put_char(x++, y, *str);
72
		str++;
73
	}
74
}
75

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.