From 9a34ba2e4445278e10ee1d0887437764c2a62699 Mon Sep 17 00:00:00 2001 From: "K. Lange" Date: Tue, 6 Jul 2021 12:46:31 +0900 Subject: [PATCH] text: shadowed text, port file-browser --- apps/file-browser.c | 61 ++++++++++++++++++++++------------- base/usr/include/toaru/text.h | 1 + lib/text.c | 14 ++++++++ 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/apps/file-browser.c b/apps/file-browser.c index d3df6854..0daafe46 100644 --- a/apps/file-browser.c +++ b/apps/file-browser.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #define APPLICATION_TITLE "File Browser" @@ -75,6 +75,8 @@ static struct File ** file_pointers = NULL; /* List of file pointers */ static ssize_t file_pointers_len = 0; /* How many files are in the current list */ static uint64_t last_click = 0; /* For double click */ static int last_click_offset = -1; /* So that clicking two different things quickly doesn't count as a double click */ +static struct TT_Font * tt_font_thin = NULL; +static struct TT_Font * tt_font_bold = NULL; /** * Navigation input box @@ -199,12 +201,13 @@ static int print_human_readable_size(char * _out, uint64_t s) { /** * Clip text and add ellipsis to fit a specified display width. */ -static char * ellipsify(char * input, int font_size, int font, int max_width, int * out_width) { +static char * ellipsify(char * input, int font_size, struct TT_Font * font, int max_width, int * out_width) { int len = strlen(input); char * out = malloc(len + 4); memcpy(out, input, len + 1); int width; - while ((width = draw_sdf_string_width(out, font_size, font)) > max_width) { + tt_set_size(font, font_size); + while ((width = tt_string_width(font, out)) > max_width) { len--; out[len+0] = '.'; out[len+1] = '.'; @@ -234,7 +237,7 @@ static void draw_file(struct File * f, int offset) { /* If the display name is too long to fit, cut it with an ellipsis. */ int name_width; - char * name = ellipsify(f->name, 16, SDF_FONT_THIN, FILE_WIDTH - 8, &name_width); + char * name = ellipsify(f->name, 13, tt_font_thin, FILE_WIDTH - 8, &name_width); /* Draw the icon */ int center_x_icon = (FILE_WIDTH - icon->width) / 2; @@ -248,15 +251,16 @@ static void draw_file(struct File * f, int offset) { } /* And draw the name with a blue background and white text */ draw_rounded_rectangle(contents, center_x_text + x - 2, y + 54, name_width + 6, 20, 3, rgb(72,167,255)); - draw_sdf_string(contents, center_x_text + x, y + 54, name, 16, rgb(255,255,255), SDF_FONT_THIN); + tt_set_size(tt_font_thin, 13); + tt_draw_string(contents, tt_font_thin, center_x_text + x, y + 54 + 13, name, rgb(255,255,255)); } else { if (is_desktop_background) { /* If this is the desktop view, white text with a drop shadow */ - draw_sdf_string_stroke(contents, center_x_text + x + 1, y + 55, name, 16, rgba(0,0,0,120), SDF_FONT_THIN, 1.7, 0.5); - draw_sdf_string(contents, center_x_text + x, y + 54, name, 16, rgb(255,255,255), SDF_FONT_THIN); + tt_draw_string_shadow(contents, tt_font_thin, name, 13, center_x_text + x, y + 54, rgba(0,0,0,0), rgb(0,0,0), 4); + tt_draw_string_shadow(contents, tt_font_thin, name, 13, center_x_text + x, y + 54, rgb(255,255,255), rgb(0,0,0), 4); } else { /* Otherwise, black text */ - draw_sdf_string(contents, center_x_text + x, y + 54, name, 16, rgb(0,0,0), SDF_FONT_THIN); + tt_draw_string(contents, tt_font_thin, center_x_text + x, y + 54 + 13, name, rgb(0,0,0)); } } @@ -293,12 +297,14 @@ static void draw_file(struct File * f, int offset) { draw_sprite_alpha_paint(contents, icon, x + 11, y + 11, 0.3, rgb(255,255,255)); } - char * name = ellipsify(f->name, 16, SDF_FONT_BOLD, FILE_WIDTH - 81, NULL); - char * type = ellipsify(f->filetype, 16, SDF_FONT_THIN, FILE_WIDTH - 81, NULL); + char * name = ellipsify(f->name, 13, tt_font_bold, FILE_WIDTH - 81, NULL); + char * type = ellipsify(f->filetype, 13, tt_font_thin, FILE_WIDTH - 81, NULL); if (f->type == 0) { - draw_sdf_string(contents, x + 70, y + 8, name, 16, text_color, SDF_FONT_BOLD); - draw_sdf_string(contents, x + 70, y + 25, type, 16, text_color, SDF_FONT_THIN); + tt_set_size(tt_font_bold, 13); + tt_draw_string(contents, tt_font_bold, x + 70, y + 8 + 13, name, text_color); + tt_set_size(tt_font_thin, 13); + tt_draw_string(contents, tt_font_thin, x + 70, y + 25 + 13, type, text_color); char line_three[48] = {0}; if (*f->link) { @@ -306,10 +312,12 @@ static void draw_file(struct File * f, int offset) { } else { print_human_readable_size(line_three, f->size); } - draw_sdf_string(contents, x + 70, y + 42, line_three, 16, text_color, SDF_FONT_THIN); + tt_draw_string(contents, tt_font_thin, x + 70, y + 42 + 13, line_three, text_color); } else { - draw_sdf_string(contents, x + 70, y + 15, name, 16, text_color, SDF_FONT_BOLD); - draw_sdf_string(contents, x + 70, y + 32, type, 16, text_color, SDF_FONT_THIN); + tt_set_size(tt_font_bold, 13); + tt_draw_string(contents, tt_font_bold, x + 70, y + 15 + 13, name, text_color); + tt_set_size(tt_font_thin, 13); + tt_draw_string(contents, tt_font_thin, x + 70, y + 32 + 13, type, text_color); } free(name); @@ -336,9 +344,10 @@ static void draw_file(struct File * f, int offset) { draw_sprite(contents, icon, x + 4, y + 4); } - char * name = ellipsify(f->name, 16, SDF_FONT_THIN, FILE_WIDTH - 26, NULL); + char * name = ellipsify(f->name, 13, tt_font_thin, FILE_WIDTH - 26, NULL); - draw_sdf_string(contents, x + 24, y + 2, name, 16, text_color, SDF_FONT_THIN); + tt_set_size(tt_font_thin, 13); + tt_draw_string(contents, tt_font_thin, x + 24, y + 15, name, text_color); free(name); @@ -835,7 +844,8 @@ static void _figure_out_navbar_cursor(int x, struct decor_bounds bounds) { char * tmp = strdup(nav_bar); int candidate = 0; - while (*tmp && x + 2 < (candidate = draw_sdf_string_width(tmp, 16, SDF_FONT_THIN))) { + tt_set_size(tt_font_thin, 13); + while (*tmp && x + 2 < (candidate = tt_string_width(tt_font_thin, tmp))) { tmp[strlen(tmp)-1] = '\0'; } nav_bar_cursor_x = candidate + 2; @@ -858,7 +868,8 @@ static void _recalculate_nav_bar_cursor(void) { } char * tmp = strdup(nav_bar); tmp[nav_bar_cursor] = '\0'; - nav_bar_cursor_x = draw_sdf_string_width(tmp, 16, SDF_FONT_THIN) + 2; + tt_set_size(tt_font_thin, 13); + nav_bar_cursor_x = tt_string_width(tt_font_thin, tmp) + 2; free(tmp); } @@ -891,8 +902,8 @@ static void _draw_nav_bar(struct decor_bounds bounds) { /* Draw the nav bar text, ellipsified if needed */ int max_width = main_window->width - bounds.width - x - 12; - char * name = ellipsify(nav_bar, 16, SDF_FONT_THIN, max_width, NULL); - draw_sdf_string(ctx, bounds.left_width + 2 + x + 5, bounds.top_height + MENU_BAR_HEIGHT + 8, name, 16, rgb(0,0,0), SDF_FONT_THIN); + char * name = ellipsify(nav_bar, 13, tt_font_thin, max_width, NULL); + tt_draw_string(ctx, tt_font_thin, bounds.left_width + 2 + x + 5, bounds.top_height + MENU_BAR_HEIGHT + 8 + 13, name, rgb(0,0,0)); free(name); if (nav_bar_focused) { @@ -930,10 +941,11 @@ static void _draw_status(struct decor_bounds bounds) { gfx_context_t * _tmp = init_graphics_sprite(_tmp_s); draw_fill(_tmp, rgba(0,0,0,0)); - draw_sdf_string(_tmp, 1, 1, window_status, 16, rgb(0,0,0), SDF_FONT_THIN); + tt_set_size(tt_font_thin, 13); + tt_draw_string(_tmp, tt_font_thin, 1, 14, window_status, rgb(0,0,0)); blur_context_box(_tmp, 4); - draw_sdf_string(_tmp, 0, 0, window_status, 16, rgb(255,255,255), SDF_FONT_THIN); + tt_draw_string(_tmp, tt_font_thin, 0, 13, window_status, rgb(255,255,255)); free(_tmp); draw_sprite(ctx, _tmp_s, bounds.left_width + 4, ctx->height - bounds.bottom_height - STATUS_HEIGHT + 3); @@ -1715,6 +1727,9 @@ int main(int argc, char * argv[]) { yctx = yutani_init(); init_decorations(); + tt_font_thin = tt_font_from_file("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"); + tt_font_bold = tt_font_from_file("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"); + int arg_ind = 1; if (argc > 1 && !strcmp(argv[1], "--wallpaper")) { diff --git a/base/usr/include/toaru/text.h b/base/usr/include/toaru/text.h index 53ad4dba..991a1eed 100644 --- a/base/usr/include/toaru/text.h +++ b/base/usr/include/toaru/text.h @@ -9,3 +9,4 @@ extern void tt_set_size(struct TT_Font * font, int size); extern int tt_xadvance_for_glyph(struct TT_Font * font, unsigned int ind); extern int tt_string_width(struct TT_Font * font, const char * s); extern int tt_draw_string(gfx_context_t * ctx, struct TT_Font * font, int x, int y, const char * s, uint32_t color); +extern void tt_draw_string_shadow(gfx_context_t * ctx, struct TT_Font * font, char * string, int font_size, int left, int top, uint32_t text_color, uint32_t shadow_color, int blur); diff --git a/lib/text.c b/lib/text.c index adb89254..cef44ee1 100644 --- a/lib/text.c +++ b/lib/text.c @@ -752,3 +752,17 @@ struct TT_Font * tt_font_from_file_mem(const char * fileName) { return tt_font_from_memory(buf); } + +void tt_draw_string_shadow(gfx_context_t * ctx, struct TT_Font * font, char * string, int font_size, int left, int top, uint32_t text_color, uint32_t shadow_color, int blur) { + tt_set_size(font, font_size); + int w = tt_string_width(font, string); + sprite_t * _tmp_s = create_sprite(w + blur * 2, font_size + blur * 2, ALPHA_EMBEDDED); + gfx_context_t * _tmp = init_graphics_sprite(_tmp_s); + draw_fill(_tmp, rgba(0,0,0,0)); + tt_draw_string(_tmp, font, blur, blur + font_size, string, shadow_color); + blur_context_box(_tmp, blur); + free(_tmp); + draw_sprite(ctx, _tmp_s, left - blur, top - blur); + sprite_free(_tmp_s); + tt_draw_string(ctx, font, left, top + font_size, string, text_color); +}