Phase 11b: подложка для text overlay + сразу-видимый placeholder

User: "у него есть полупрозрачная подложка? у него правильный z-order?"

Z-order был ок (overlays draw'аются после layout.render). Но без bg
текст плохо читался на пёстром кадре — и до прихода MQTT overlay был
visible=0 (не виден вообще).

Изменения:
  - overlay.h: cfc_overlay_text_config_t расширена bg_alpha / bg_y/u/v / bg_pad.
    bg_alpha=0 — фон отключён (default).
  - overlay.c draw_text: если bg_alpha>0, перед blit'ом текста рисуем fill
    rect (atlas_w+2*pad) × (atlas_h+2*pad) с заданным цветом и alpha.
  - overlay.c update_text: пробрасывает bg-поля при апдейте.
  - mqtt_overlay: MqttOverlayCfg + JSON loader научились читать bg_alpha,
    bg_y/u/v, bg_pad, placeholder. Default bg = чёрный 160 alpha, pad 10.
  - MqttOverlayItem::start: overlay сразу visible=1 с placeholder (default "—"),
    reposition_overlay вызывается до получения MQTT — placeholder
    позиционируется в anchor сразу.

User'у теперь видна тёмная подложка с текстом в правом-нижнем углу даже
если sensor молчит.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 10:19:29 +01:00
parent 75271436f7
commit 88fa73f922
4 changed files with 69 additions and 4 deletions
@@ -50,6 +50,16 @@ struct MqttOverlayCfg {
int r = 255, g = 255, b = 255;
int alpha = 230;
std::string font_path = "/fonts/DejaVuSans-Bold.ttf";
/* Полупрозрачная подложка. bg_alpha=0 → отключено. */
int bg_alpha = 160;
int bg_y = 16, bg_u = 128, bg_v = 128; /* по умолчанию чёрный */
int bg_pad = 10;
/* Что показывать пока нет MQTT-данных. Пусто → overlay невидим до
* первого сообщения. По умолчанию "—" чтобы было видно что overlay
* жив, но данные ещё не пришли. */
std::string placeholder = "";
};
struct MqttBrokerCfg {
+8
View File
@@ -105,6 +105,14 @@ typedef struct cfc_overlay_text_config {
int r, g, b; /* sRGB цвет 0..255 */
int extra_alpha; /* 0..255 общий множитель прозрачности */
int visible; /* 0/1 — выводить ли */
/* Опциональный полупрозрачный фон (подложка) под текстом.
* bg_alpha = 0 → без фона (default)
* bg_alpha > 0 → fill rect (atlas_w + 2*bg_pad) × (atlas_h + 2*bg_pad)
* с цветом bg_y/u/v перед blit'ом текста.
* bg_pad чётный, default 8 если bg_alpha>0 и bg_pad==0. */
int bg_alpha; /* 0..255 (0 = отключено) */
int bg_y, bg_u, bg_v; /* BT.709 limited (Y=16..235, UV=16..240) */
int bg_pad; /* px padding вокруг текста */
} cfc_overlay_text_config_t;
/* Создать TEXT overlay. Открывает font через FreeType, рендерит строку