123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #include "textui.h"
- #include <driver/uart/uart.h>
- #define WHITE 0x00ffffff
- #define BLACK 0x00000000
- #define RED 0x00ff0000
- #define ORANGE 0x00ff8000
- #define YELLOW 0x00ffff00
- #define GREEN 0x0000ff00
- #define BLUE 0x000000ff
- #define INDIGO 0x0000ffff
- #define PURPLE 0x008000ff
- #define calculate_color(r, g, b) ((((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)) & 0x00ffffff)
- extern struct scm_ui_framework_t textui_framework;
- static void __textui_render_chromatic(uint16_t actual_line, uint16_t index, struct textui_char_chromatic_t *character);
- int textui_refresh_vline(struct textui_window_t *window, uint16_t vline_id)
- {
- if (textui_is_chromatic(window->flags))
- return textui_refresh_characters(window, vline_id, 0, window->chars_per_line);
- else
- return textui_refresh_characters(window, vline_id, 0, window->chars_per_line);
- }
- int textui_refresh_vlines(struct textui_window_t *window, uint16_t start, uint16_t count)
- {
- char bufff[16] = {0};
-
- for (int i = start; i < window->vlines_num && count > 0; ++i, --count)
- {
-
-
- textui_refresh_vline(window, i);
- }
- start = 0;
- while (count > 0)
- {
-
-
-
-
- textui_refresh_vline(window, start);
- ++start;
- --count;
- }
-
- return 0;
- }
- int textui_refresh_characters(struct textui_window_t *window, uint16_t vline_id, uint16_t start, uint16_t count)
- {
- if (window->id != __textui_get_current_window_id())
- return 0;
-
- if (unlikely(vline_id >= window->vlines_num && (start + count) > window->chars_per_line))
- return -EINVAL;
-
- int actual_line_id = (int)vline_id - window->top_vline;
- if (actual_line_id < 0)
- actual_line_id += __textui_get_actual_lines();
-
- if (unlikely(actual_line_id < 0 || actual_line_id >= __textui_get_actual_lines()))
- return 0;
-
- if (textui_is_chromatic(window->flags))
- {
- struct textui_vline_chromatic_t *vline = &(window->vlines.chromatic)[vline_id];
- for (int i = 0; i < count; ++i)
- {
- __textui_render_chromatic(actual_line_id, start + i, &vline->chars[start + i]);
- }
- }
- return 0;
- }
- static void __textui_render_chromatic(uint16_t actual_line, uint16_t index, struct textui_char_chromatic_t *character)
- {
-
- unsigned char *font_ptr = font_ascii[(uint8_t)character->c];
- unsigned int *addr;
- uint32_t *fb = (uint32_t *)textui_framework.buf->vaddr;
- uint32_t FRcolor = character->FRcolor & 0x00ffffff;
- uint32_t BKcolor = character->BKcolor & 0x00ffffff;
- uint32_t x = index * TEXTUI_CHAR_WIDTH;
- uint32_t y = actual_line * TEXTUI_CHAR_HEIGHT;
- int testbit;
- for (int i = 0; i < TEXTUI_CHAR_HEIGHT; ++i)
- {
-
- addr = (uint32_t *)(fb + textui_framework.buf->width * (y + i) + x);
- testbit = (1 << (TEXTUI_CHAR_WIDTH + 1));
- for (int j = 0; j < TEXTUI_CHAR_WIDTH; ++j)
- {
-
- testbit >>= 1;
- if (*font_ptr & testbit)
- *addr = FRcolor;
- else
- *addr = BKcolor;
- ++addr;
- }
- ++font_ptr;
- }
- }
|