14#pragma GCC diagnostic push
15#pragma GCC diagnostic ignored "-Wunknown-warning-option"
19#define SSFN_memcmp memcmp
21#define SSFN_memset ssfn_memset
23 unsigned char* p = (
unsigned char*)__s;
25 *p++ = (
unsigned char)__c;
29#define SSFN_memcpy ssfn_memcpy
31 const void* __restrict__ __src,
size_t __n) {
32 unsigned char* d = (
unsigned char*)__dest;
33 const unsigned char* s = (
const unsigned char*)__src;
55 size_t old_size = meta->
size;
56 void* new_ptr =
kalloc(new_size);
60 size_t copy = old_size < new_size ? old_size : new_size;
72#define SSFN_realloc ssfn_realloc
73#define SSFN_free ssfn_free_
75#define SSFN_IMPLEMENTATION
79#pragma GCC diagnostic pop
88 g__fb = &ctx->framebuffer;
91 if (
g__fb->framebuffer_addr == 0)
96 if (
resolve_dentry(
"/init/fonts/unifont.sfn", 0, &font_dentry, 0) ==
103 ->read(font_dentry->
vnode, font_buff,
106 LOG2_WARN(
"Graphic",
"failed to load font");
109 for (
uint64_t i = 0; i < ctx->memory.memory_entries; i++) {
110 memory_entry_t* entry = &ctx->memory.memory_map[i];
113 0xFFFFFA0000000000, entry->base,
117 g__fb->framebuffer_addr = 0xFFFFFA0000000000;
139 LOG2_WARN(
"Graphic",
"ssfn_load failed: %d", r);
155 dst.fg = fg | 0xFF000000;
156 dst.bg = bg | 0xFF000000;
160 char str[2] = {c,
'\0'};
170 dst.fg = fg | 0xFF000000;
171 dst.bg = bg | 0xFF000000;
183 if ((c & 0xE0) == 0xC0)
185 if ((c & 0xF0) == 0xE0)
187 if ((c & 0xF8) == 0xF0)
194 y *
g__fb->framebuffer_pitch +
x * 4);
195 pixel->
r = color & 0xFF;
196 pixel->
g = (color >> 8) & 0xFF;
197 pixel->
b = (color >> 16) & 0xFF;
198 pixel->
a = (color >> 24) & 0xFF;
203 return ((src *
a) + (d * (255 -
a)) + 128) >> 8;
210 y >=
g__fb->framebuffer_height)
218 g__fb->framebuffer_addr,
y *
g__fb->framebuffer_pitch +
x * 4);
223 (src.
r * ((1 <<
g__fb->red_mask_size) - 1)) / 255;
225 (src.
g * ((1 <<
g__fb->green_mask_size) - 1)) / 255;
227 (src.
b * ((1 <<
g__fb->blue_mask_size) - 1)) / 255;
229 *dst_ptr = (r_val <<
g__fb->red_mask_shift) |
230 (g_val <<
g__fb->green_mask_shift) |
231 (b_val <<
g__fb->blue_mask_shift);
239 uint8_t dst_b = dst_color & 0xFF;
240 uint8_t dst_g = (dst_color >> 8) & 0xFF;
241 uint8_t dst_r = (dst_color >> 16) & 0xFF;
250 uint32_t r_val = (r * ((1 <<
g__fb->red_mask_size) - 1)) / 255;
251 uint32_t g_val = (g * ((1 <<
g__fb->green_mask_size) - 1)) / 255;
252 uint32_t b_val = (b * ((1 <<
g__fb->blue_mask_size) - 1)) / 255;
254 *dst_ptr = (r_val <<
g__fb->red_mask_shift) |
255 (g_val <<
g__fb->green_mask_shift) |
256 (b_val <<
g__fb->blue_mask_shift);
261 y >=
g__fb->framebuffer_height)
269 y *
g__fb->framebuffer_pitch +
x * 4));
272 *dst_ptr = (
uint32_t)((src.
r << 16) | (src.
g << 8) | src.
b);
281 (((src.
r * src.
a) + ((dst_color >> 16) & 0xFF) * inv_a) & 0xFF00)
283 (((src.
b * src.
a) + (dst_color & 0xFF) * inv_a) >> 8);
285 ((src.
g * src.
a) + (((dst_color >> 8) & 0xFF) * inv_a)) & 0xFF00;
292 g__fb->framebuffer_pitch *
g__fb->framebuffer_height);
296 int line_height = 15;
297 int scroll_amount = lines * line_height;
301 (
void*)(
g__fb->framebuffer_addr +
303 (
size_t)((
g__fb->framebuffer_height - lines) *
304 g__fb->framebuffer_pitch));
307 for (
int y =
g__fb->framebuffer_height - scroll_amount;
309 for (
int x = 0;
x <
g__fb->framebuffer_width;
x++) {
341 if (!
dst.ptr)
return;
343 for (
int row =
y; row <
y +
h; row++) {
345 + row *
g__fb->framebuffer_pitch);
346 for (
int col =
x; col <
x + w; col++) {
struct dentry * dentry_ptr
int resolve_dentry(char *path, dentry_ptr parent, dentry_ptr *out, uint8_t flag)
Resolves a path to a directory entry (dentry) with configurable start point and strictness.
static __inline__ uint8_t blend(uint8_t src, uint8_t d, uint8_t a)
void put_pixel_alpha(int x, int y, pixel_t src)
uint32_t screen_cols(void)
void fill_rect(int x, int y, int w, int h, uint32_t color)
int utf8_char_len(uint8_t c)
uint32_t screen_rows(void)
static void * ssfn_memset(void *__s, int __c, size_t __n)
static boolean_t ssfn_ready
void put_pixel(int x, int y, uint32_t color)
volatile framebuffer_t * g__fb
uint32_t vxGetWidth(void)
static void ssfn_free_(void *ptr)
static void * ssfn_realloc(void *ptr, size_t new_size)
static void * ssfn_memcpy(void *__restrict__ __dest, const void *__restrict__ __src, size_t __n)
uint32_t vxGetHeight(void)
void putc(char c, int col, int row, uint32_t fg, uint32_t bg)
void clear_screen(uint32_t color)
void putc_utf8(const char *s, int col, int row, uint32_t fg, uint32_t bg)
void put_pixel_alpha_fast(int x, int y, pixel_t src)
void serial2_printf(const char *fmt,...)
void * kalloc(size_t size)
#define KALLOC_REDZONE_SIZE
#define PTR_ADD(ptr, off)
page_t paging_get_highest_page_map(void)
void vxMultipleMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t size, uint64_t flags)
#define LOG2_WARN(mod, fmt,...)
#define LOG2_DEBUG(mod, fmt,...)
int ssfn_select(ssfn_t *ctx, int family, const char *name, int style, int size)
int ssfn_render(ssfn_t *ctx, ssfn_buf_t *dst, const char *str)
int ssfn_load(ssfn_t *ctx, const void *data)
#define SSFN_STYLE_REGULAR
void memset(void *ptr, int value, size_t num)
void memcopy(void *dest, void *src, size_t size)
kstring str(const char *str)
void vma_register(struct virtual_memory_page *page, uintptr_t phys_address, uintptr_t virt_addr, size_t size)
struct virtual_memory_page * get_kernel_vmm_page()