[feat] 低质量ttf render

This commit is contained in:
2026-06-06 09:00:56 +08:00
Unverified
parent 3d47667c2f
commit 500d302ea9
15 changed files with 914 additions and 17 deletions
+3 -3
View File
@@ -303,12 +303,12 @@ void layer_compositor_task(void) {
}
// Blit to screen
g_gfx.GOP->Blt(
uefi_call_wrapper(g_gfx.GOP->Blt, 10,
g_gfx.GOP,
g_back_buffer,
EfiBltBufferToVideo,
0, 0, 0, 0,
hr, vr, 0
(UINTN)0, (UINTN)0, (UINTN)0, (UINTN)0,
(UINTN)hr, (UINTN)vr, (UINTN)0
);
yield();
+40
View File
@@ -3,6 +3,7 @@
#include <graphics/draw.h>
#include <graphics/layer.h>
#include <fonts/pixel_font.h>
#include <fonts/ttf.h>
#include <serial.h>
#include <common.h>
#include <string_utils.h>
@@ -206,6 +207,7 @@ extern "C" void kernel_main() {
serial_write("Sylva: fs_read FAILED: ");
serial_write_hex(rd_st);
serial_write("\n");
serial_write("Test done.\n\n");
} else {
UINT64 ticks = t1 - t0;
UINT64 ms = ticks * (1000 / PIT_TICK_HZ);
@@ -217,6 +219,44 @@ extern "C" void kernel_main() {
serial_write(" ms (");
serial_write_hex(kbps);
serial_write(" KiB/s)\n");
// --- TTF demo ---
serial_write("Sylva: ttf_open...\n");
ttf_face_t* face = ttf_open(ttf_buf, ttf_size);
if (!face) {
serial_write("Sylva: ttf_open FAILED\n");
} else {
serial_write("Sylva: ttf_open OK\n");
// Create an overlay layer for TTF output (sits above the two demo windows)
const UINT32 TL_W = 500, TL_H = 200;
layer_t* text_layer = layer_create("ttf_text", LAYER_TYPE_WINDOW, TL_W, TL_H);
if (text_layer) {
layer_set_z(text_layer, 3);
layer_set_pos(text_layer, 100, 300);
EFI_GRAPHICS_OUTPUT_BLT_PIXEL clear = {0, 0, 0, 0};
draw_set_target(text_layer->buffer, TL_W, TL_H);
draw_rect(0, 0, TL_W - 1, TL_H - 1, clear);
// Render at 4 sizes + mixed CJK
EFI_GRAPHICS_OUTPUT_BLT_PIXEL white = {255, 255, 255, 0};
EFI_GRAPHICS_OUTPUT_BLT_PIXEL yellow = {255, 240, 80, 0};
EFI_GRAPHICS_OUTPUT_BLT_PIXEL cyan = {80, 220, 255, 0};
EFI_GRAPHICS_OUTPUT_BLT_PIXEL pink = {255, 160, 200, 0};
UINT32 ttf_t0 = pit_get_ticks();
ttf_draw_text(face, "Hello, Sylva OS!",
40, 60, 24, white);
ttf_draw_text(face, "欢迎来到Sylva系统!",
40, 110, 32, yellow);
UINT32 ttf_t1 = pit_get_ticks();
draw_set_default_target();
serial_write("Sylva: ttf render in ");
serial_write_hex((UINT64)((ttf_t1 - ttf_t0) * (1000 / PIT_TICK_HZ)));
serial_write(" ms\n");
}
ttf_close(face);
}
kfree(ttf_buf);
}
serial_write("Test done.\n\n");
+1 -6
View File
@@ -32,7 +32,7 @@ void serial_write(String str) {
}
}
void serial_write_hex(UINTN val, bool fill) {
void serial_write_hex(UINTN val) {
char buf[19];
buf[0] = '0';
buf[1] = 'x';
@@ -47,11 +47,6 @@ void serial_write_hex(UINTN val, bool fill) {
tmp[len++] = digit < 10 ? '0' + digit : 'A' + digit - 10;
val >>= 4;
}
if (fill) {
while (len < 16) {
buf[pos++] = '0';
}
}
for (SSINT32 i = len - 1; i >= 0; i--) {
buf[pos++] = tmp[i];
}