sdk: 增量同步主仓新模块(box/anim/scroll/dispatch/listvirt/str/sb_icons/img)

subtree pull sdk 来自主仓 pub/sdk(主仓 commit 68ce46a 等)。新增:
- 布局引擎 meow_ui_box / 动画基座 meow_ui_anim / 滚动物理 meow_ui_scroll
- §6.4 事件分发形式化 / W_LISTVIEW 虚拟化多行 / meow_str 字符串资源 i18n
- sb_icons 动作图标扩充 + topbar 位图图标 / meow_img_downscale
- tools/ 图标生成脚本与 SVG 源
- 对应宿主 test_*.c 与 demo_box_scroll.c

build_sdk.sh 冲突解析:保留公开仓自包含版(vendored meow_font + -Iinclude -I.),
OBJS 手工并入 4 个新模块(meow_ui_box/anim/scroll/str)。保留 vendored meow_font.c/
meow_ipc.h/meow_font.h/meow_notif.h,剔除宿主测试二进制与编译产物。
This commit is contained in:
AskaEth committed 2026-09-02 09:08:51 +08:00
commit 4b094d62a5
56 files changed
+4327 -117

No files matched your search

+70 -1
View File
@@ -4,7 +4,7 @@
* 编译(宿主 gcc,链真实 gfx/sys/theme/vol/log/widget/input/activity/dialog/ime + 打桩 font/global):
* gcc -o test_meow_ui_widgets test_meow_ui_widgets.c test_host_stub.c \
* meow_ui_gfx.c meow_ui_sys.c meow_ui_theme.c meow_ui_vol.c meow_ui_log.c \
* meow_ui_widget.c meow_ui_input.c meow_ui_activity.c meow_ui_dialog.c meow_ui_ime.c \
* meow_ui_widget.c meow_ui_input.c meow_ui_activity.c meow_ui_dialog.c meow_ui_ime.c meow_ui_str.c \
* meow_ui_draw.c meow_ui_view.c meow_ui_img.c meow_notify_ipc.c stb_image.c \
* -I. -I../meow_launcherd -DMEOW_UI_HOST_TEST -pthread -lm
* 运行:MEOW_UI_DUMP=/tmp/b2.ppm ./test_meow_ui_widgets (可选,dump 屏幕)
@@ -201,6 +201,75 @@ int main(void)
assert(meow_topappbar_hit(tab_, 440, 28) == 1); /* 右缘动作 "Edit"(最右) */
printf("PASS topappbar: create/back/action/hit\n");
/* ---------- TopAppBar 位图动作图标(sb_icons[],Material Symbols)----------
* 文本项默认;set_item_icon 把动作项改为位图 → 绘制用 meow_gfx_blit_icon_ink(32px 槽
* 居中 + ink 垂直对齐栏中点),颜色取主题 onSurface(按压向栏底色淡 12%)。断言用
* back_buf 真实像素:画完读亮度,非空 ink + 按压变淡 + 图标项命中。 */
{
/* 用独立 topbar(y=300,避让其它控件);meow_widget_draw 自填 surfaceContainerHigh 底 */
meow_widget *ti = W(meow_topappbar_create(0, 300, 480, 56, ""));
int ai = meow_topappbar_add_action(ti, ""); /* 文本占位 → 转图标 */
assert(ai == 0);
assert(meow_topappbar_set_item_icon(ti, ai, MEOW_ICON_SETTINGS) == 0);
assert(meow_topappbar_set_item_icon(ti, 99, MEOW_ICON_SETTINGS) == -1); /* 越界 */
assert(meow_topappbar_set_item_icon(ti, ai, -1) == -1); /* 非法图标 */
assert(meow_topappbar_set_item_icon(NULL, ai, MEOW_ICON_SETTINGS) == -1);
meow_widget_draw(ti);
/* 右起动作格(SDK 位图动作项宽 48)命中:几何中心 → 项 0(最右图标) */
assert(meow_topappbar_hit(ti, 444, 328) == ai);
/* 图标 ink 采样:与栏底色有「绝对对比度」的像素即 ink(日/夜主题都适用——
* 日 = 深 onSurface 画浅底、夜 = 浅 onSurface 画深底,对比度都大)。 */
int x0 = 480 - 48, y0 = 300 + 10, x1 = 480, y1 = 300 + 46;
int bg_b, bg_g, bg_bgv;
rd_px(480 - 3, 302, &bg_b, &bg_g, &bg_bgv); /* 栏右上角 ≈ 背景 */
int bg_lum = (bg_b + bg_g + bg_bgv) / 3;
int sum_ink = 0, cnt_ink = 0;
for (int xx = x0; xx < x1; xx++) {
for (int yy = y0; yy < y1; yy++) {
int rr, gg, bb;
rd_px(xx, yy, &rr, &gg, &bb);
int lum = (rr + gg + bb) / 3;
int d = lum - bg_lum; if (d < 0) d = -d;
if (d > 20) { sum_ink += d; cnt_ink++; }
}
}
assert(cnt_ink > 4); /* 位图 ink 非空(为抗锯齿留余量) */
int before = sum_ink;
/* 按压态 → 图标向栏底色淡 12% → 对比度整体下降 */
meow_widget_set_state(ti, MEOW_WS_PRESSED, 1);
meow_widget_draw(ti);
sum_ink = 0;
for (int xx = x0; xx < x1; xx++) {
for (int yy = y0; yy < y1; yy++) {
int rr, gg, bb;
rd_px(xx, yy, &rr, &gg, &bb);
int lum = (rr + gg + bb) / 3;
int d = lum - bg_lum; if (d < 0) d = -d;
if (d > 20) sum_ink += d;
}
}
assert(sum_ink < before); /* 按压变淡 */
meow_widget_set_state(ti, MEOW_WS_PRESSED, 0);
printf("PASS topappbar: bitmap action icon draw/hit/pressed-fade (ink=%d->%d)\n",
before, sum_ink);
}
/* ---------- 状态栏图标 blit 路径回归(meow_gfx_blit_icon 同源核心)----------
* 证明 refactor 后状态栏路径(blit + 顶栏脏区)仍写非空像素;复用 SB_ICON_WIFI(0)。 */
{
meow_ui_fill_rect(0, 0, 480, 28, 0x000000); /* 清顶栏区为黑底 */
int bgr, bgg, bgb, bright = 0;
meow_gfx_blit_icon(0, 0, 0, 16, 0xFFFFFF, 14); /* idx0=WIFI 槽左缘 0 */
for (int xx = 0; xx < 32; xx++) {
for (int yy = 4; yy < 24; yy++) {
rd_px(xx, yy, &bgr, &bgg, &bgb);
if ((bgr + bgg + bgb) / 3 > 40) bright++;
}
}
assert(bright > 4); /* 状态栏 WiFi 位图 ink 非空(黑底 + 白前景 → 亮像素) */
printf("PASS statusbar: meow_gfx_blit_icon(0) draws non-empty ink (brt=%d)\n", bright);
}
/* ---------- NavigationBar ---------- */
meow_widget *nav = W(meow_navigationbar_create(0, 680, 480, 40));
int n0 = meow_navigationbar_add_item(nav, "Home");