2023-02-05 01:02:48 +08:00

61 lines
2.1 KiB
C

#include <stdint.h>
#include "ui_utils.h"
#include "st7735.h"
#include "bmfont.h"
#include "asciifont.h"
#define MAX_LINES 16
#define TITLE_COLOR_BG ST7735_COLOR565(0x20, 0x20, 0x20)
const StrItem NULL_STR_ITEM = { NULL, 0 };
void uiu_text_area(bmf_BitmapFont *font, const uint8_t *text, uint32_t len, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t align, uint16_t color, uint16_t bg_color) {
// calc line width
uint16_t lws[MAX_LINES];
uint16_t gws[MAX_LINES];
uint16_t max_width = 0;
uint8_t lines = 0;
uint16_t p_off = 0;
while ((p_off < len) && ((lines + 1) * font->char_height <= h) && (lines < MAX_LINES)) {
uint16_t fitlen = bmf_get_text_offset(font, text + p_off, len - p_off, w, font->char_height);
if (fitlen == 0) {
break;
}
lws[lines] = fitlen;
gws[lines] = bmf_get_text_width(font, text + p_off, fitlen);
max_width = (gws[lines] > max_width) ? gws[lines] : max_width;
lines ++;
p_off += fitlen;
}
// draw lines
uint16_t off_x = 0;
uint16_t off_y = 0;
if (align & uiu_ALIGN_VBOTTOM) {
off_y = y + (h - (lines * font->char_height));
}else if (align & uiu_ALIGN_VCENTER) {
off_y = y + ((h - (lines * font->char_height)) / 2);
}else {
off_y = y;
}
uint8_t cur_lines;
p_off = 0;
ST7735_FillRectangle(x, y, w, h, bg_color);
for (cur_lines = 0; cur_lines < lines; cur_lines ++) {
if (align & uiu_ALIGN_HRIGHT) {
off_x = x + (w - gws[cur_lines]);
} else if (align & uiu_ALIGN_HCENTER) {
off_x = x + ((w - gws[cur_lines]) / 2);
} else {
off_x = x;
}
bmf_draw_text(font, text + p_off, lws[cur_lines], off_x, off_y, gws[cur_lines], font->char_height, color);
off_y += font->char_height;
p_off += lws[cur_lines];
}
}
void uiu_title(const uint8_t *text, uint32_t len) {
ST7735_FillRectangle(0, 0, ST7735_WIDTH, 16, TITLE_COLOR_BG);
uiu_text_area(font_unifont_8x16, text, len, 0, 0, ST7735_WIDTH, 16, uiu_ALIGN_HCENTER | uiu_ALIGN_VCENTER, ST7735_YELLOW, TITLE_COLOR_BG);
}