/* test_meow_ui_theme.c — 宿主验证 §8.1 顶级主题:MD3 × MIUIx 各 light/dark 四套配色 & 控件形态。 * * 用法:build 后跑 4 次(每次一个 style×mode 组合,dump 一张 PPM): * for s in 0 1; do for m in 0 1; do * MEOW_UI_DUMP=/tmp/meow_t_${s}_${m}.ppm ./test_meow_ui_theme $s $m * done; done * s: 0=MEOW_STYLE_MD3 1=MEOW_STYLE_MIUIX; m: 0=light 1=dark * * 编译(宿主 gcc,链真实 gfx/sys/theme/vol/log/widget/input/activity/dialog/ime + 打桩 font/global): * gcc -o test_meow_ui_theme test_meow_ui_theme.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_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 * * 验证要点:四套主题 primary/radius 各不相同(MD3 蓝 / MIUIx 橙 + 更大圆角), * 同 style 下 light/dark 的 surface 成对切换;图形用 MEOW_UI_DUMP 导出 PPM 目检。 */ #include "meow_ui.h" #include "meow_ui_internal.h" /* meow_gfx_fill_round / meow_ui_back_buf(真实像素断言) */ #include #include #include #include static meow_widget *g_w[16]; static int g_wn = 0; static void render_sample(const meow_theme *th) { int W = meow_ui_width(), H = meow_ui_height(); meow_ui_clear(th->bg); /* 卡片:surfaceContainerLow 底 + outlineVariant 圆角描边(radius_card) */ meow_gfx_fill_round(20, 56, W - 40, 132, th->radius_card, th->surfaceContainerLow); meow_ui_draw_rect_round(20, 56, W - 40, 132, th->radius_card, th->outlineVariant); meow_ui_text(36, 74, "THEME SAMPLE", th->font_title, th->onSurface); meow_ui_text(36, 116, "surfaceContainerLow/outline", th->font_body, th->onSurfaceVariant); char info[64]; snprintf(info, sizeof info, "primary=0x%06X radius=%d", th->primary, th->radius); meow_ui_text(36, 148, info, th->font_body, th->onSurfaceVariant); /* 文字行:onSurface / onSurfaceVariant 对比 */ meow_ui_text(20, 204, "onSurface text", th->font_body, th->onSurface); meow_ui_text(20, 232, "onSurfaceVariant dim", th->font_body, th->onSurfaceVariant); meow_ui_text(20, 260, "primary accent", th->font_body, th->primary); /* 控件(真实控件走主题 radius/spacing/stroke 形态,meow_widget_draw 内取 meow_theme_get) */ for (int i = 0; i < g_wn; i++) meow_widget_draw(g_w[i]); /* 滑杆:surfaceContainer 轨道 + primary 已选段(spacing/radius 来自主题) */ meow_gfx_fill_round(20, H - 90, W - 40, 8, 4, th->surfaceContainerHigh); meow_gfx_fill_round(20, H - 90, (W - 40) * 2 / 3, 8, 4, th->primary); /* 开关(开):primary 圆钮(radius=控件圆角) */ meow_gfx_fill_round(W - 90, H - 150, 52, 30, 15, th->primary); meow_gfx_fill_circle(W - 48, H - 135, 11, th->onPrimary); /* 错误色 sample */ meow_gfx_fill_round(20, H - 180, 120, 30, th->radius, th->errorContainer); meow_ui_text(36, H - 176, "error", th->font_body, th->onErrorContainer); (void)H; } int main(int argc, char **argv) { int style = argc > 1 ? atoi(argv[1]) : 0; /* 0=MD3 1=MIUIx */ int dark = argc > 2 ? atoi(argv[2]) : 1; /* 0=light 1=dark */ if (argc >= 2 && !strcmp(argv[1], "usage")) { fprintf(stderr, "usage: %s