meow_svcd status 美化(117) + 按钮按住/点击样式+滑条黑残快照(118)
This commit is contained in:
1 parent
19a001f007
commit
07c556e907
7 files changed
+352
-43
No files matched your search
@@ -353,6 +353,49 @@ void meow_ui_fill_rect_alpha(int x, int y, int w, int h, uint32_t color, int alp
|
||||
#define MUI_HINT_H 5
|
||||
static int g_hint_last = 0; /* 上次画过的条长(清条时只清到它,避免残留) */
|
||||
|
||||
/* 顶部条区「快照恢复」:画条前把 [0..宽)×[hy..hy+MUI_HINT_H) 拍进小缓冲区;回缩/清空时
|
||||
* 回填快照还原「真实底色」而非 th->bg —— 全屏页面底=主题 accent,若填 th->bg(黑) 会在
|
||||
* accent 底上留下黑色残条(直到下次区域刷新才消失)。快照只在首现条时拍一次(后续 grow
|
||||
* 不再覆盖快照),每行/全长布局全保留;缓冲为一次性分配(宽×H 行,480×5×2B≈4.8KB)。 */
|
||||
static unsigned char *g_hint_snap = NULL; /* 快照(g_line×MUI_HINT_H 字节;NULL=未拍/分配失败) */
|
||||
static int g_hint_snap_y = 0; /* 快照行的起始 y(本次手势时的 hy) */
|
||||
|
||||
/* 拍下「顶部条区」当前 back_buf 内容(只在 g_hint_last==0 的首现条时调用)。 */
|
||||
static void hint_snapshot(void)
|
||||
{
|
||||
int hy = meow_ui_statusbar_height();
|
||||
if (hy < 0) hy = 0;
|
||||
g_hint_snap_y = hy;
|
||||
if (hy + MUI_HINT_H > g_yres) return; /* 越界:放弃(回缩走 bg 兜底) */
|
||||
size_t len = (size_t)MUI_HINT_H * (size_t)g_line;
|
||||
if (!g_hint_snap) {
|
||||
g_hint_snap = malloc(len);
|
||||
if (!g_hint_snap) return;
|
||||
}
|
||||
memcpy(g_hint_snap, g_fb + (size_t)hy * g_line, len);
|
||||
}
|
||||
|
||||
/* 从快照回填列区间 [x0,x1) 的 MUI_HINT_H 行(还原条下真实底色)。x0/x1 已夹到屏宽。 */
|
||||
static void hint_restore(int x0, int x1)
|
||||
{
|
||||
if (x1 <= x0) return;
|
||||
if (x0 < 0) x0 = 0;
|
||||
if (x1 > g_xres) x1 = g_xres;
|
||||
if (!g_hint_snap) { /* 无快照(分配失败):兜底填背景(旧行为) */
|
||||
const meow_theme *th = meow_theme_get();
|
||||
meow_ui_fill_rect(x0, g_hint_snap_y, x1 - x0, MUI_HINT_H, th->bg);
|
||||
return;
|
||||
}
|
||||
int bpp = g_bpp / 8;
|
||||
for (int r = 0; r < MUI_HINT_H; r++) {
|
||||
size_t row = (size_t)(g_hint_snap_y + r) * g_line;
|
||||
memcpy(g_fb + row + (size_t)x0 * bpp,
|
||||
g_hint_snap + (size_t)r * g_line + (size_t)x0 * bpp,
|
||||
(size_t)(x1 - x0) * bpp);
|
||||
}
|
||||
meow_gfx_mark_dirty(x0, g_hint_snap_y, x1 - x0, MUI_HINT_H); /* 标脏:调用方 flush_region 上屏 */
|
||||
}
|
||||
|
||||
void meow_ui_swipe_hint(int x)
|
||||
{
|
||||
if (!g_init_ok) return;
|
||||
@@ -361,20 +404,19 @@ void meow_ui_swipe_hint(int x)
|
||||
* 有状态栏(非全屏)→ y = 状态栏高度;收合(collapsed)→ y=提示线下缘
|
||||
* (MUI_SBAR_COLLAPSE_H,与提示线不重叠);无状态栏(全屏/隐藏)→ y=0。 */
|
||||
int hy = meow_ui_statusbar_height();
|
||||
/* 单一实现(与非全屏 Hello 完全一致,全屏仅 hy 不同):grow 画 0..x、shrunk 先清旧长
|
||||
* 再画 0..x、x<=0 清空。x<0 视为清空;条长上限=屏宽。 */
|
||||
/* 单一实现(与非全屏 Hello 完全一致,全屏仅 hy 不同):grow 画 0..x、shrunk 先把
|
||||
* 超出部分还原为快照、x<=0 整条还原。x<0 视为清空;条长上限=屏宽。条色仍取 th->fg。 */
|
||||
if (x > 0) {
|
||||
if (x > g_xres) x = g_xres;
|
||||
/* 往回滑(新长度 < 上次)时,先清掉「上次画到旧长度、但本次超出的部分」,
|
||||
* 否则条只增不减(右滑变长、左滑回缩实时可见)。 */
|
||||
if (g_hint_last > x) meow_ui_fill_rect(0, hy, g_hint_last, MUI_HINT_H, th->bg);
|
||||
/* 条色取主题前景(fg):fg 定义为与背景对比,能同时覆盖「非全屏(底=主题bg)」与
|
||||
* 「全屏 Hello 类(底=主题accent)」两种情况——accent 在 Hello 全屏 accent 底上同色不可见。 */
|
||||
if (g_hint_last == 0) hint_snapshot(); /* 首现条:拍下未污染区,供此后回填 */
|
||||
/* 往回滑(新长度 < 上次)时,把「上次画到旧长度、本次超出的 [x,old)」还原为快照
|
||||
* 真实底色(全屏 accent),而非填 th->bg —— 否则左滑回缩在 accent 底上漏黑。 */
|
||||
if (g_hint_last > x) hint_restore(x, g_hint_last);
|
||||
meow_ui_fill_rect(0, hy, x, MUI_HINT_H, th->fg);
|
||||
g_hint_last = x;
|
||||
} else if (g_hint_last > 0) {
|
||||
/* 手指回原点/抬手未达标/抬手达标:清掉此前画的条(填回背景色) */
|
||||
meow_ui_fill_rect(0, hy, g_hint_last, MUI_HINT_H, th->bg);
|
||||
/* 手指回原点/抬手未达标/抬手达标:整条还原为快照真实底色(全屏 accent 上无黑残) */
|
||||
hint_restore(0, g_hint_last);
|
||||
g_hint_last = 0;
|
||||
}
|
||||
/* 不发 flush:由调用方 meow_ui_flush_region(0,0,宽,6) 只刷顶部条 */
|
||||
@@ -832,6 +874,7 @@ void meow_ui_shutdown(void)
|
||||
if (g_fb_fd >= 0) close(g_fb_fd);
|
||||
if (g_back_buf) free(g_back_buf);
|
||||
if (g_dump_path) { free(g_dump_path); g_dump_path = NULL; }
|
||||
if (g_hint_snap) { free(g_hint_snap); g_hint_snap = NULL; }
|
||||
g_back_buf = NULL; g_fb = NULL; g_fb_mem = NULL;
|
||||
g_fb_fd = -1; g_init_ok = 0; g_mfont_ready = 0;
|
||||
dirty_reset();
|
||||
|
||||
Reference in new issue
Block a user