From b1253e8462a81dc00473b68e96c286f5f3c846cb Mon Sep 17 00:00:00 2001 From: markmental Date: Sat, 28 Mar 2026 01:50:26 -0400 Subject: [PATCH] More theme tweaking --- src/theme.h | 28 +++++++++++++-- src/ui.c | 101 ++++++++++++++++++++++++++++++++++++---------------- src/ui.h | 1 + src/ui.o | Bin 31608 -> 32688 bytes 4 files changed, 97 insertions(+), 33 deletions(-) diff --git a/src/theme.h b/src/theme.h index 5e98f00..53d6233 100644 --- a/src/theme.h +++ b/src/theme.h @@ -32,7 +32,9 @@ typedef struct GuideTheme { SDL_Color row_active_mid; SDL_Color row_active_bottom; SDL_Color row_text; + SDL_Color row_subtext; SDL_Color row_active_text; + SDL_Color row_active_subtext; SDL_Color block_top; SDL_Color block_mid; SDL_Color block_bottom; @@ -142,7 +144,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_mid = {0x1e,0x3a,0x5f,0xff}, .row_active_bottom = {0x17,0x2c,0x49,0xff}, .row_text = {0xff,0xff,0xff,0xff}, + .row_subtext = {0xe8,0xee,0xf5,0xff}, .row_active_text = {0xff,0xd7,0x00,0xff}, + .row_active_subtext = {0xff,0xf2,0xb8,0xff}, .block_top = {0x5a,0x67,0x80,0xff}, .block_mid = {0x4a,0x55,0x68,0xff}, .block_bottom = {0x3f,0x49,0x59,0xff}, @@ -188,8 +192,10 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_top = {0x16,0x2a,0x4d,0xff}, .row_active_mid = {0x0f,0x34,0x60,0xff}, .row_active_bottom = {0x0a,0x1d,0x35,0xff}, - .row_text = {0xa0,0xa0,0xa0,0xff}, + .row_text = {0xd0,0xd0,0xd0,0xff}, + .row_subtext = {0xb8,0xb8,0xb8,0xff}, .row_active_text = {0xea,0xea,0xea,0xff}, + .row_active_subtext = {0xd2,0xd2,0xd2,0xff}, .block_top = {0x20,0x28,0x4b,0xff}, .block_mid = {0x1a,0x21,0x3e,0xff}, .block_bottom = {0x12,0x17,0x2e,0xff}, @@ -236,7 +242,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_mid = {0xb9,0x1c,0x1c,0xff}, .row_active_bottom = {0x7f,0x1d,0x1d,0xff}, .row_text = {0xff,0xff,0xff,0xff}, + .row_subtext = {0xe6,0xee,0xff,0xff}, .row_active_text = {0xff,0xcc,0x00,0xff}, + .row_active_subtext = {0xff,0xea,0x99,0xff}, .block_top = {0x39,0x7a,0xf0,0xff}, .block_mid = {0x25,0x63,0xeb,0xff}, .block_bottom = {0x1e,0x40,0xaf,0xff}, @@ -283,7 +291,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_mid = {0x4a,0x14,0x8c,0xff}, .row_active_bottom = {0x2d,0x0e,0x52,0xff}, .row_text = {0xe0,0xf7,0xfa,0xff}, + .row_subtext = {0xc8,0xee,0xf1,0xff}, .row_active_text = {0x00,0xff,0xf9,0xff}, + .row_active_subtext = {0x9c,0xff,0xfb,0xff}, .block_top = {0x8a,0x2b,0xbe,0xff}, .block_mid = {0x6a,0x1b,0x9a,0xff}, .block_bottom = {0x48,0x15,0x72,0xff}, @@ -329,8 +339,10 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_top = {0x12,0x3c,0x12,0xff}, .row_active_mid = {0x0f,0x38,0x0f,0xff}, .row_active_bottom = {0x08,0x1a,0x08,0xff}, - .row_text = {0x33,0xff,0x00,0xff}, - .row_active_text = {0x33,0xff,0x00,0xff}, + .row_text = {0x66,0xff,0x4a,0xff}, + .row_subtext = {0x52,0xd8,0x3e,0xff}, + .row_active_text = {0x9d,0xff,0x84,0xff}, + .row_active_subtext = {0x7a,0xed,0x66,0xff}, .block_top = {0x2a,0x66,0x2a,0xff}, .block_mid = {0x1b,0x4d,0x1b,0xff}, .block_bottom = {0x0f,0x2f,0x0f,0xff}, @@ -377,7 +389,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_mid = {0xff,0x8c,0x42,0xff}, .row_active_bottom = {0xd8,0x5f,0x10,0xff}, .row_text = {0xff,0xff,0xff,0xff}, + .row_subtext = {0xff,0xf2,0xd6,0xff}, .row_active_text = {0xff,0xff,0x00,0xff}, + .row_active_subtext = {0xff,0xf4,0xa8,0xff}, .block_top = {0x7b,0xe0,0xd9,0xff}, .block_mid = {0x4e,0xcd,0xc4,0xff}, .block_bottom = {0x23,0x92,0x93,0xff}, @@ -424,7 +438,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_mid = {0x8b,0x00,0x00,0xff}, .row_active_bottom = {0x4a,0x04,0x04,0xff}, .row_text = {0xff,0xf8,0xdc,0xff}, + .row_subtext = {0xf0,0xe5,0xc6,0xff}, .row_active_text = {0xff,0xd7,0x00,0xff}, + .row_active_subtext = {0xff,0xe9,0x8f,0xff}, .block_top = {0x62,0x13,0x13,0xff}, .block_mid = {0x4a,0x04,0x04,0xff}, .block_bottom = {0x2d,0x02,0x02,0xff}, @@ -471,7 +487,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_mid = {0x03,0x69,0xa1,0xff}, .row_active_bottom = {0x04,0x4d,0x7a,0xff}, .row_text = {0x0c,0x4a,0x6e,0xff}, + .row_subtext = {0x2c,0x6a,0x8b,0xff}, .row_active_text = {0xf0,0xf9,0xff,0xff}, + .row_active_subtext = {0xd8,0xf0,0xff,0xff}, .block_top = {0xec,0xf8,0xff,0xff}, .block_mid = {0xe0,0xf2,0xfe,0xff}, .block_bottom = {0xb8,0xe5,0xfb,0xff}, @@ -518,7 +536,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_mid = {0x4a,0x37,0x28,0xff}, .row_active_bottom = {0x2d,0x20,0x17,0xff}, .row_text = {0xff,0xf8,0xdc,0xff}, + .row_subtext = {0xf0,0xe3,0xc0,0xff}, .row_active_text = {0xda,0x8e,0x00,0xff}, + .row_active_subtext = {0xf1,0xc8,0x79,0xff}, .block_top = {0x90,0x61,0x34,0xff}, .block_mid = {0x6b,0x44,0x23,0xff}, .block_bottom = {0x4f,0x32,0x18,0xff}, @@ -565,7 +585,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .row_active_mid = {0xff,0x38,0x64,0xff}, .row_active_bottom = {0xa0,0x11,0x3b,0xff}, .row_text = {0xff,0xff,0xff,0xff}, + .row_subtext = {0xd8,0xf6,0xff,0xff}, .row_active_text = {0xff,0xf0,0x1f,0xff}, + .row_active_subtext = {0xff,0xf8,0x9d,0xff}, .block_top = {0x5b,0x20,0xce,0xff}, .block_mid = {0x3a,0x0c,0xa3,0xff}, .block_bottom = {0x1f,0x06,0x5b,0xff}, diff --git a/src/ui.c b/src/ui.c index 42ee424..f368dff 100644 --- a/src/ui.c +++ b/src/ui.c @@ -67,10 +67,15 @@ static SDL_Color readable_text_color(SDL_Color background) { return color_luma(background) < 120 ? COLOR_TEXT_LIGHT : COLOR_TEXT_DARK; } -static SDL_Color secondary_text_color(SDL_Color primary, SDL_Color background) { - SDL_Color secondary = blend_color(primary, background, 110); - secondary.a = 255; - return secondary; +static SDL_Color ensure_contrast(SDL_Color preferred, SDL_Color background) { + int diff = color_luma(preferred) - color_luma(background); + if (diff < 0) { + diff = -diff; + } + if (diff < 75) { + return readable_text_color(background); + } + return preferred; } static SDL_Texture *text_to_texture(SDL_Renderer *renderer, TTF_Font *font, const char *text, SDL_Color color, int *width, int *height) { @@ -279,6 +284,18 @@ static void draw_text_clipped(SDL_Renderer *renderer, SDL_RenderSetClipRect(renderer, had_clip ? &previous_clip : NULL); } +static void draw_text_shadowed(SDL_Renderer *renderer, + TTF_Font *font, + const char *text, + const SDL_Rect *clip_rect, + int x, + int y, + SDL_Color color, + SDL_Color shadow) { + draw_text_clipped(renderer, font, text, clip_rect, x + 1, y + 1, shadow); + draw_text_clipped(renderer, font, text, clip_rect, x, y, color); +} + static void fit_text_with_ellipsis(TTF_Font *font, const char *text, int max_width, char *out, size_t out_size) { int width = 0; size_t len; @@ -363,6 +380,8 @@ static void format_clock_label(char *buffer, size_t buffer_size, time_t now, int static void draw_timeline_header_cached(SDL_Renderer *renderer, const UiCache *cache, const GuideTheme *theme, SDL_Rect rect) { int segments = 4; + SDL_Color ribbon_text = ensure_contrast(theme->ribbon_text, theme->ribbon_mid); + SDL_Color ribbon_shadow = color_luma(theme->ribbon_mid) < 120 ? color_with_alpha(COLOR_BLACK, 255) : color_with_alpha(COLOR_TEXT_LIGHT, 255); draw_beveled_bar(renderer, &rect, @@ -375,7 +394,12 @@ static void draw_timeline_header_cached(SDL_Renderer *renderer, const UiCache *c for (int i = 0; i < segments; ++i) { int x = rect.x + (rect.w * i) / segments; int centered_x = x - cache->timeline_labels[i].width / 2; - draw_cached_text(renderer, &cache->timeline_labels[i], centered_x, rect.y + 10); + SDL_Rect shadow_dst = {centered_x + 1, rect.y + 11, cache->timeline_labels[i].width, cache->timeline_labels[i].height}; + SDL_Rect text_dst = {centered_x, rect.y + 10, cache->timeline_labels[i].width, cache->timeline_labels[i].height}; + SDL_SetTextureColorMod(cache->timeline_labels[i].texture, ribbon_shadow.r, ribbon_shadow.g, ribbon_shadow.b); + SDL_RenderCopy(renderer, cache->timeline_labels[i].texture, NULL, &shadow_dst); + SDL_SetTextureColorMod(cache->timeline_labels[i].texture, ribbon_text.r, ribbon_text.g, ribbon_text.b); + SDL_RenderCopy(renderer, cache->timeline_labels[i].texture, NULL, &text_dst); set_draw_color(renderer, theme->grid_line); SDL_RenderDrawLine(renderer, x, rect.y + rect.h - 2, x, rect.y + rect.h + 5 * 76); } @@ -432,11 +456,14 @@ static void draw_info_panel(SDL_Renderer *renderer, time_t end_time; double program_seek; const ProgramEntry *program; + SDL_Color panel_text; if (!rect || !selected_channel) { return; } + panel_text = ensure_contrast(theme->panel_text, theme->panel_fill); + draw_panel_shadow(renderer, rect); draw_rounded_top_panel(renderer, rect, theme->panel_fill, theme->panel_border, theme->rounded_radius > 0 ? theme->rounded_radius : 8); accent = (SDL_Rect){rect->x + 1, rect->y + 1, rect->w - 2, 38}; @@ -460,10 +487,10 @@ static void draw_info_panel(SDL_Renderer *renderer, selected_channel->description[0] != '\0' ? selected_channel->description : "Local programming lineup."); clip_rect = (SDL_Rect){rect->x + 16, rect->y + 12, rect->w - 32, rect->h - 24}; - draw_text_clipped(renderer, fonts->large, selected_channel->name, &clip_rect, rect->x + 18, rect->y + 44, theme->panel_text); - draw_text_clipped(renderer, fonts->medium, program->program_title, &clip_rect, rect->x + 18, rect->y + 88, theme->panel_text); - draw_text_clipped(renderer, fonts->small, time_range, &clip_rect, rect->x + 18, rect->y + 124, theme->panel_text); - draw_text_clipped(renderer, fonts->small, description, &clip_rect, rect->x + 18, rect->y + 148, theme->panel_text); + draw_text_clipped(renderer, fonts->large, selected_channel->name, &clip_rect, rect->x + 18, rect->y + 44, panel_text); + draw_text_clipped(renderer, fonts->medium, program->program_title, &clip_rect, rect->x + 18, rect->y + 88, panel_text); + draw_text_clipped(renderer, fonts->small, time_range, &clip_rect, rect->x + 18, rect->y + 124, panel_text); + draw_text_clipped(renderer, fonts->small, description, &clip_rect, rect->x + 18, rect->y + 148, panel_text); } static void draw_grid_background(SDL_Renderer *renderer, const GuideTheme *theme, const SDL_Rect *grid_rect, int row_height, double pixels_per_minute) { @@ -475,8 +502,10 @@ static void draw_grid_background(SDL_Renderer *renderer, const GuideTheme *theme for (int minute = 0; minute <= 90; minute += 30) { int x = GUIDE_X_START + (int) (minute * pixels_per_minute); - set_draw_color(renderer, theme->grid_line); + SDL_Color strong_line = ensure_contrast(theme->grid_line, theme->background_mid); + set_draw_color(renderer, strong_line); SDL_RenderDrawLine(renderer, x, grid_rect->y, x, grid_rect->y + grid_rect->h); + SDL_RenderDrawLine(renderer, x + 1, grid_rect->y, x + 1, grid_rect->y + grid_rect->h); } for (int row = 0; row <= GUIDE_VISIBLE_ROWS; ++row) { @@ -593,14 +622,15 @@ void ui_render_guide(SDL_Renderer *renderer, draw_video(renderer, video_texture, texture_width, texture_height, preview); draw_status_bar(renderer, fonts->medium, theme, selected_channel, &status_bar, now_wall); - if (cache->timeline_label_slot != now_wall / 60) { + if (cache->timeline_label_slot != now_wall / 60 || cache->timeline_theme != theme) { char label[32]; for (int i = 0; i < 4; ++i) { format_clock_label(label, sizeof(label), now_wall, (int) ((TIMELINE_VISIBLE_SECONDS / 60.0 / 4) * i)); text_texture_destroy(&cache->timeline_labels[i]); - text_texture_init(&cache->timeline_labels[i], renderer, fonts->small, label, theme->ribbon_text); + text_texture_init(&cache->timeline_labels[i], renderer, fonts->small, label, COLOR_TEXT_LIGHT); } cache->timeline_label_slot = now_wall / 60; + cache->timeline_theme = theme; } draw_timeline_header_cached(renderer, cache, theme, header_row); draw_grid_background(renderer, theme, &grid, row_height, pixels_per_minute); @@ -653,6 +683,15 @@ void ui_render_guide(SDL_Renderer *renderer, SDL_Rect block = {guide_x_start, timeline_rect.y + 4, 48, timeline_rect.h - 8}; SDL_Rect title_rect = {block.x + 8, block.y + 8, block.w - 16, block.h - 16}; char title[128]; + SDL_Color row_primary = ensure_contrast(is_selected ? theme->row_active_text : theme->row_text, + is_selected ? theme->row_active_mid : theme->row_mid); + SDL_Color row_secondary = ensure_contrast(is_selected ? theme->row_active_subtext : theme->row_subtext, + is_selected ? theme->row_active_mid : theme->row_mid); + SDL_Color block_text = ensure_contrast(is_selected ? theme->block_active_text : theme->block_text, + is_selected ? theme->block_active_mid : theme->block_mid); + SDL_Color block_shadow = color_luma(is_selected ? theme->block_active_mid : theme->block_mid) < 120 + ? color_with_alpha(COLOR_BLACK, 255) + : color_with_alpha(COLOR_TEXT_LIGHT, 255); if (!program) { continue; @@ -665,27 +704,28 @@ void ui_render_guide(SDL_Renderer *renderer, title_rect = (SDL_Rect){block.x + 8, block.y + 8, block.w - 16, block.h - 16}; if (is_selected) { - draw_text_clipped(renderer, fonts->medium, channel->name, &sidebar, 20, row_rect.y + 12, theme->row_active_text); + draw_text_shadowed(renderer, fonts->medium, channel->name, &sidebar, 20, row_rect.y + 12, row_primary, color_with_alpha(COLOR_BLACK, 255)); { char number[16]; snprintf(number, sizeof(number), "%d", channel->number); - draw_text_clipped(renderer, fonts->medium, number, &sidebar, 176, row_rect.y + 12, theme->row_active_text); + draw_text_shadowed(renderer, fonts->medium, number, &sidebar, 176, row_rect.y + 12, row_primary, color_with_alpha(COLOR_BLACK, 255)); } } else { - draw_text_clipped(renderer, fonts->medium, channel->name, &sidebar, 20, row_rect.y + 12, theme->row_text); + draw_text_shadowed(renderer, fonts->medium, channel->name, &sidebar, 20, row_rect.y + 12, row_primary, color_with_alpha(COLOR_BLACK, 255)); { char number[16]; snprintf(number, sizeof(number), "%d", channel->number); - draw_text_clipped(renderer, fonts->medium, number, &sidebar, 176, row_rect.y + 12, theme->row_text); + draw_text_shadowed(renderer, fonts->medium, number, &sidebar, 176, row_rect.y + 12, row_primary, color_with_alpha(COLOR_BLACK, 255)); } } - draw_text_clipped(renderer, - fonts->small, - program->file_name, - &sidebar, - 20, - row_rect.y + 38, - secondary_text_color(theme->row_text, is_selected ? theme->row_active_mid : theme->row_mid)); + draw_text_shadowed(renderer, + fonts->small, + program->file_name, + &sidebar, + 20, + row_rect.y + 38, + row_secondary, + color_with_alpha(COLOR_BLACK, 255)); SDL_RenderSetClipRect(renderer, &clip); draw_beveled_bar(renderer, @@ -700,13 +740,14 @@ void ui_render_guide(SDL_Renderer *renderer, title_rect.w, title, sizeof(title)); - draw_text_clipped(renderer, - is_selected ? fonts->medium : fonts->small, - title, - &title_rect, - title_rect.x, - title_rect.y, - is_selected ? theme->block_active_text : theme->block_text); + draw_text_shadowed(renderer, + is_selected ? fonts->medium : fonts->small, + title, + &title_rect, + title_rect.x, + title_rect.y, + block_text, + block_shadow); SDL_RenderSetClipRect(renderer, NULL); } } diff --git a/src/ui.h b/src/ui.h index 36af144..c26f57f 100644 --- a/src/ui.h +++ b/src/ui.h @@ -42,6 +42,7 @@ typedef struct UiCache { UiTextTexture footer_title; UiTextTexture *timeline_labels; time_t timeline_label_slot; + const GuideTheme *timeline_theme; UiChannelCache *channels; int channel_count; } UiCache; diff --git a/src/ui.o b/src/ui.o index bff4a1d3f85e7ba684327937f9eaab7a8933b7e6..ca7fc814a21c3e3a6cdc6b7821c63e5464502cee 100644 GIT binary patch literal 32688 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

    +&%*ZzyonkT&cZ)1qc(S}8L;qffm;K?!g~ZB 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 STzO@MRp`%BS$d5u|9=4BZ-6QQ